Author: RydalWater
GitLurker indexes open-source Bitcoin, Lightning, e-cash, Nostr, and related repositories, refreshes metadata from GitHub, and publishes a curated list on Nostr (Kind 30078 per project, Kind 10003 bookmark list). This repo is the FastAPI backend plus a Vite/React SPA.
GitLurker does not endorse any repository or project that appears in the seed data, on the site, or in relay events. Listings are for discovery only. Review source code, licenses, and trust assumptions yourself before installing or running third-party software. The maintainers are not responsible for downstream use of linked projects.
- Python 3.12+, uv
- Node.js (LTS) for the frontend
- A GitHub personal access token for live API data (optional in some dev modes)
- Copy
.env.exampleto.env.devat the repo root (gitlurker/.env.devfrom this folder’s parent layout — seedocs/DEV_ENVIRONMENT.md). - Set
AUTH_TOKEN(GitHub) and, for publishing,LURKER_KEYandNOSTR_RELAYS. KeepNOSTR_PUBLISH_ENABLED=falseuntil you intend to write to relays.
Backend (from gitlurker/backend):
uv sync
uv run uvicorn gitlurker.main:app --reload --host 127.0.0.1 --port 8080Frontend (from gitlurker/frontend):
npm install
npm run devIf the API is not on port 8000, set GITLURKER_DEV_API_ORIGIN (e.g. http://127.0.0.1:8080).
From gitlurker/backend:
uv run pytest
uv run ruff check --fix .
uv run ruff format .From gitlurker/frontend:
npm run testCanonical list: backend/fixtures/seed_projects.json (Django-style git_lurker.project rows). From gitlurker/backend:
uv run python -m gitlurker.scripts.seed
uv run python -m gitlurker.scripts.seed --no-github
uv run python -m gitlurker.scripts.seed --publishDefault is dry-run (no relay I/O). With --publish, you need NOSTR_PUBLISH_ENABLED=true, LURKER_KEY, and relays configured.
If any project is stale (e.g. missing on GitHub) and you do not pass --include-stale, the script writes backend/fixtures/stale_seed.json containing only those rows (same JSON shape as the seed file) so you can review or merge changes back into seed_projects.json. See the module docstring in backend/src/gitlurker/scripts/seed.py.
Values are illustrative; real events are signed and use your pubkey and timestamps.
Kind 30078 (project metadata) — content is compact JSON; tags carry the same fields for clients that scan tags:
{
"kind": 30078,
"content": "{\"owner\":\"bitcoin\",\"repo\":\"bitcoin\",\"name\":\"bitcoin\",\"category\":\"bitcoin\",\"subcategory\":\"node\",\"tracking_mode\":\"release\"}",
"tags": [
["d", "bitcoin/bitcoin"],
["name", "bitcoin"],
["description", "Bitcoin Core integration/staging tree"],
["owner", "bitcoin"],
["category", "bitcoin"],
["t", "node"],
["stars", "40000"],
["forks", "20000"],
["open_issues", "500"],
["web", "https://github.com/bitcoin/bitcoin"],
["clone", "https://github.com/bitcoin/bitcoin.git"],
["release", "v28.0"],
["release_date", "2024-10-01"],
["mode", "release"]
]
}Kind 10003 (bookmark list) — a tags reference each Kind 30078 replaceable coordinate (<kind>:<pubkey>:<d-tag>):
{
"kind": 10003,
"content": "",
"tags": [
["a", "30078:<hex_pubkey>:bitcoin/bitcoin", "wss://relay.example.com"],
["a", "30078:<hex_pubkey>:cashubtc/cashu", "wss://relay.example.com"]
]
}Tag naming matches backend/src/gitlurker/services/nostr.py (build_kind30078_builder, build_kind10003_builder).
Single template: .env.example (backend + optional VITE_* keys for the SPA). Details: docs/DEV_ENVIRONMENT.md.