materialized brief
the deduplicated intent behind this repo
lore · 1d ago
build lore hub, a simplified github for the lore version control system, deployed at hub.lorevcs.com
lore · 1d ago
it should resemble github but much simpler: keep lots of space, simplicity is key, and make intelligent design choices
lore · 1d ago
use the lorevcs.com visual identity: teal with black and white, the loch ness monster ascii glyph in places, and the same monospace fonts as lorevcs.com
lore · 1d ago
accounts with email and password, and also allow login with google
lore · 1d ago
a home page showing trending repositories
lore · 1d ago
a profile page showing your repositories and a github-style activity chart
lore · 1d ago
allow starring and forking repositories
lore · 1d ago
a how-to page explaining how to push, pull, add a remote and so on
lore · 1d ago
engineering: use cloudflare products (d1 and friends), keep cost low, make it fast and simple
lore · 1d ago
for email behaviour, use cloudflare email routing and a worker to handle it
lore · 1d ago
lore hub is the lorehub http remote that lore reserves, so it must actually implement lore's transport protocol: real lore push, pull, clone and fetch must work against it, not just a lookalike ui
lore · 1d ago
build it as a single cloudflare worker using hono with server-rendered html and no client framework, backed by d1: simplest, cheapest and fastest for this text-heavy design
lore · 1d ago
store lore objects in d1 as a global content-addressed table rather than adding r2: lore objects are tiny, so this dedupes across the hub and keeps cost and moving parts down
lore · 1d ago
authenticate pushes with personal access tokens that the lore cli reads from LORE_TOKEN; reads are public; a token may only push to its owner's namespace; auto-create a repository on first push
lore · 1d ago
send outbound transactional email through resend and handle inbound mail with cloudflare email routing into the worker, because pure cloudflare cannot send to arbitrary recipients
lore · 1d ago
provision the cloudflare resources and deploy to the authenticated account during the build
lore · 1d ago
all repositories are public for the first version
lore · 1d ago
implement lore's content-addressed object model exactly: entries and commits as sha-256 addressed json, so identical intent dedupes for free
lore · 1d ago
an entry is addressed by its text alone; there is no kind field
lore · 1d ago
enforce fast-forward on the server by walking commit parents, and reject non-fast-forward pushes
lore · 1d ago
render a repository the way github shows files, but for lore that means the materialized brief: the deduplicated, chronological intent reachable from the branch tip, plus a commit log
lore · 1d ago
expose the five transport endpoints under owner and repo: list refs, head an object, get an object, put an object, and put a branch ref
lore · 1d ago
cache each repo's reachable object set so repository pages bulk-load every object in one query and stay fast, instead of one database read per object
lore · 1d ago
email and password accounts hashed with pbkdf2 via webcrypto, with database-backed sessions in a signed cookie
lore · 1d ago
sign in with google via oauth, creating or linking an account by google subject then email
lore · 1d ago
let users mint and revoke personal access tokens in settings for pushing, shown once with a copy-to-clipboard control
lore · 1d ago
lay the site out like github but simpler: a trending home, profiles, repository pages, settings and a how-to
lore · 1d ago
a profile contribution heatmap driven by real push events, attributing commits to accounts by author email so it works even for history pushed before the account existed
lore · 1d ago
star and fork from the repository page; forks share the content-addressed objects so they are instant
lore · 1d ago
carry the lorevcs.com design tokens verbatim: parchment and cream, near-black ink, a single teal accent, monospace everywhere, and hard offset shadows
lore · 1d ago
the favicon is the lorevcs.com favicon and the header is just the lore/hub wordmark, with no logo glyph
lore · 1d ago
the loch ness ascii art is the hero, sized to its container so it always renders undistorted and never scrolls
lore · 1d ago
send verification and password-reset mail through resend, degrading gracefully when no key is configured
lore · 1d ago
handle inbound mail with an email worker that records it and forwards it on
lore · 1d ago
create and migrate the d1 database, set the session secret, and deploy the worker to cloudflare
lore · 1d ago
the hub must round-trip with the real lore cli: push, clone and materialize against it for real
lore · 1d ago
document the remaining manual setup (custom domain, google oauth, resend, email routing) in the readme
lore · 1d ago
lore hub is itself a lore repository following the lore agents rules: record only the intent that dictates how the project works, never one-off bug reports or anything that could be pii
lore · 1d ago
a repository owner can delete their repo from a per-repo settings page, guarded by a type-the-full-name confirmation; deletion removes the repo's branches, stars and activity but keeps the shared content-addressed objects
lore · 1d ago
a repository owner can delete a repo over the transport with their access token (an authenticated DELETE), so history can be force-replaced by deleting then pushing fresh
lore · 1d ago
pull requests, github-style: merge intent from a head repo/branch into a base repo/branch, opened from either side by selecting to/from across the fork network; only the base repository's owner can merge; merges happen server-side (fast-forward, or a new merge commit with two parents) and move the base ref
lore · 1d ago
speak lore's batch transport (upstream commit c5a2090): POST /objects bulk-stores a json array of objects and POST /fetch returns the want/have reachable closure in one response, so push and fetch take a constant number of requests; store each object's exact raw bytes so full-precision u64 commit timestamps (and thus commit ids) round-trip; keep the per-object endpoints for older clients
lore · 1d ago
deleting a repository garbage-collects its objects that no remaining repo references, so a delete-then-push can truly replace history (e.g. re-author entries) instead of deduping against stale content-addressed copies; forking records the fork's object references so deleting a parent never collects objects a fork still shares