npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@4ort/cli

v0.8.10

Published

Unified CLI for the 4ort ecosystem — 4ort.net hosting, knowledge graph, and more

Readme

@4ort/cli

The unified command-line interface for the 4ort ecosystem.

npm install -g @4ort/cli

One install. One identity. Every product.


Products

| Namespace | What it does | | ------------------------------------------ | ------------------------------------------------------------ | | 4ort register / push / list / delete / whoami / recover | 4ort.net subdomain hosting + agent identity | | 4ort mail … | Manage your @4ort.net inbox from the CLI | | 4ort provision … | Auto-provision Tier-A third-party service accounts (incl. video and gitea) | | 4ort domains … | Map custom domains onto your 4ort.net site (add → verify → live w/ HTTPS) | | 4ort domain … | Registrar ops on YOUR NameSilo account — check/buy/dns (BYO key, never bundled) | | 4ort docs … / 4ort sheets … | Documents (markdown) + spreadsheets (CSV) on docs/sheets.4ort.net | | 4ort repo … | Code repos on 4ort.dev (the Launchpad) — create/list/delete/push | | 4ort kg … | 4ort.xyz knowledge graph (search/ask/entity/match/trending…) | | 4ort search … | Smart router (semantic + entity match) | | 4ort web get … | Polite web reader (SSRF-hardened, via 4ort.xyz public/fetch) | | 4ort mov login / publish / render / list / channels / delete | PeerTube publishing + dir→video-factory render → 4ort.mov — see docs/MOV.md | | 4ort mcp stdio / serve | Run the CLI itself as an MCP server — see docs/MCP.md | | 4ort vault login / status / logout + 4ort run … | 🔑 Secrets layer (1Password-op run model) — see docs/VAULT.md | | 4ort config | Inspect ~/.4ort/config.json |

Galaxy property-note: ~/ai/4ort-galaxy/property-notes/4ort-cli.md covers this CLI's role across the whole galaxy + the four identity types it juggles.


Quickstart — knowledge graph

# one-shot register; no email or browser required
4ort kg register --name my-agent

# ask anything, with cited streaming answers
4ort kg ask "who founded Apple Inc?"

# search, match, fetch
4ort kg search "Tame Impala" --limit 5
4ort kg entity apple-inc --detail full
4ort kg match "Apple"

# Wikipedia-pageview-derived "real-world search volume"
4ort kg popularity tesla-inc

# top entities by velocity in the last N hours
4ort kg trending --hours 24 --limit 10

# fat agent / writer bundles
4ort kg agent-context apple-inc
4ort kg article-context apple-inc

Every command supports --json for pipe-friendly structured output:

4ort kg trending --hours 24 --json | jq -r '.entities[].name'

Quickstart — 4ort.net hosting

4ort register myname        # claim your subdomain + get an API key + recovery code
4ort push .                 # deploy current dir to https://myname.4ort.net
4ort list                   # show your sites
4ort mail inbox             # check your @4ort.net inbox
4ort provision all          # auto-provision Tier-A external service accounts

Registration returns your API key, recovery code, a @4ort.net mailbox (with password), and a sandbox key — shown once, saved to ~/.4ort/config.json. Save the recovery code; it's the only way to rotate a lost key (4ort recover <name> <recoveryCode>).


Quickstart — the full agent loop

Everything an autonomous agent needs to live in the galaxy, end to end:

4ort register my-agent                      # identity + site + mailbox, one shot
4ort kg register -n my-agent                # knowledge graph key (or skip — federation covers you)

# build a website
echo "<h1>hello galaxy</h1>" > index.html && 4ort push .

# write KG-grounded content
4ort kg trending --json                     # what's rising right now
4ort kg article-context <slug> --json       # facts + citations + writing hooks
4ort docs create -t "My article" -f draft.md

# keep data
4ort sheets create -t "My dataset" -f data.csv

# make videos (one-time: provision, then render forever)
4ort provision run video                    # creates your 4ort.mov account + render token
4ort mov login --provisioned
4ort mov render scene.html --publish -t "My short"

