kepr
Modern source forge for Koh repositories
timeline
atlas250 files
public/
css/
fonts/
js/
scripts/
src/
admin/
describe/
src/build/version.v in Koh 3): the first source that answers wins, so a VERSION file overrides everything, and nothing is evaluated: a value built from a variable or a call is skipped and the next source tried.mirror/
pages/
a and b are its 0-based line numbers in the old and new text.docs.tsfiles.tsfront.tshighlight.tshousekeeping.tshtml.tsMarkup that is already safe: built by html, or rendered by markdown-it with raw HTML off.kepr2.tslayout.tslibrary.tsmarkdown.tsprofile.tsreleases.tsrepo.tssave.tstimeline.tsreleases/
server/
tarball/
tests/
fixtures/
kepr2/
.kepr/hidden/, and back on unhide.ignored.test.tsCovers names ignored in every repo (June, 2026-10-01): a file or folder with that exact name, at any depth, is gone from every repo at once, stays gone in later saves, and comes back when the name is taken off the list.import.test.tsinstall.test.tsissues.test.tskepr2.test.tskoh-version.txtkohpaths.test.tskohrelease.test.tskohremote.test.tsCovers addendum A2 part 2: Koh's own remote layout, served read-only from a public repo's mirror.kohsteal.test.tsThe joint public-steal contract (addendum A2, item 8d): one machine publishes a repo to a bucket, Kepr serves it read-only over HTTP in Koh's own layout, a second koh steals it — and later, once that machine has signed in, offers its work back to the bucket.kohupdate.test.tslinks.test.tsnavbar.test.tsCovers the signed-in navbar (nav.js): "admin" and "log out" in place of "log in", built from the readable mark signing in sets beside the session.notifications.test.tsCovers §24's in-app notifications: what raises one, unread state, opening, mark all read, switching kinds off, and keeping the newest 200.pages.test.tsreleases.test.tsrename.test.tsCovers renaming a repo from the console (June, 2026-10-01): the history moves to the new name in the bucket with a marker left behind, Kepr's own rows and counts move with it, old page URLs redirect, and Koh follows the marker on its next offer.repotext.test.tsrepoworkspace.test.tsCovers §24's selected-repo workspace: the summary, detected and shown languages, where the description comes from, and the repo's releases.script.test.tsCovers kepr.js's start: every island it calls is defined, so one missing name can't stop the rest of the page's scripts.server.test.tssetup.test.tsCovers first-run setup (June, 2026-09-30): with no kepr.toml, Kepr serves only /setup, which takes the one-time code printed in the terminal, then the password, domain and bucket, writes kepr.toml itself, and hands over to the real app.storage.test.tsCovers §24's Storage section: sizes by repo and kind, kept tarballs with a delete each, and orphan cleanup that touches only Kepr's own files.sync.test.tstarball.test.tstimeout.tstriage.test.tsCovers §23–§24's triage: tab counts, awaiting reply, repo/type/word filters, hiding one follow-up, and pausing new issues per repo.version.test.tsCovers the version a repo's header shows without a build: what the project declares, by Koh's own rule (Koh 3's src/build/version.v), and a build's version over it.worker.test.tsCovers the sync on its own thread (2026-10-02): a real worker syncs a koh-made bucket, holds syncs off while the app works, and applies hidden lists.history
details
Kepr
Kepr is a self-hosted website for your Koh projects. It reads your Koh remote and lets people browse the code and history you choose to publish. You run it on your own domain, with your own storage, and keep working in Koh from the terminal.
Visitors can read highlighted source, see file descriptions, and inspect diffs at any save. They can download source archives or published releases, with checksums and update feeds available for releases. Bug reports and questions don't require a visitor account.
Each instance has one operator. Repositories start private; you choose which ones appear on the site. Kepr is built with TypeScript, Bun, Hono, and SQLite.
See Kepr in use · Self-hosting guide
Set up an instance
You'll need Bun and a Koh 3 remote. You can use an S3-compatible bucket or try Kepr locally with a folder remote. A public instance needs a domain and an HTTPS reverse proxy.
bun install --production
bun run start
On the first run, open /setup on your instance (http://localhost:3000/setup
locally). The terminal prints a setup code. Enter it in the browser and set your
password, domain, and storage connection. Kepr saves the configuration and
starts syncing from your remote.
Sign in to select the projects you want to make public.