{"slug": "show-hn-transit-subway-maps-of-your-data", "title": "Show HN: Transit – subway maps of your data", "summary": "Developer Israel Vicars released Transit, a local toolkit of Agent Skills that renders requests, GitHub Actions CI runs, and coding-agent sessions as animated subway-style maps, with lines for the main unit of work and stations for individual events. Transit accepts OpenTelemetry/OTLP, Datadog, PostHog, AWS X-Ray, and Grafana Tempo trace data, marks slow work as DELAY and failures as SERVICE ALERT, and outputs a self-contained HTML file plus a one-line verdict such as \"email failed after 671 ms: SMTP timeout · SERVICE ALERT · 23 hops.\" The skills install across Claude Code, Codex, and Cursor with a single npx command, and by default agent-transit retains only tool names, timing, status, target basenames, and agent source, keeping prompts, code, commands, output, and arguments out of the map.", "body_md": "**Subway maps of your data.**\n\nTransit is a local toolkit of Agent Skills that turns requests, CI runs, and coding-agent sessions into animated transit maps. Lines show the main unit of work, stations show individual events, DELAY marks slow work, and SERVICE ALERT marks an error or other failure.\n\n**Drop a trace in Slack.** Ask for a map to share and you get one self-contained HTML file named after what broke, like `checkout-email-service-alert.html`, plus a one-line verdict computed from the data and ready to paste: `email failed after 671 ms: SMTP timeout · SERVICE ALERT · 23 hops`. Drag the file into a channel. In Slack desktop and iOS it opens as the interactive page, paused on the failing hop with its details showing. Try the [sample page](https://htmlpreview.github.io/?https://github.com/israelvicars/transit/blob/main/docs/samples/checkout-email-service-alert.html) (the same file you'd drop in Slack). GIF and MP4 are teasers for a feed post or a README.\n\nOne line to install in all of your agents (`npx skills add israelvicars/transit -g -a claude-code -a codex -a cursor`) or [install skills separately](#install).\n\nType these in Claude Code, Codex or Cursor once the skills are installed.\n\n**request-transit**\n\n- \"Animate this OTLP trace as a transit map: `./trace.json` \"\n- \"Draw Datadog trace 4bf92f… as a transit map and tell me where the delay is\"\n- \"Make a GIF of trace abc123 from Tempo for the incident doc\"\n- \"Make a page I can drop in #incidents for this trace: `./trace.json` \"\n\n**ci-transit**\n\n- \"Show my last failed GitHub Actions run as a transit map\"\n- \"Render run 1234567890 in owner/repo as an MP4\"\n- \"Share my last failed run in Slack\"\n\n**agent-transit**\n\n- \"Make an MP4 of my last Claude Code session\"\n- \"Draw my latest Codex session as a transit map. Which tool calls were slow?\"\n\n**A public transit map for your requests.** ([skill README](https://github.com/israelvicars/transit/blob/main/skills/request-transit/README.md))\n\nThe animation at the top of this page shows request-transit.\n\nServices are lines, spans are stations, and slow or failed calls are DELAY or SERVICE ALERT markers. It accepts OpenTelemetry/OTLP, Datadog, PostHog, AWS X-Ray, and Grafana Tempo data. Example commands are `npm run build`, `npm run render`, and `npm run verify`.\n\nIts condensed source guide:\n\n| Source | Input and fetch path | \n|---|---|\n| OpenTelemetry (OTLP JSON) | Local file or exporter/collector output | \n| Datadog | MCP result or the local `fetch.mjs datadog-api` command | \n| PostHog Distributed Tracing | MCP result or the local `fetch.mjs posthog-api` command | \n| AWS X-Ray | AWS CLI `fetch.mjs xray` or an AWS MCP result | \n| Grafana Tempo | `fetch.mjs tempo` or a Grafana/Tempo MCP result | \n\nThe optional contracts layer reads local service code only after you ask for it, indexes expected request and response shapes, and shows its evidence in the panel. Use `node skills/request-transit/scripts/transit.mjs index`, then build with `--contracts`. Useful flags include `--slow-ms`, `--ms-per-sec`, `--target-seconds`, `--trace-id`, `--redact`, and `--no-download`.\n\n**A transit map for your CI runs.** (GitHub Actions) ([skill README](https://github.com/israelvicars/transit/blob/main/skills/ci-transit/README.md))\n\nJobs are lines, steps are stations, and failed, cancelled, or slow steps become SERVICE ALERT or DELAY markers. It reads a saved GitHub Actions run or fetches one read-only through the local `gh` CLI. Example commands are `npm run build:ci`, `npm run render:ci`, and `npm run verify:ci`.\n\n**A transit map for your coding-agent sessions.** (Claude Code, Codex, Cursor) ([skill README](https://github.com/israelvicars/transit/blob/main/skills/agent-transit/README.md))\n\nTool families are lines, tool calls are stations, and errors, denials, or long calls become SERVICE ALERT or DELAY markers. By default it keeps only tool names, timing, status, target basenames, and the agent source; prompts, code, commands, output, and arguments stay out of the map. Example commands are `npm run build:agent`, `npm run render:agent`, and `npm run verify:agent`.\n\n| Output | What you get | Ask for it | \n|---|---|---|\n| Interactive page | The thing to share. One self-contained HTML file to drop in Slack, a PR or an incident doc. Works offline and makes no network requests. Play, scrub, click a station for details, scroll the list. Built with `--share` , it is named after what failed and opens paused on the first SERVICE ALERT under a one-line verdict. | \"…as a transit map\" (default), \"…to share in Slack\" | \n| GIF | A looping teaser for docs, PRs and feeds. Share the HTML file when people need the details | \"…as a GIF\" | \n| MP4 | A teaser video. Deterministic and frame-exact: the same input gives byte-identical video every time | \"…as an MP4\" or \"render a video\" | \n\nGIF and MP4 also write a `contact.png` contact sheet. Video needs a local Chromium and ffmpeg; first-run setup reuses what you have and tells you before it downloads anything.\n\nClick a station, train or line in the interactive page, or pause and press `N`, to open the side panel for that hop. It shows the stops the request took to get there, the client and server timing (start, duration and self time), the error message under a SERVICE ALERT when the hop failed, the span's attributes grouped by type, and its child spans. Sensitive-looking attribute keys are redacted when the page is built. If you built with `--contracts`, the panel also shows the expected request and response shapes. The panel is part of the interactive page: it runs locally and makes no network requests.\n\nInstall all three skills for Claude Code, Codex, and Cursor:\n\n```\nnpx skills add israelvicars/transit -g -a claude-code -a codex -a cursor\n```\n\nInstall one skill with `--skill <name>`; the flag can be repeated:\n\n```\nnpx skills add israelvicars/transit --skill request-transit\n```\n\nFor Claude Code, add the marketplace and install the suite plugin:\n\n```\nclaude plugin marketplace add israelvicars/transit\nclaude plugin install transit@transit\n```\n\nFor Codex, use `$skill-installer install https://github.com/israelvicars/transit/tree/main/skills/<name>` (replace `<name>` with the skill to install). Cursor uses the `npx skills` command above.\n\nTransit is local only: no telemetry, no tracking, no analytics, and no network requests from a built page. Request data and traces stay on your machine. `agent-transit` keeps only tool names and timing by default, with additional metadata limited to what the skill documents. A shared page holds only the scrubbed trace data drawn on the map: `--share` uses the strict scrub level and refuses `--no-scrub`. Transit never uploads anything; sharing a file is up to you.\n\n```\nnpm test             # all unit, adapter, privacy, and self-contained-copy tests\nnpm run check        # npm test, every verifier, and the UI/network gates\n```\n\nSource lives in `src/<name>/`; the committed, generated `skills/<name>/`\nfolders are the self-contained install surface for plugins, `npx skills`, and\nlocal symlinks. Run `node scripts/build-skills.mjs` after changing source.\n\nRendering uses local browser and ffmpeg prerequisites. The optional fetch commands use credentials already configured for your own backend or GitHub account.\n\nMIT\n\nNot affiliated with or endorsed by the MTA.", "url": "https://wpnews.pro/news/show-hn-transit-subway-maps-of-your-data", "canonical_source": "https://github.com/israelvicars/transit", "published_at": "2026-10-22 15:26:16+00:00", "updated_at": "2026-10-22 15:42:08.312329+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "mlops"], "entities": ["Transit", "Israel Vicars", "Claude Code", "Codex", "Cursor", "GitHub Actions", "OpenTelemetry", "Datadog"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-transit-subway-maps-of-your-data", "markdown": "https://wpnews.pro/news/show-hn-transit-subway-maps-of-your-data.md", "text": "https://wpnews.pro/news/show-hn-transit-subway-maps-of-your-data.txt", "jsonld": "https://wpnews.pro/news/show-hn-transit-subway-maps-of-your-data.jsonld"}}