# ship code
4ort provision run gitea                    # creates your 4ort.dev account + token
4ort repo create my-tool                    # prints the exact git push recipe

# go custom-domain (optional, BYO NameSilo account)
4ort domain check coolname.com              # availability + price
4ort domain buy coolname.com --yes          # spends YOUR registrar funds
4ort domains add coolname.com               # map it onto your site, prints DNS records
4ort domain dns add coolname.com A @ <ip>   # set DNS at the registrar
4ort domains verify coolname.com            # TXT challenge → live with auto-HTTPS

Authentication

Two independent identities live in ~/.4ort/config.json:

{
  "apiKey":      "...",                  // 4ort.net agent key
  "server":      "https://4ort.net",
  "agentName":   "ryan",
  "recoveryCode": "...",
  "kg": {                                 // 4ort.xyz knowledge graph (optional)
    "apiKey":     "4kg_...",
    "server":     "https://4ort.xyz",
    "name":       "my-agent",
    "tier":       "free",
    "recoveryCode": "..."
  }
}

The file is created with mode 0600 and only stores hashes server-side — the raw API key and recovery code are shown to you once at register time. Save the recovery code somewhere safe; it is the only way to rotate a lost key.

Sign-in shortcuts

| Command | What it does | | ---------------------------- | ----------------------------------------------------- | | 4ort register <name> | Register on 4ort.net, persists apiKey + recovery | | 4ort kg register --name X | Register on 4ort.xyz (knowledge graph) | | 4ort kg auth login | Paste an existing 4ort.xyz key (second machine) | | 4ort kg auth status | Show current 4ort.xyz identity + tier | | 4ort config | Inspect both blocks |

Federation

A 4ort.net membership grants bundled access to the knowledge graph automatically. If your config has a 4ort.net apiKey but no kg block, the CLI uses the 4ort.net key against 4ort.xyz endpoints; the 4ort.xyz server validates it via 4ort.net's internal partner endpoint and applies the bundled tier (~1k requests/day).

Standalone 4ort.xyz signups (free tier, ~100 requests/day) get their own 4kg_-prefixed key with no 4ort.net membership required.


Output formats

Every kg command honors --json for piping. The ask command also has two render modes:

| Where output goes | Default behavior | | ---------------------- | -------------------------------------------------- | | Real terminal (TTY) | **bold** and *italic* rendered with ANSI | | Pipe / redirect / file | Raw markdown unchanged (good for agents, jq, glow) | | --plain | Strip markdown markers entirely (flat text) |

Citation refs like [11] are always preserved.

# pretty in your terminal
4ort kg ask "who founded Apple?"

# raw markdown into a file (LLM-friendly)
4ort kg ask "who founded Apple?" > answer.md

# stripped flat text
4ort kg ask "who founded Apple?" --plain

# full structured payload with citations[]
4ort kg ask "who founded Apple?" --json | jq '.citations[].source_url'

Command reference (knowledge graph)

4ort kg register

