Sign inTry it

Search Ubuntu packages.

Searches the Ubuntu package archive like its package search page: one line per matching package and Ubuntu release, with the release name, the package page link and the section, description, version and architectures as printed on the page. Exact hits come first, then other hits. First results page only. Returns an empty list when nothing matches.

No reports yetRead-only, no login
Site
Ubuntu Packages, United Kingdom
Version
v1
Runs, last 7 days
No reports yet
sha256
b1c019ba8fbe…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Search Ubuntu packages.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "packages.ubuntu.com/search-packages",
    "params": {
      "query": "htop"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/search?keywordsUbuntu package search /search?keywords=…; read-only GET. Results are li items inside #psearchres, each linking to the package page of one release (a.resultlink) and printing section, description and version.

Parameters

from your agent
querystringrequiredPackage name or keyword, e.g. 'htop', 'git', 'curl'

Returns

to your agent
packagesobject[]name, release, summary, url
querystring

Where it can send

  • packages.ubuntu.com

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.packages) > `0`
  • length(output.packages[?starts_with(url, 'https://packages.ubuntu.com/')]) == length(output.packages)
  • length(output.packages[?name != `null`]) == length(output.packages)
  • length(output.packages[?release != `null`]) == length(output.packages)

Raw recipe

Served as canonical JSON from /api/v1/recipes/packages.ubuntu.com/search-packages, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/packages.ubuntu.com/search-packages | shasum -a 256
# b1c019ba8fbeac7b0c91a63ab349f09fad106447f08e3a641a293150ec641827
packages.ubuntu.com/search-packages.json, v1
{
  "description": "Searches the Ubuntu package archive like its package search page: one line per matching package and Ubuntu release, with the release name, the package page link and the section, description, version and architectures as printed on the page. Exact hits come first, then other hits. First results page only. Returns an empty list when nothing matches.",
  "effect": "read",
  "id": "packages.ubuntu.com/search-packages",
  "keywords": [
    "ubuntu",
    "ubuntu packages",
    "packages.ubuntu.com",
    "deb",
    "debian",
    "apt",
    "linux",
    "package",
    "packages",
    "software",
    "repository",
    "archive",
    "jammy",
    "noble"
  ],
  "output": {
    "schema": {
      "properties": {
        "packages": {
          "items": {
            "properties": {
              "name": {
                "description": "Source package name, e.g. 'htop'",
                "type": "string"
              },
              "release": {
                "description": "Ubuntu release, e.g. 'noble (24.04LTS)'",
                "type": "string"
              },
              "summary": {
                "description": "Section, description, version and architectures for this release, as one line",
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "release",
              "url"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "packages"
      ],
      "type": "object"
    },
    "value": "{query: params.query, packages: steps.search.packages[?href != `null` && release != `null`].{name: split(href, '/')[2], release: release, summary: summary || `null`, url: join('', ['https://packages.ubuntu.com', href])}}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "query": {
        "description": "Package name or keyword, e.g. 'htop', 'git', 'curl'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "har",
    "notes": "GET /search?keywords=<query> answers 200 HTML. Results are li items in #psearchres (under the 'Exact hits' and 'Other hits' headings): a.resultlink holds the release and the package path /<release>/<name>. The line text gives section, description and version. Only the result list is read.",
    "recorded_at": "2026-11-08T16:22:40.000Z",
    "recorded_by": "wield-forge (claude-haiku agent)"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "GB",
    "id": "packages.ubuntu.com",
    "language": "en",
    "name": "Ubuntu Packages",
    "origin": "https://packages.ubuntu.com",
    "origins": [
      "https://packages.ubuntu.com"
    ]
  },
  "steps": [
    {
      "description": "Ubuntu package search /search?keywords=…; read-only GET. Results are li items inside #psearchres, each linking to the package page of one release (a.resultlink) and printing section, description and version.",
      "expect": {
        "assert": "status == `200` && contains(body, 'Package Search Results')",
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "html_items": {
          "packages": {
            "fields": {
              "href": {
                "attr": "href",
                "selector": "a.resultlink"
              },
              "release": {
                "selector": "a.resultlink"
              },
              "summary": {
                "selector": ":scope"
              }
            },
            "max": 100,
            "selector": "#psearchres ul > li"
          }
        }
      },
      "id": "search",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "keywords": "{{params.query}}"
        },
        "url": "/search"
      }
    }
  ],
  "task": "Search Ubuntu packages",
  "tos": {
    "notes": "Not reviewed. One search page per call, the same page a visitor loads. The site's terms on automated access were not checked.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.packages) > `0`",
      "length(output.packages[?starts_with(url, 'https://packages.ubuntu.com/')]) == length(output.packages)",
      "length(output.packages[?name != `null`]) == length(output.packages)",
      "length(output.packages[?release != `null`]) == length(output.packages)"
    ],
    "example_params": {
      "query": "htop"
    },
    "max_ms": 5000
  },
  "version": 1
}