Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
e47bd25
beads: plan hyperindex-49s — GraphQL filtering, sorting & query compl…
daviddao Feb 18, 2026
6b2c6ad
feat: add composite DB index for keyset pagination performance (hyper…
daviddao Feb 18, 2026
c18791b
Add did and rkey fields to typed record GraphQL types (hyperindex-49s.5)
daviddao Feb 18, 2026
bbfdf23
Add max page size limit and ClampPageSize helper (hyperindex-49s.6)
daviddao Feb 18, 2026
f3de82e
feat: scaffold shared filter input types (hyperindex-49s.1)
daviddao Feb 18, 2026
2140d47
Add per-collection sort enum and sortBy/sortDirection arguments (hype…
daviddao Feb 18, 2026
6050b63
Generate per-collection WhereInput types in schema builder (hyperinde…
daviddao Feb 18, 2026
264d333
Add LIKE-based cross-collection search query (hyperindex-49s.13)
daviddao Feb 18, 2026
8d786ca
Add FieldFilter struct and filtered query to RecordsRepository (hyper…
daviddao Feb 18, 2026
110e36d
Wire WHERE filters from GraphQL args into resolvers and repository (h…
daviddao Feb 18, 2026
140f601
feat: populate totalCount on public connections opt-in (hyperindex-49…
daviddao Feb 18, 2026
8986495
Add sorted query method tests to RecordsRepository (hyperindex-49s.9)
daviddao Feb 18, 2026
7d5f062
Wire sorting into resolvers and generalize cursor encoding (hyperinde…
daviddao Feb 18, 2026
a4a38bc
feat: add backward pagination support (last/before) (hyperindex-49s.12)
daviddao Feb 18, 2026
c179d86
Add integration tests for filter/sort/search end-to-end (hyperindex-4…
daviddao Feb 18, 2026
d9e9512
beads: all 14 tasks complete for hyperindex-49s, mark for integration…
daviddao Feb 18, 2026
5bf2b53
docs: update README with filtering, sorting, search, pagination examples
daviddao Feb 18, 2026
26976b4
docs: update API docs with filtering, sorting, search reference
daviddao Feb 18, 2026
aaebb0b
beads: plan hyperindex-q00 — bug fixes from code review (11 tasks)
daviddao Feb 18, 2026
09fd2a3
fix: remove DefaultValue from records query first arg to fix backward…
daviddao Feb 18, 2026
0af843c
Add search query timeout and concurrency control (hyperindex-q00.4)
daviddao Feb 18, 2026
6c2350d
Fix cursor pipe delimiter collision with JSON encoding (hyperindex-q0…
daviddao Feb 18, 2026
99b68c3
Fix search minimum length to use rune count and increase to 3 (hyperi…
daviddao Feb 18, 2026
ff5e7f5
Add MaxINListSize limit to prevent SQLite parameter overflow (hyperin…
daviddao Feb 18, 2026
d60d85d
Skip lexicon properties that collide with reserved field names (hyper…
daviddao Feb 18, 2026
c9d2dc3
fix: escape LIKE wildcards in contains/startsWith filter operators (h…
daviddao Feb 18, 2026
b149838
fix: expand DID filter to support eq and in operators (hyperindex-q00.6)
daviddao Feb 18, 2026
fff01bd
Add MaxFilterConditions cap to prevent filter abuse (hyperindex-q00.10)
daviddao Feb 18, 2026
56a3c6f
test: add unit tests for ClampPageSize, sortFieldValueForRecord, empt…
daviddao Feb 18, 2026
afad71a
beads: close hyperindex-q00 — all 11 bug fixes complete
daviddao Feb 18, 2026
434720d
beads: plan hyperindex-2hm — Tap sidecar integration epic (8 tasks)
daviddao Feb 18, 2026
68efb07
Add Tap config env vars to config package (hyperindex-2hm.1)
daviddao Feb 18, 2026
7e1d850
feat: add internal/tap package with event types and JSON parser (hype…
daviddao Feb 18, 2026
85ed81f
feat: implement Tap HTTP admin client (hyperindex-2hm.3)
daviddao Feb 18, 2026
5ac3f2e
Implement Tap IndexHandler that stores records and publishes to PubSu…
daviddao Feb 18, 2026
8469c62
feat: implement Tap WebSocket consumer with ack support (hyperindex-2…
daviddao Feb 18, 2026
f781a70
Wire Tap consumer into main.go with TAP_ENABLED feature flag (hyperin…
daviddao Feb 18, 2026
6b6f4c0
Add Tap deployment docs and docker-compose sidecar config (hyperindex…
daviddao Feb 18, 2026
5dfe636
feat: add Tap health check to /health and /stats endpoints (hyperinde…
daviddao Feb 18, 2026
28b47bd
beads: close hyperindex-2hm — Tap sidecar integration complete
daviddao Feb 18, 2026
1ec7bd0
beads: plan hyperindex-md3 — fix 10 Tap review bugs (B1-B10)
daviddao Feb 18, 2026
db029dc
fix: use Basic auth in README Tap curl example (hyperindex-md3.9)
daviddao Feb 18, 2026
ee9d022
Add nil guard for PubSub in IndexHandler to prevent nil-pointer panic…
daviddao Feb 18, 2026
7b362ca
security: require SECRET_KEY_BASE and TAP_ADMIN_PASSWORD, bind tap to…
daviddao Feb 18, 2026
c763c4f
validate required fields in ParseEvent to prevent garbage URIs (hyper…
daviddao Feb 18, 2026
788e1cf
fix: remove concurrent WriteMessage in Stop() to eliminate data race …
daviddao Feb 18, 2026
9271968
beads: close wave 1 of hyperindex-md3 (.1,.4,.5,.8,.9)
daviddao Feb 18, 2026
9525b34
return error from records.Delete failure instead of silently swallowi…
daviddao Feb 18, 2026
692e95b
fix: reset backoff to minBackoff after successful reconnection (hyper…
daviddao Feb 18, 2026
0a6c57e
beads: close wave 2 of hyperindex-md3 (.2,.6)
daviddao Feb 18, 2026
ecc2c69
Add WebSocket SetReadLimit to prevent OOM from oversized messages (hy…
daviddao Feb 18, 2026
2563e72
capture activity ID and update status to completed after record proce…
daviddao Feb 18, 2026
b28087c
suppress spurious context.Canceled error log on graceful shutdown (hy…
daviddao Feb 18, 2026
3e35d01
beads: close hyperindex-md3 — all 10 Tap review bugs fixed
daviddao Feb 18, 2026
58e156f
beads: plan hyperindex-xuq — 7 follow-up fixes from reviewer feedback
daviddao Feb 18, 2026
c72322b
fix: use admin username in README curl Basic auth example (hyperindex…
daviddao Feb 18, 2026
75b4d24
fix: require SECRET_KEY_BASE via :? syntax in compose files (hyperind…
daviddao Feb 18, 2026
8f394aa
test: rename DeleteError test and add delete activity status test (hy…
daviddao Feb 18, 2026
6c73f1a
fix: reject nil-payload and empty-body events in ParseEvent (hyperind…
daviddao Feb 18, 2026
a8ea6bb
fix: reset backoff only on successful connection, add escalation test…
daviddao Feb 18, 2026
5d24874
fix: guard else branch with ctx.Err() check before reconnect log (hyp…
daviddao Feb 18, 2026
f3b7ba1
beads: close hyperindex-xuq — all reviewer follow-up fixes complete
daviddao Feb 18, 2026
7e2e8e1
beads: plan hyperindex-0nk — Frontend Design Overhaul (13 tasks)
daviddao Feb 18, 2026
3e6b656
docs: rename branding to Hyperindex in agents route (hyperindex-0nk.12)
daviddao Feb 18, 2026
dbacf8f
feat: rewrite globals.css with OKLCH design tokens + dark mode (hyper…
daviddao Feb 18, 2026
d39a509
rename Hypergoat → Hyperindex in user-visible strings and client conf…
daviddao Feb 18, 2026
4143af6
simplify GeometricBackground with theme-aware colors and hypercerts l…
daviddao Feb 18, 2026
812315d
feat: add ThemeProvider and ThemeToggle components (hyperindex-0nk.3)
daviddao Feb 18, 2026
e0029c7
feat: update Card, Button, Input, Alert for dark mode + CSS tokens (h…
daviddao Feb 18, 2026
a6db65d
Layout: Wire ThemeProvider, update body/html, replace logo, update fo…
daviddao Feb 18, 2026
78649fb
redesign Header with glass-panel, hypercerts logo, Hyperindex brandin…
daviddao Feb 18, 2026
dffe0f3
feat: update lexicons and backfill pages for dark mode (hyperindex-0n…
daviddao Feb 18, 2026
4b86216
feat: update Dashboard page and sub-components for dark mode (hyperin…
daviddao Feb 18, 2026
6033c8f
feat: update settings and onboarding pages for dark mode (hyperindex-…
daviddao Feb 18, 2026
0198d61
docs page: update branding, font-syne, dark mode CSS vars (hyperindex…
daviddao Feb 18, 2026
7ccd9a4
beads: mark hyperindex-0nk for integration review — all 13 tasks closed
daviddao Feb 18, 2026
c4ecd14
feat: add client Dockerfile + standalone output for Railway deployment
daviddao Feb 18, 2026
1ca7f43
fix: use dynamic backend URL for GraphiQL links and API docs
daviddao Feb 18, 2026
981a312
fix: GraphiQL redirect route and Dockerfile build arg for NEXT_PUBLIC…
daviddao Feb 18, 2026
4035050
beads: plan hyperindex-a10 — make dashboard public
daviddao Feb 19, 2026
9e8acfc
Make statistics, activityBuckets, recentActivity public (hyperindex-a10)
daviddao Feb 19, 2026
f2748e4
docs: add deploy-railway skill for frontend/backend deployment
daviddao Feb 19, 2026
d96ad45
beads: plan hyperindex-2rz — batch lexicon registration
daviddao Feb 19, 2026
6275449
feat: support batch lexicon registration via comma/newline-separated …
daviddao Feb 19, 2026
4241da8
beads: plan hyperindex-vz7 — fix NonNull GraphQL violations for requi…
daviddao Feb 19, 2026
7fc19ad
Add ZeroValueForType and RequiredProperties to lexicon package (hyper…
daviddao Feb 19, 2026
fb5c723
Add coerceRequiredFields to schema builder and wire into resolvers (h…
daviddao Feb 19, 2026
ae64fae
test: add integration tests for null coercion of required fields (hyp…
daviddao Feb 19, 2026
c15ebb9
beads: mark hyperindex-vz7 for integration review — all children closed
daviddao Feb 19, 2026
e30e889
beads: close hyperindex-vz7 — NonNull coercion complete
daviddao Feb 19, 2026
68e95da
beads: spec review follow-ups hyperindex-5ar, bn7, 3gm
daviddao Feb 19, 2026
18c6350
test: add TestCoerceRequiredFields_SingleRecordResolver for ByUri pat…
daviddao Feb 19, 2026
e706083
Remove unused format parameter from ZeroValueForType (hyperindex-bn7)
daviddao Feb 19, 2026
659483d
Merge pull request #35 from hypercerts-org/tap-feature
daviddao Feb 20, 2026
be7492a
fix: resolve 7 golangci-lint v2 issues blocking PR #34
daviddao Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions .agents/skills/deploy-railway/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
---
name: deploy-railway
description: Deploy the Hyperindex frontend and backend to Railway. Use this skill when the user asks to deploy, redeploy, or update the production services on Railway.
---

# Deploy Hyperindex to Railway

## Project Layout

Hyperindex is a monorepo with two Railway services:

| Service | Source | Dockerfile | Railway Name |
|---------|--------|------------|-------------|
| **Backend** (Go) | repo root `/` | `Dockerfile` | `backend` |
| **Frontend** (Next.js) | `client/` | `client/Dockerfile` | `frontend` |

## Custom Domains

| Service | Domain |
|---------|--------|
| Backend | `https://api.hi.gainforest.app` |
| Frontend | `https://hi.gainforest.app` |

Legacy domains (still active): `backend-production-95a22.up.railway.app`, `frontend-production-dcce.up.railway.app`

## Prerequisites

- Railway CLI v4+ installed and logged in (`railway whoami`)
- Linked to project: `railway status` should show project `hyperindex`
- On the correct git branch (typically `tap-feature`)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Stale branch reference — update to match current workflow.

Line 30 says "typically tap-feature", but this PR is on filter-feature and the likely long-lived default would be main. An agent following these instructions verbatim would attempt to check out tap-feature before deploying.

📝 Proposed fix
-- On the correct git branch (typically `tap-feature`)
+- On the correct git branch (typically `main` or your feature branch)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- On the correct git branch (typically `tap-feature`)
- On the correct git branch (typically `main` or your feature branch)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.agents/skills/deploy-railway/SKILL.md at line 30, Update the stale branch
reference in the SKILL.md line that currently reads "typically `tap-feature`"
(search for that exact phrase) to reflect the current workflow—replace it with
the long-lived default branch `main`, or make it generic like
"`<feature-branch>` (e.g., filter-feature or main)" so agents won't check out
the wrong branch; edit the sentence in .agents/skills/deploy-railway/SKILL.md to
use the chosen replacement.


## Deploy Backend

The backend deploys from the repo root using the root `Dockerfile`:

```bash
railway up -s backend -d
```

This uploads the entire repo, builds the Go binary in Docker, and deploys it. Takes ~3-5 minutes.

### Verify backend:
```bash
curl -s https://api.hi.gainforest.app/
# Should return: {"name":"Hyperindex","version":"0.1.0-dev",...}
```

## Deploy Frontend

**CRITICAL:** The frontend MUST use `--path-as-root` to avoid Railway picking up the root Go Dockerfile:

```bash
railway up --path-as-root client/ -s frontend -d
```

This makes `client/` the archive root so Railway only sees `client/Dockerfile` (the Next.js build). Takes ~3-5 minutes.

### Why `--path-as-root`?

Without it, `railway up` uploads the entire monorepo and Railway finds the root `Dockerfile` (Go backend) instead of `client/Dockerfile` (Next.js frontend). This causes the frontend service to run the Go binary instead of the Next.js app.

### Verify frontend:
```bash
curl -s -o /dev/null -w "%{http_code}" https://hi.gainforest.app/
# Should return: 200

# Verify it's actually Next.js (not the Go server):
curl -s https://hi.gainforest.app/ | grep -o '<title>[^<]*</title>'
# Should return: <title>Hyperindex</title>
```

## Deploy Both Services

```bash
# Backend (from repo root)
railway up -s backend -d

# Frontend (with path-as-root)
railway up --path-as-root client/ -s frontend -d
```

## Environment Variables

### Backend (`backend` service)
| Variable | Value |
|----------|-------|
| `HOST` | `0.0.0.0` |
| `PORT` | `8080` |
| `DATABASE_URL` | `sqlite:/app/data/hypergoat.db` |
| `EXTERNAL_BASE_URL` | `https://api.hi.gainforest.app` |
| `TRUST_PROXY_HEADERS` | `true` |
| `ADMIN_DIDS` | `did:plc:qc42fmqqlsmdq7jiypiiigww` (daviddao.org) |
| `OAUTH_LOOPBACK_MODE` | `true` |
| `SECRET_KEY_BASE` | *(set on Railway, do not change)* |

Comment on lines +84 to +95
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add blank lines around both environment variable tables (MD058).

Static analysis reports MD058 violations at lines 85 and 97. Tables must be surrounded by blank lines for valid Markdown rendering in many parsers.

📝 Proposed fix
 ### Backend (`backend` service)
+
 | Variable | Value |
 |----------|-------|
 ...
 | `SECRET_KEY_BASE` | *(set on Railway, do not change)* |
+
 ### Frontend (`frontend` service)
+
 | Variable | Value |
 |----------|-------|
 ...
 | `ATPROTO_JWK_PRIVATE` | *(ES256 JWK, set on Railway, do not change)* |
+

Also applies to: 96-105

🧰 Tools
🪛 markdownlint-cli2 (0.21.0)

[warning] 85-85: Tables should be surrounded by blank lines

(MD058, blanks-around-tables)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.agents/skills/deploy-railway/SKILL.md around lines 84 - 95, The Markdown
tables under the "Backend (`backend` service)" section are missing blank lines
before and after them causing MD058 violations; edit
.agents/skills/deploy-railway/SKILL.md to ensure there is a blank line both
above and below each environment variable table (the table that starts with |
Variable | Value | and the subsequent table mentioned around lines 96-105) so
each table is separated from surrounding text and other blocks.

### Frontend (`frontend` service)
| Variable | Value |
|----------|-------|
| `PORT` | `3000` |
| `PUBLIC_URL` | `https://hi.gainforest.app` |
| `NEXT_PUBLIC_API_URL` | `https://api.hi.gainforest.app` |
| `HYPERINDEX_URL` | `https://api.hi.gainforest.app` |
| `COOKIE_SECRET` | *(set on Railway, do not change)* |
| `ATPROTO_JWK_PRIVATE` | *(ES256 JWK, set on Railway, do not change)* |

**Note:** `NEXT_PUBLIC_API_URL` is a build-time variable (inlined by Next.js during `npm run build`). The `client/Dockerfile` declares `ARG NEXT_PUBLIC_API_URL` so Railway passes it during Docker build.

## Troubleshooting

### Frontend shows Go JSON response instead of HTML
You forgot `--path-as-root client/`. Redeploy with:
```bash
railway up --path-as-root client/ -s frontend -d
```

### "Application not found" on custom domain
SSL certificate is still provisioning. Wait 5-15 minutes after adding DNS records.

### GraphiQL returns 500 through frontend
GraphiQL is served directly by the backend. The frontend has a `/graphiql` server-side redirect route that redirects to `https://api.hi.gainforest.app/graphiql`.

### OAuth login fails
Check that `ATPROTO_JWK_PRIVATE` and `PUBLIC_URL` are set on the frontend service. Generate a new JWK with:
```bash
node scripts/generate-jwk.js # (in hyperscan repo, or client/scripts/ if copied)
```
Comment on lines +123 to +126
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

JWK generation script reference is ambiguous.

Line 125 references hyperscan repo as the canonical location for generate-jwk.js, with a parenthetical noting it may or may not be in client/scripts/. If an agent (or engineer) follows this guide and the script isn't present in the current repo, the OAuth setup step silently fails. The reference should be made unambiguous — either commit the script to a canonical location in this repo and reference that path exclusively, or provide an alternative (e.g., an inline node -e one-liner using the jose library) so the step is self-contained.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.agents/skills/deploy-railway/SKILL.md around lines 123 - 126, The doc
references a non-canonical location for generate-jwk.js which can cause silent
failures when setting ATPROTO_JWK_PRIVATE and PUBLIC_URL; update SKILL.md to
either (A) commit and reference a single canonical script path in this repo
(e.g., ensure generate-jwk.js exists under scripts/ and point to that) or (B)
provide a self-contained alternative command (for example a node -e one-liner
using the jose library) and include explicit instructions for setting
ATPROTO_JWK_PRIVATE and PUBLIC_URL; ensure the file name generate-jwk.js and the
env vars ATPROTO_JWK_PRIVATE and PUBLIC_URL are mentioned so readers can find
and run the correct script or fallback one-liner.


### "admin privileges required" after login
Ensure `TRUST_PROXY_HEADERS=true` is set on the backend. Without it, the backend ignores the `X-User-DID` header from the Next.js proxy.

## Setting Environment Variables

```bash
# Set a variable on a service
railway variables set 'KEY=value' -s backend
railway variables set 'KEY=value' -s frontend

# View all variables for a service
railway variables -s backend
railway variables -s frontend
```

After changing env vars, redeploy the affected service.
46 changes: 46 additions & 0 deletions .beads/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# SQLite databases
*.db
*.db?*
*.db-journal
*.db-wal
*.db-shm

# Daemon runtime files
daemon.lock
daemon.log
daemon.pid
bd.sock
sync-state.json
last-touched

# Local version tracking (prevents upgrade notification spam after git ops)
.local_version

# Legacy database files
db.sqlite
bd.db

# Worktree redirect file (contains relative path to main repo's .beads/)
# Must not be committed as paths would be wrong in other clones
redirect

# Merge artifacts (temporary files from 3-way merge)
beads.base.jsonl
beads.base.meta.json
beads.left.jsonl
beads.left.meta.json
beads.right.jsonl
beads.right.meta.json

# Sync state (local-only, per-machine)
# These files are machine-specific and should not be shared across clones
.sync.lock
.jsonl.lock
sync_base.jsonl
export-state/

# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
# They would override fork protection in .git/info/exclude, allowing
# contributors to accidentally commit upstream issue databases.
# The JSONL files (issues.jsonl, interactions.jsonl) and config files
# are tracked by git by default since no pattern above ignores them.
Empty file added .beads/.jsonl.lock
Empty file.
1 change: 1 addition & 0 deletions .beads/.local_version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.49.6
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove this file — per-machine version artifact should not be committed.

.local_version is explicitly listed as ignored in .beads/.gitignore. Committing it means every contributor's local Beads install could create conflicting version-mismatch diffs on this file.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.beads/.local_version at line 1, This file (.beads/.local_version) is a
per-machine artifact that should not be committed; remove the committed file
from the repository and restore the intended ignore behavior by deleting the
file from the index (e.g., run git rm --cached .beads/.local_version or remove
it via your GUI), commit that removal, and ensure .beads/.gitignore still
contains .local_version so future local versions are not tracked.

81 changes: 81 additions & 0 deletions .beads/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Beads - AI-Native Issue Tracking

Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.

## What is Beads?

Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.

**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)

## Quick Start

### Essential Commands

```bash
# Create new issues
bd create "Add user authentication"

# View all issues
bd list

# View issue details
bd show <issue-id>

# Update issue status
bd update <issue-id> --status in_progress
bd update <issue-id> --status done

# Sync with git remote
bd sync
```

### Working with Issues

Issues in Beads are:
- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
- **AI-friendly**: CLI-first design works perfectly with AI coding agents
- **Branch-aware**: Issues can follow your branch workflow
- **Always in sync**: Auto-syncs with your commits

## Why Beads?

**AI-Native Design**
- Built specifically for AI-assisted development workflows
- CLI-first interface works seamlessly with AI coding agents
- No context switching to web UIs

🚀 **Developer Focused**
- Issues live in your repo, right next to your code
- Works offline, syncs when you push
- Fast, lightweight, and stays out of your way

🔧 **Git Integration**
- Automatic sync with git commits
- Branch-aware issue tracking
- Intelligent JSONL merge resolution

## Get Started with Beads

Try Beads in your own projects:

```bash
# Install Beads
curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

curl | bash is a supply chain risk — suggest a pinned/verified install.

Piping a remote shell script directly to bash executes arbitrary code if the URL is ever compromised. Consider linking to a release artifact with a checksum verification step, or documenting a version-pinned install (e.g., via a GitHub release tag rather than main).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.beads/README.md at line 64, Replace the unpinned "curl | bash" install
command with instructions to download a specific release artifact and verify its
checksum before executing: change the shown one-liner (the curl to
https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh) to a
version-pinned workflow that downloads a release-tagged install script or
archive (use the repository release tag), fetches the accompanying checksum
(SHA256) and signature, verifies the checksum/signature locally, and only then
runs the installer (e.g., save to a file, verify with sha256sum/gpg, then run);
update the README text to explain the verification steps and recommend using
release tags instead of "main" to mitigate supply-chain risk.


# Initialize in your repo
bd init

# Create your first issue
bd create "Try out Beads"
```

## Learn More

- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
- **Quick Start Guide**: Run `bd quickstart`
- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)

---

*Beads: Issue tracking that moves at the speed of thought*
Binary file added .beads/beads.db
Binary file not shown.
Binary file added .beads/beads.db-shm
Binary file not shown.
Binary file added .beads/beads.db-wal
Binary file not shown.
67 changes: 67 additions & 0 deletions .beads/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Beads Configuration File
# This file configures default behavior for all bd commands in this repository
# All settings can also be set via environment variables (BD_* prefix)
# or overridden with command-line flags

# Issue prefix for this repository (used by bd init)
# If not set, bd init will auto-detect from directory name
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
# issue-prefix: ""

# Use no-db mode: load from JSONL, no SQLite, write back after each command
# When true, bd will use .beads/issues.jsonl as the source of truth
# instead of SQLite database
# no-db: false

# Disable daemon for RPC communication (forces direct database access)
# no-daemon: false

# Disable auto-flush of database to JSONL after mutations
# no-auto-flush: false

# Disable auto-import from JSONL when it's newer than database
# no-auto-import: false

# Enable JSON output by default
# json: false

# Default actor for audit trails (overridden by BD_ACTOR or --actor)
# actor: ""

# Path to database (overridden by BEADS_DB or --db)
# db: ""

# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
# auto-start-daemon: true

# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
# flush-debounce: "5s"

# Export events (audit trail) to .beads/events.jsonl on each flush/sync
# When enabled, new events are appended incrementally using a high-water mark.
# Use 'bd export --events' to trigger manually regardless of this setting.
# events-export: false

# Git branch for beads commits (bd sync will commit to this branch)
# IMPORTANT: Set this for team projects so all clones use the same sync branch.
# This setting persists across clones (unlike database config which is gitignored).
# Can also use BEADS_SYNC_BRANCH env var for local override.
# If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
# sync-branch: "beads-sync"

# Multi-repo configuration (experimental - bd-307)
# Allows hydrating from multiple repositories and routing writes to the correct JSONL
# repos:
# primary: "." # Primary repo (where this database lives)
# additional: # Additional repos to hydrate from (read-only)
# - ~/beads-planning # Personal planning repo
# - ~/work-planning # Work planning repo

# Integration settings (access with 'bd config get/set')
# These are stored in the database, not in this file:
# - jira.url
# - jira.project
# - linear.url
# - linear.api-key
# - github.org
# - github.repo
7 changes: 7 additions & 0 deletions .beads/daemon.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"pid": 46504,
"parent_pid": 46496,
"database": "/Users/david/Projects/gainforest/hyperindex/.beads/beads.db",
"version": "0.49.6",
"started_at": "2026-02-18T08:44:00.42754Z"
}
Loading