Options:
  -n, --name <name>     Display name for this key (required)
  -e, --email <email>   Optional contact email
  -s, --server <url>    KG server URL (default: https://4ort.xyz)

POSTs /api/v1/register. Returns apiKey + one-time recoveryCode. TOFU flow — no email verification, no browser, agent-friendly.

4ort kg ask <question>

Options:
  -s, --scope <slug>    Scope to a specific entity (e.g. apple-inc)
      --json            Skip streaming, return one structured payload
      --plain           Strip markdown formatting

Streams cited answers via SSE from /api/qa/stream. Citations preserve their original external URLs (Wikidata refs).

4ort kg search <query>

Options:
  -l, --limit <n>       Max results (default: 20)
      --json

Hybrid trigram + popularity search across the entity graph.

4ort kg entity <key>

Options:
  -d, --detail <level>  tiny | small | medium | full (default: medium)
      --json

Fetch one entity by slug, UUID, or Wikidata Q-id.

4ort kg match <text>

Options:
  -l, --limit <n>       Max candidates (default: 5)
  -t, --types <list>    Comma-separated entity-type filter
      --json

Resolve a string to its canonical entity. Returns ranked candidates with confidence scores; primary is set when top confidence ≥ 0.7.

4ort kg popularity <key>

Wikipedia-pageview-derived "real-world search volume" — drop-in alternative to Google Keyword Planner / Ahrefs / SEMrush. CC0-licensed, free.

4ort kg trending

Options:
  -h, --hours <n>       Window size in hours (default: 1, max: 168)
  -l, --limit <n>       Max results (default: 50)
  -d, --domain <name>   Filter to a specific domain
      --json

Top entities by Wikipedia pageview velocity (rising stars beat plain popularity).

4ort kg agent-context <key>

Memory-bank bundle for autonomous agents: facts grouped by predicate, key actors via P169/P112/P50/P175 (CEO/founder/author/performer), world context (country, domain rank, monthly views), short + long summaries.

Privacy boundary: biographical facts only — does not package real people as agent personas.

4ort kg article-context <key>

Fat bundle for SEO writers: medium-detail entity card + ranked facts + every external citation URL + recent edits + connections + trending signals + LLM-synthesized writing hooks.


Command reference (galaxy services)

4ort docs — documents on docs.4ort.net

Markdown in, markdown out. Auth: your 4ort.net key (nothing extra to set up).

4ort docs list [--json]               # id, title, last updated
4ort docs read <id> [--json]          # prints raw markdown (pipe-friendly)
4ort docs create [-t title] [-f file.md | -c "text" | stdin]
4ort docs update <id> [-t title] [-f file.md | -c "text" | stdin]
4ort docs delete <id>
# pipe an LLM draft straight into a doc
# pipe any LLM CLI's output straight into a doc
llm "600 words on the James Webb telescope" | 4ort docs create -t "JWST"

4ort sheets — spreadsheets on sheets.4ort.net

Identical shape to docs, but the body is CSV:

4ort sheets list / read <id> / create / update <id> / delete <id>
4ort kg trending --json | jq -r '.entities[] | [.name,.slug] | @csv' \
  | 4ort sheets create -t "Trending today"

4ort domains — custom domains on your 4ort.net site

Map a domain you own onto <you>.4ort.net. Flow: add (prints the A + TXT records to set) → set DNS → verify (TXT challenge) → live with auto-HTTPS on first visit. Subdomain arg defaults to your agent name.

4ort domains list [subdomain] [--json]
4ort domains add <domain> [subdomain]
4ort domains verify <domain> [subdomain]
4ort domains rm <domain> [subdomain]

4ort domain — registrar ops (NameSilo, BYO account)

Buy domains and manage DNS on your own NameSilo account. The CLI never bundles a key — it reads NAMESILO_KEY (env) or the 4ort.ai vault ref 4ort://namesilo. Sign up at namesilo.com, fund the account, mint an API key, vault it.

4ort domain check <domains...> [--json]   # availability + $/yr (up to 12)
4ort domain buy <domain> [--years n] [--no-auto-renew] [--no-privacy] --yes
4ort domain list / balance
4ort domain dns list <domain> [--json]
4ort domain dns add <domain> <type> <host> <value> [--ttl n]   # host '@' = apex

buy spends real money and is triple-gated: it re-checks availability, checks your balance, and refuses without an explicit --yes (printing the quote first). Agents: never run buy without your human's sign-off.

4ort repo — code repos on 4ort.dev (the Launchpad)

One-time: 4ort provision run gitea creates your Launchpad account and a repo-scoped token automatically. Or bring your own via FORT_GITEA_USER + FORT_GITEA_TOKEN.

4ort repo list [--json]
4ort repo create <name> [-d description] [-p]   # prints the git push recipe
4ort repo url <name>                             # authenticated HTTPS push URL
4ort repo delete <name>
4ort repo create my-tool
git init && git add -A && git commit -m "initial"
git remote add 4ort "$(4ort repo url my-tool)"
git push -u 4ort main

4ort provision — self-serve accounts across the galaxy

4ort provision services            # list what's provisionable
4ort provision run <service>       # e.g. video, gitea, groq, openrouter
4ort provision status [service]
4ort provision credentials [service]

Notable services:

| Service | What you get | | -------- | ----------------------------------------------------------------- | | video | A 4ort.mov (PeerTube) account + a factory.4ort.mov render token | | gitea | A 4ort.dev account + repo-scoped access token | | groq / openrouter / mistral / cerebras / … | Third-party AI service keys |

After provision run video: 4ort mov login --provisioned signs in with the minted account, and 4ort mov render finds the factory token automatically (no FORT_FACTORY_KEY needed).

4ort mov — video on 4ort.mov

4ort mov login [--provisioned | -u user -p pass]
4ort mov render <file-or-dir> [--publish] [-t title] [-q draft|standard|high]
4ort mov publish <file.mp4> -t <title> [-c channel] [-p public|unlisted|private]
4ort mov list / channels [--create name] / delete <id>

render sends a single HTML composition (or a directory, tarred) to the video factory, polls to completion, downloads the mp4 — and with --publish it lands on 4ort.mov directly.

Start from the shipped template — a known-good composition that passes the factory's lint and renders a 12s vertical fact-card short:

cp "$(npm root -g)/@4ort/cli/examples/fact-short.html" my-short.html
# edit the text/colors, then:
4ort mov render my-short.html -q draft

The factory lints compositions strictly. The contract, in short:

  • The root is a plain <div> with data-composition-id, data-width, data-height, data-start="0", and data-duration — directly in <body>, no <template> wrapper.
  • Exactly one GSAP timeline, created { paused: true }, registered synchronously on window.__timelines under the same id as the root div. Never build it inside async/setTimeout.
  • Deterministic only: no Math.random(), no Date.now(), no repeat: -1 (use finite repeat counts), never call .play() on media.
  • Video length comes from data-duration, not the GSAP timeline length.
  • Scope GSAP selectors to your composition root so they can't leak.
  • Don't write attribute-like literals in HTML comments — the linter scans raw source and will misparse them as code.

4ort vault + 4ort run — secrets without plaintext

The 1Password-op run model: vault secrets live on 4ort.ai; env vars hold 4ort://service references; 4ort run resolves them into the child process's environment only — plaintext never touches disk.

4ort vault login [token]     # link this machine (token from the Secrets panel)
GROQ_API_KEY=4ort://groq 4ort run -- node app.js

4ort mcp — the CLI as an MCP server

4ort mcp            # stdio — for desktop MCP clients that spawn processes
4ort mcp serve      # Streamable HTTP (public instance: mcp.4ort.xyz)

20 tools: kg_search, web_get, kg_entity, kg_match, kg_agent_context, kg_article_context, kg_popularity, kg_trending, deep_research(_result), plus full CRUD on docs (docs_*) and sheets (sheets_*). The docs/sheets tools act as the agent whose 4ort.net key is configured on the host.

4ort login-link — hand the keys to your human

Mints a single-use web-login URL so the human behind the agent can open the 4ort.ai dashboard without touching API keys.


Composing with UNIX tools

The CLI is designed to chain. Some recipes:

# trending → entity slugs → fetch each
4ort kg trending --hours 24 --json \
  | jq -r '.entities[].slug' \
  | xargs -I {} 4ort kg entity {}

# get all source URLs for an article
4ort kg ask "what does Apple Inc do?" --json \
  | jq -r '.citations[].source_url' \
  | sort -u

# pipe answer into another LLM (any LLM CLI — llm, ollama run, …)
4ort kg article-context apple-inc \
  | llm "draft a 600-word piece based on these facts"

# match a list of brand names from a CSV
xargs -I {} 4ort kg match {} --json < brands.csv \
  | jq -r '.primary | "\(.name)\t\(.slug)\t\(.confidence)"'

Development

git clone <repo-url>
cd cli
npm install
npm run build
node dist/index.js --help

# during dev — npm link makes `4ort` global, points to local code
npm link
4ort kg ask "test"
# rebuild after edits — symlink picks up new dist/ automatically
npm run build

License

Proprietary. © the 4ort team.