{"_id":"@andypai/wildcard","_rev":"3-93801f8e9445bab9fa70f76272984c36","name":"@andypai/wildcard","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@andypai/wildcard","version":"0.1.0","keywords":["cli","timeline","productivity","activity","bun"],"license":"MIT","_id":"@andypai/wildcard@0.1.0","maintainers":[{"name":"andypai.me","email":"andy@r2pi.co"}],"homepage":"https://github.com/abpai/wildcard#readme","bugs":{"url":"https://github.com/abpai/wildcard/issues"},"bin":{"wildcard":"src/wildcard.ts"},"dist":{"shasum":"055405442746c29d234d5698fe8398b840802874","tarball":"https://registry.npmjs.org/@andypai/wildcard/-/wildcard-0.1.0.tgz","fileCount":117,"integrity":"sha512-b7/lr/FhSjKTKPMP/KvvlxsgsQQBYbBXTnP/TGzExHMl9ositjL3kHTsbvRchii3EteUFV3V6VqlXom8RwHd5g==","signatures":[{"sig":"MEUCIHOEMCa/FCZs7WSjJMFQDK15Hz8e9eA8UCqTNSwdC6SkAiEAukGJ8hqsENV4O34i7TVE8QEo88nXexd7tqvKMrV/GS0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390588},"type":"module","engines":{"bun":"1.3.8"},"gitHead":"0a0decddecd09f5c9a3df6bade66b51f232a5a10","private":false,"scripts":{"show":"./src/wildcard.ts show today","test":"bun test","check":"bunx prettier --check . && bun run typecheck","watch":"./src/wildcard.ts watch","format":"bunx prettier --write .","report":"./src/wildcard.ts report today","search":"./src/wildcard.ts search","server":"bun ./src/wildcard.ts server start","status":"./src/wildcard.ts status","wildcard":"./src/wildcard.ts","typecheck":"bunx tsc --noEmit"},"_npmUser":{"name":"andypai.me","email":"andy@r2pi.co"},"repository":{"url":"git+https://github.com/abpai/wildcard.git","type":"git"},"_npmVersion":"11.9.0","description":"Bun-first CLI and modules for a unified activity timeline.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ai":"^6.0.134","yaml":"^2.8.1","commander":"^14.0.3","picomatch":"^4.0.2","ai-sdk-ollama":"^3.8.1","@ai-sdk/google":"^3.0.52","@ai-sdk/openai":"^3.0.47","@clack/prompts":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.4.2","@types/bun":"^1.1.0","typescript":"^5.8.3","@types/picomatch":"^2.3.4"},"optionalDependencies":{"fsevents":"^2.3.3"},"_npmOperationalInternal":{"tmp":"tmp/wildcard_0.1.0_1775671080388_0.10840969810223178","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@andypai/wildcard","version":"0.2.0","keywords":["cli","timeline","productivity","activity","bun"],"license":"MIT","_id":"@andypai/wildcard@0.2.0","maintainers":[{"name":"andypai.me","email":"andy@r2pi.co"}],"homepage":"https://abpai.github.io/wildcard/","bugs":{"url":"https://github.com/abpai/wildcard/issues"},"bin":{"wildcard":"src/wildcard.ts"},"dist":{"shasum":"89d530578cfe73a2cefe3a142ee7c3f4ac216111","tarball":"https://registry.npmjs.org/@andypai/wildcard/-/wildcard-0.2.0.tgz","fileCount":118,"integrity":"sha512-FhGrFVhSxuwD3UOmHXnIPFrUhxZ4D3BYeJdhmSHXPrYBVyC3p6e2euoXSglgx+seeauSb55+b/SSCz3XqCoVzw==","signatures":[{"sig":"MEUCIQC2BVaQBpEONUn8Gxelf4Bbtnjp41/fUbO34pMel7+G8QIgGYeQux6OTo0l9deVH57LeUuBccBNpV37xKPS9L8uXNw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396551},"type":"module","engines":{"bun":"1.3.8"},"gitHead":"312f3e503360721db9833e5fdb0d6cb66f4eefe0","private":false,"scripts":{"show":"./src/wildcard.ts show today","test":"bun test","check":"bunx prettier --check . && bun run typecheck","watch":"./src/wildcard.ts watch","format":"bunx prettier --write .","report":"./src/wildcard.ts report today","search":"./src/wildcard.ts search","server":"bun ./src/wildcard.ts server start","status":"./src/wildcard.ts status","wildcard":"./src/wildcard.ts","typecheck":"bunx tsc --noEmit"},"_npmUser":{"name":"andypai.me","email":"andy@r2pi.co"},"repository":{"url":"git+https://github.com/abpai/wildcard.git","type":"git"},"_npmVersion":"11.9.0","description":"Bun-first CLI and modules for a unified activity timeline.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ai":"^6.0.134","yaml":"^2.8.1","commander":"^14.0.3","picomatch":"^4.0.2","ai-sdk-ollama":"^3.8.1","@ai-sdk/google":"^3.0.52","@ai-sdk/openai":"^3.0.47","@clack/prompts":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.4.2","@types/bun":"^1.1.0","typescript":"^5.8.3","@types/picomatch":"^2.3.4"},"optionalDependencies":{"fsevents":"^2.3.3"},"_npmOperationalInternal":{"tmp":"tmp/wildcard_0.2.0_1775677057290_0.18673873864970147","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@andypai/wildcard","version":"0.2.1","private":false,"type":"module","description":"Bun-first CLI and modules for a unified activity timeline.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/abpai/wildcard.git"},"bugs":{"url":"https://github.com/abpai/wildcard/issues"},"homepage":"https://abpai.github.io/wildcard/","publishConfig":{"access":"public"},"bin":{"wildcard":"src/wildcard.ts"},"keywords":["cli","timeline","productivity","activity","bun"],"scripts":{"wildcard":"./src/wildcard.ts","watch":"./src/wildcard.ts watch","show":"./src/wildcard.ts show today","report":"./src/wildcard.ts report today","search":"./src/wildcard.ts search","status":"./src/wildcard.ts status","test":"bun test","server":"bun ./src/wildcard.ts server start","format":"bunx prettier --write .","typecheck":"bunx tsc --noEmit","check":"bunx prettier --check . && bun run typecheck"},"engines":{"bun":"1.3.8"},"dependencies":{"@ai-sdk/google":"^3.0.52","@ai-sdk/openai":"^3.0.47","@clack/prompts":"^1.1.0","ai":"^6.0.134","ai-sdk-ollama":"^3.8.1","commander":"^14.0.3","picomatch":"^4.0.2","yaml":"^2.8.1"},"optionalDependencies":{"fsevents":"^2.3.3"},"devDependencies":{"@types/bun":"^1.1.0","@types/picomatch":"^2.3.4","prettier":"^3.4.2","typescript":"^5.8.3"},"gitHead":"3f1731aa9a02afacecade79b3c4a0e04f12c31bf","_id":"@andypai/wildcard@0.2.1","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-XdhAOVG2tWjMhp5XCpBUY77bOtrYdhfzayUP9e/LOtuJhHgkUPkoL5y7gXVH171p8ZxuikSACMvGs6wilkFKDw==","shasum":"7375de5ac8e816fdd552c4ea942834ec0fc7b38b","tarball":"https://registry.npmjs.org/@andypai/wildcard/-/wildcard-0.2.1.tgz","fileCount":118,"unpackedSize":396919,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCiJz8kqVcymqkK/ZTBW/a6LbnpcwFmyoza0yhPLX0omwIgRBI7PBOZWAoHvv5RwlAcIixusLzoj6IXR3bwSvHUDb0="}]},"_npmUser":{"name":"andypai.me","email":"andy@r2pi.co"},"directories":{},"maintainers":[{"name":"andypai.me","email":"andy@r2pi.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wildcard_0.2.1_1775695636124_0.37847241135889753"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-08T17:58:00.309Z","modified":"2026-04-09T00:47:16.382Z","0.1.0":"2026-04-08T17:58:00.553Z","0.2.0":"2026-04-08T19:37:37.482Z","0.2.1":"2026-04-09T00:47:16.277Z"},"bugs":{"url":"https://github.com/abpai/wildcard/issues"},"license":"MIT","homepage":"https://abpai.github.io/wildcard/","keywords":["cli","timeline","productivity","activity","bun"],"repository":{"type":"git","url":"git+https://github.com/abpai/wildcard.git"},"description":"Bun-first CLI and modules for a unified activity timeline.","maintainers":[{"name":"andypai.me","email":"andy@r2pi.co"}],"readme":"# Wildcard\n\nBetween your own coding sessions, AI agents running tasks, and work spread across multiple machines, there's a lot happening in a day. Too much to keep in your head. Wildcard captures all of it — file edits, app focus, agent activity — into a local timeline that your AI can use to help you prioritize, write daily briefs, and keep track of what actually got done.\n\nTools like [ActivityWatch](https://activitywatch.net/) and [screenpipe](https://github.com/mediar-ai/screenpipe) are impressive projects, but this data is deeply personal. I wanted something with no telemetry, a low memory footprint, and a codebase simple enough to fork and own completely. Wildcard is MIT-licensed and will always be free of any tracking. As local models get better, the goal is to drop third-party AI providers entirely.\n\n### How it works\n\nWildcard runs as a background daemon that watches your project directories. File changes become timestamped events in a local SQLite database. Those events get grouped into sessions, then summarized into project-level reports — optionally enriched by a coding agent that reads your git history and explains what changed in plain language.\n\nThe real payoff is multi-device: run wildcard on your laptop, your dev server, wherever your agents operate. Each device syncs to a central archive, giving you (or your AI agent — [openclaw](https://github.com/openclaw/openclaw), Claude, ChatGPT, whatever you use) a single feed of everything that happened.\n\n**Status:** early alpha. Expect breaking changes while the data model and UX settle.\n\nFor implementation details, see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). For the operator-focused reporting workflow used by AI agents, see [SKILL.md](SKILL.md).\n\n## Requirements\n\n- Bun 1.3.8\n- macOS or Linux (Windows is not supported; use WSL2 if needed)\n- Optional: Ollama, OpenAI, or Gemini for AI summaries\n\n## Install\n\n```bash\nbun add -g @andypai/wildcard\nwildcard setup\n```\n\nOr install from source:\n\n```bash\ngit clone git@github.com:abpai/wildcard.git\ncd wildcard\nbun install\nln -sf \"$(pwd)/src/wildcard.ts\" ~/.bun/bin/wildcard\n```\n\n## Usage\n\nCommands are intended to run via the `wildcard` bin.\n\n```bash\n# Start watching (foreground)\nwildcard watch --roots ~/code\n\n# Start watching as a daemon\nwildcard watch --roots ~/code --daemon\n\n# Show today's sessions\nwildcard show today\n\n# Show chronological activity log (today by default)\nwildcard log\nwildcard log week\n\n# Generate a weekly report\nwildcard report week\n\n# Enrich projects with AI-powered change analysis (requires Codex CLI)\nwildcard enrich\nwildcard enrich --period week\nwildcard enrich --dry-run\n\n# Push pending local data to a central ingest server\nwildcard sync push\n\n# Start the central archive ingest endpoint\nwildcard server start\n\n# Start the archive server as a managed daemon\nwildcard server start --daemon\n\n# Inspect, stop, restart, or validate the managed archive server\nwildcard server status\nwildcard server stop\nwildcard server restart\nwildcard server doctor\n\n# Search the timeline\nwildcard search \"config\" --from 2025-01-01 --to 2025-01-31 --types edit,ocr\n\n# Check daemon status\nwildcard status\nwildcard status --json\n\n# macOS: install/uninstall launchd service\nwildcard launchd install --roots ~/code\nwildcard launchd uninstall\nwildcard launchd restart\n\n# Linux: install/uninstall systemd user service\nwildcard systemd install --roots ~/code\nwildcard systemd uninstall\nwildcard systemd restart\n\n# Prune old local data\nwildcard prune --older-than 30\n```\n\nFor one release, `bun run server` remains as a compatibility alias to `wildcard server start`.\n\n## Archive Host Workflow\n\nUse `wildcard server start` on the central archive host and point it at `timeline.db` so the regular CLI and the ingest endpoint read and write the same archive directly.\n\n```bash\nwildcard server start --db-path ~/.wildcard/timeline.db\nwildcard server status --db-path ~/.wildcard/timeline.db\n```\n\nRemote devices should set:\n\n- `sync.server_url` to the archive host URL\n- `identity.device_id` to a unique per-device value\n\n### Update launchd service (macOS)\n\n- Reload the running service after code/config updates:\n  `wildcard launchd restart`\n- Rebuild service definition (for changed roots or plist args):\n  `wildcard launchd install --roots ~/code`\n- Full clean reinstall if launchd gets into a bad state:\n  `wildcard launchd uninstall`\n  `wildcard launchd install --roots ~/code`\n\n### Update systemd service (Linux)\n\n- Reload the running service after code/config updates:\n  `wildcard systemd restart`\n- Rebuild service definition (for changed roots):\n  `wildcard systemd install --roots ~/code`\n- Full clean reinstall:\n  `wildcard systemd uninstall`\n  `wildcard systemd install --roots ~/code`\n\nEvent types:\n\n- `edit`: emitted by `wildcard watch` (filesystem activity)\n- `ocr`, `audio`, `ui`: supported by the timeline schema and ingest APIs for non-filesystem sources\n\nUseful flags:\n\n- `show`, `log`, `report`, `search`: `--device <ids>` to filter multi-device data\n- `report`: `--force-refresh` to bypass summary cache\n- `report`: `--no-ai` to force heuristic summaries\n- `report`: `--no-enrich` to skip automatic code enrichment\n- `report`: `--no-progress` to keep stdout clean for piping or file capture\n- `log`: `--json` for machine-readable output\n- `status`: `--json` for machine-readable output\n- `watch`: `--memlog`, `--mem-warn-mb`, `--mem-limit-mb` for memory logging/guards\n\n## Configuration\n\nDefault config path: `~/.wildcard/config.yaml`. Data lives under `~/.wildcard/` by default. Defaults come from `src/config/config-store.ts`; the example below shows the most relevant fields rather than every compatibility knob.\n\n```yaml\nstore_dir: ~/.wildcard\n\nwatch:\n  roots:\n    - ~/code\n  ignore:\n    - .git/**\n    - node_modules/**\n    - dist/**\n    - '**/*.lock'\n  debounce_ms: 300\n  non_git_grouping: top_level_dir\n  app_usage_capture: true\n  app_usage_poll_ms: 5000\n  backfill_on_start: false\n  checkpoint_interval_s: 60\n\nsession:\n  idle_threshold_s: 300\n  activity_window_s: 120\n\nai:\n  enabled: false\n  provider: ollama\n  model: qwen3.5:latest\n  base_url: http://localhost:11434\n\nidentity:\n  device_id: laptop\n\nsync:\n  enabled: false\n  server_url: http://localhost:7070\n  batch_size: 500\n  max_payload_bytes: 2097152\n  interval_s: 300\n  max_retries: 8\n  batch_delay_ms: 0\n\nserver:\n  host: 0.0.0.0\n  port: 7070\n  db_path: ~/.wildcard/timeline.db\n  api_key:\n  allowed_devices: []\n  max_body_size_bytes: 10485760\n  pid_file: ~/.wildcard/wildcard-server.pid\n```\n\nEnvironment variables:\n\n- `WILDCARD_STORE_DIR`\n- `WILDCARD_CONFIG_PATH`\n- `WILDCARD_WATCH_ROOTS`\n- `WILDCARD_AI_ENABLED`\n- `WILDCARD_AI_PROVIDER`\n- `WILDCARD_AI_MODEL`\n- `WILDCARD_AI_BASE_URL`\n- `WILDCARD_AI_API_KEY` (fallbacks: `OPENAI_API_KEY` for OpenAI, `GEMINI_API_KEY` for Gemini)\n- `WILDCARD_DEVICE_ID`\n- `WILDCARD_SYNC_ENABLED`\n- `WILDCARD_SYNC_SERVER_URL`\n- `WILDCARD_SYNC_API_KEY`\n- `WILDCARD_SYNC_BATCH_SIZE`\n- `WILDCARD_SYNC_MAX_PAYLOAD_BYTES`\n- `WILDCARD_SYNC_INTERVAL_S`\n- `WILDCARD_SYNC_MAX_RETRIES`\n- `WILDCARD_SYNC_BATCH_DELAY_MS`\n- `WILDCARD_SERVER_HOST`\n- `WILDCARD_SERVER_PORT`\n- `WILDCARD_SERVER_DB_PATH`\n- `WILDCARD_SERVER_API_KEY`\n- `WILDCARD_SERVER_ALLOWED_DEVICES`\n- `WILDCARD_SERVER_MAX_BODY_SIZE_BYTES`\n- `WILDCARD_SERVER_PID_FILE`\n- `WILDCARD_DEBUG_OSASCRIPT` (`1` to log frontmost-app AppleScript stderr/debug details)\n\nLegacy server env fallbacks kept for one release:\n\n- `PORT`\n- `MAX_BODY_SIZE`\n- `WILDCARD_API_KEY`\n- `WILDCARD_ALLOWED_DEVICES`\n- `WILDCARD_DB_PATH`\n\nAI summary prompt templates live in `src/summary/prompts/*.md`. The markdown files hold the stable system instructions, while runtime session/project data is still assembled in code.\n\n## Data Locations\n\n- `~/.wildcard/timeline.db` (SQLite timeline)\n  - includes `events`, `events_fts`, summary cache tables, and `app_usage` focus segments\n- `~/.wildcard/blobs/` (content-addressable blobs)\n- `~/.wildcard/wildcard.pid` (daemon PID)\n- `~/.wildcard/wildcard-server.pid` (archive server daemon PID)\n- `~/Library/LaunchAgents/com.wildcard.wildcard.plist` (macOS launchd)\n- `~/.wildcard/launchd.out.log` and `~/.wildcard/launchd.err.log` (macOS logs)\n\n## Development\n\n```bash\ngit clone git@github.com:abpai/wildcard.git\ncd wildcard\nbun install\nln -sf \"$(pwd)/src/wildcard.ts\" ~/.bun/bin/wildcard\nbun run check\nwildcard --help\n```\n\n### Introspection Scripts\n\n```bash\n# Inspect schema + event/app usage + sync cursor health\nbun scripts/explore-db.ts\n\n# Generate ad-hoc AI summary output from local timeline\nbun scripts/ai-summary.ts\n```\n\n## Security and Privacy\n\nWildcard stores activity data locally by default. If you enable AI providers or remote sync, data may be sent to those services depending on your config. Review [SECURITY.md](SECURITY.md) for reporting vulnerabilities.\n\n## License\n\nMIT. See `LICENSE`.\n","readmeFilename":"README.md"}