kepr

@june

Modern source forge for Koh repositories

TypeScript

v3.2.5 · 270 saves · 17,225 lines · updated 4 days ago

257 files
HEAD
public/381.3 KB · 4 days ago
css/68.5 KB · 4 days ago
fonts/269.0 KB · 1 week ago
js/43.5 KB · 5 days ago
favicon.svg309 B · 5 days ago
scripts/10.2 KB · 4 days ago
src/465.0 KB · 4 days ago
admin/116.9 KB · 4 days ago
bucket/42.8 KB · 4 days ago
describe/20.3 KB · 1 week ago
issues/54.6 KB · 4 days ago
mirror/39.5 KB · 1 week ago
pages/86.1 KB · 5 days ago
releases/24.4 KB · 1 week ago
server/70.3 KB · 4 days ago
tarball/7.8 KB · 6 days ago
main.ts2.2 KB · 1 week ago
tasks/1.2 KB · 1 week ago
tests/515.3 KB · 4 days ago
fixtures/93.2 KB · 2 weeks ago
kepr2/93.2 KB · 2 weeks ago
api_haven_releases_history.body352 B · 2 weeks agoapi_haven_releases_history.headers89 B · 2 weeks agoapi_haven_releases_latest.body908 B · 2 weeks agoapi_haven_releases_latest.headers89 B · 2 weeks agoapi_kepr_releases_history.body2.8 KB · 2 weeks agoapi_kepr_releases_history.headers89 B · 2 weeks agoapi_kepr_releases_latest.body889 B · 2 weeks agoapi_kepr_releases_latest.headers89 B · 2 weeks agoapi_koh_releases_2.1.0_linux-x86_64.headers99 B · 2 weeks agoapi_koh_releases_2.1.0_macos-aarch64.headers99 B · 2 weeks agoapi_koh_releases_2.1.16_linux-x86_64.body51 B · 2 weeks agoapi_koh_releases_2.1.16_linux-x86_64.headers58 B · 2 weeks agoapi_koh_releases_history.body9 B · 2 weeks agoapi_koh_releases_history.headers12 B · 2 weeks agoapi_koh_releases_latest.body2.1 KB · 2 weeks agoapi_koh_releases_latest.headers58 B · 2 weeks agoapi_nina_releases_history.body13.9 KB · 2 weeks agoapi_nina_releases_history.headers89 B · 2 weeks agoapi_nina_releases_latest.body1.8 KB · 2 weeks agoapi_nina_releases_latest.headers89 B · 2 weeks agoapi_nowhere_releases_latest.body53 B · 2 weeks agoapi_nowhere_releases_latest.headers58 B · 2 weeks agoapi_peach-android_releases_history.body27.1 KB · 2 weeks agoapi_peach-android_releases_history.headers89 B · 2 weeks agoapi_peach-android_releases_latest.body1.6 KB · 2 weeks agoapi_peach-android_releases_latest.headers89 B · 2 weeks agoapi_peach-relay_releases_history.body45 B · 2 weeks agoapi_peach-relay_releases_history.headers58 B · 2 weeks agoapi_peach-relay_releases_latest.body45 B · 2 weeks agoapi_peach-relay_releases_latest.headers58 B · 2 weeks agohaven_meta.body334 B · 2 weeks agohaven_meta.headers58 B · 2 weeks agohaven_releases_0.6.1_checksums.txt.body401 B · 2 weeks agohaven_releases_0.6.1_checksums.txt.headers52 B · 2 weeks agohaven_releases_0.6.1_haven-macos-aarch64.headers109 B · 2 weeks agohaven_releases_0.6.1_macos-aarch64.headers109 B · 2 weeks agohaven_releases_latest_version.txt.body5 B · 2 weeks agohaven_releases_latest_version.txt.headers52 B · 2 weeks agohaven_releases_latest.body0 B · 2 weeks agohaven_releases_latest.headers44 B · 2 weeks agohaven_update-info.body378 B · 2 weeks agohaven_update-info.headers58 B · 2 weeks agokepr_meta.body479 B · 2 weeks agokepr_meta.headers58 B · 2 weeks agokepr_releases_2.0.16_checksums.txt.body397 B · 2 weeks agokepr_releases_2.0.16_checksums.txt.headers52 B · 2 weeks agokepr_releases_2.0.16_kepr-linux-aarch64.headers114 B · 2 weeks agokepr_releases_2.0.16_linux-aarch64.headers114 B · 2 weeks agokepr_releases_latest_version.txt.body6 B · 2 weeks agokepr_releases_latest_version.txt.headers52 B · 2 weeks agokepr_releases_latest.body0 B · 2 weeks agokepr_releases_latest.headers44 B · 2 weeks agokepr_update-info.body377 B · 2 weeks agokepr_update-info.headers58 B · 2 weeks agokoh_meta.body491 B · 2 weeks agokoh_meta.headers58 B · 2 weeks agokoh_releases_2.1.0_checksums.txt.body753 B · 2 weeks agokoh_releases_2.1.0_checksums.txt.headers52 B · 2 weeks agokoh_releases_2.1.0_koh-linux-x86_64.headers112 B · 2 weeks agokoh_releases_2.1.0_linux-x86_64.headers112 B · 2 weeks agokoh_releases_latest_version.txt.body5 B · 2 weeks agokoh_releases_latest_version.txt.headers52 B · 2 weeks agokoh_releases_latest.body0 B · 2 weeks agokoh_releases_latest.headers42 B · 2 weeks agokoh_update-info.body678 B · 2 weeks agokoh_update-info.headers58 B · 2 weeks agonina_meta.body415 B · 2 weeks agonina_meta.headers58 B · 2 weeks agonina_releases_3.4.14_checksums.txt.body763 B · 2 weeks agonina_releases_3.4.14_checksums.txt.headers52 B · 2 weeks agonina_releases_3.4.14_linux-aarch64.headers114 B · 2 weeks agonina_releases_3.4.14_nina-linux-aarch64.headers114 B · 2 weeks agonina_releases_latest_version.txt.body6 B · 2 weeks agonina_releases_latest_version.txt.headers52 B · 2 weeks agonina_releases_latest.body0 B · 2 weeks agonina_releases_latest.headers44 B · 2 weeks agonina_update-info.body691 B · 2 weeks agonina_update-info.headers58 B · 2 weeks agopeach-android_meta.body362 B · 2 weeks agopeach-android_meta.headers58 B · 2 weeks agopeach-android_releases_2.17.43_android-arm64.headers135 B · 2 weeks agopeach-android_releases_2.17.43_checksums.txt.body441 B · 2 weeks agopeach-android_releases_2.17.43_checksums.txt.headers52 B · 2 weeks agopeach-android_releases_2.17.43_peach-android-android-arm64.headers135 B · 2 weeks agopeach-android_releases_latest_version.txt.body7 B · 2 weeks agopeach-android_releases_latest_version.txt.headers52 B · 2 weeks agopeach-android_releases_latest.body0 B · 2 weeks agopeach-android_releases_latest.headers54 B · 2 weeks agopeach-android_update-info.body414 B · 2 weeks agopeach-android_update-info.headers58 B · 2 weeks agopeach-relay_meta.body311 B · 2 weeks agopeach-relay_meta.headers58 B · 2 weeks agopeach-relay_update-info.body33 B · 2 weeks agopeach-relay_update-info.headers58 B · 2 weeks agorecord.shRecords Kepr 2's §22.4 compatibility routes from kepr.uk, GET only, into this folder: <slug>.headers (status line plus the headers the contract tests read) and <slug>.body.2.0 KB · 2 weeks agoschema.sql28.4 KB · 2 weeks ago
account.test.tsCovers the console's Account section (June, 2026-09-30): the admin password, other sessions and the domain, all changed without touching kepr.toml by hand, and applied without a restart.7.8 KB · 4 days agoadmin.test.ts8.1 KB · 1 week agobackup.test.ts6.4 KB · 1 week agobackupbucket.test.tsCovers the optional backup bucket (June, 2026-09-30): set, tested and removed in the console, written to kepr.toml by Kepr alone, each backup copied there with the newest 14 kept, and a failure shown and told once until an upload succeeds.6.1 KB · 1 week agobackupworkspace.test.tsCovers §24's backup workspace: every kept backup listed and downloadable, back up now, the last failure until a backup succeeds, and the written restore steps.3.4 KB · 1 week agobrowser.ts3.1 KB · 4 days agobucket.test.ts12.3 KB · 4 days agobucketadmin.test.tsCovers §24's Bucket section: masked secrets, the connection test, and a save that rewrites kepr.toml and applies the new settings without a restart.8.3 KB · 6 days agoconfig.test.ts2.5 KB · 6 days agoconnect.test.tsCovers connect setup, validation, one-time redemption, rate limits, admin history, and secrecy.15.0 KB · 6 days agoconsole.test.ts28.5 KB · 5 days agocontract.test.ts14.4 KB · 1 week agodescribe.test.ts9.8 KB · 2 weeks agodiff.test.ts2.9 KB · 2 weeks agodownloads.test.tsCovers §24's Downloads section: counts per UTC day, the last 30 days per repo or across all, each repo's totals, the most downloaded files, and dropping days older than 400.2.9 KB · 1 week agoemail.test.tsCovers §24's Email section: SMTP settings in kepr.toml, the test send, emailed notifications and the delivery queue's retries, retry now and discard.9.9 KB · 1 week agofake-s3.tsA bucket in memory, served over HTTP for the joint public-steal test: koh's own S3 backend and Bun's S3Client both talk to it, so Kepr and the two koh machines share one bucket.2.9 KB · 1 week agofixture.ts8.8 KB · 4 days agofollow.test.tsCovers §23's email updates: confirming before anything is sent, who is told what, stopping by link or one-click, and nothing offered without SMTP.11.2 KB · 4 days agofront.test.ts12.2 KB · 5 days agohidden.test.tsCovers per-repo hidden paths (June, 2026-09-30): gone from every page, the stats and new tarballs, kept hidden through later syncs, handed to Koh under .kepr/hidden/, and back on unhide.6.6 KB · 1 week agoignored.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.4.1 KB · 1 week agoimport.test.ts15.5 KB · 5 days agoinstall.test.ts4.5 KB · 1 week agoissues.test.ts18.6 KB · 4 days agokepr2.test.ts4.2 KB · 2 weeks agokoh-version.txt6 B · 5 days agokohpaths.test.ts3.6 KB · 1 week agokohrelease.test.ts7.2 KB · 1 week agokohremote.test.tsCovers addendum A2 part 2: Koh's own remote layout, served read-only from a public repo's mirror.8.5 KB · 1 week agokohsteal.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.15.4 KB · 6 days agokohupdate.test.ts11.0 KB · 1 week agolinks.test.ts2.8 KB · 2 weeks agonavbar.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.3.1 KB · 1 week agonotifications.test.tsCovers §24's in-app notifications: what raises one, unread state, opening, mark all read, switching kinds off, and keeping the newest 200.6.1 KB · 5 days agopages.test.ts23.8 KB · 5 days agoreleases.test.ts17.7 KB · 5 days agorename.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.3.4 KB · 1 week agorepodelete.test.tsCovers deleting a repo from the console (§24): the double confirmation, every key of that repo gone from the bucket with no other repo touched, and Kepr's own rows and mirror dropped with it.4.9 KB · 4 days agorepotext.test.ts8.6 KB · 6 days agorepoworkspace.test.tsCovers §24's selected-repo workspace: the summary, detected and shown languages, where the description comes from, and the repo's releases.9.3 KB · 1 week agoscript.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.615 B · 1 week agoserver.test.ts3.3 KB · 5 days agosetup.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.4.2 KB · 1 week agostorage.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.3.9 KB · 1 week agosync.test.ts22.7 KB · 1 week agotarball.test.ts13.3 KB · 1 week agotimeout.ts358 B · 1 week agototp.test.tsCovers §24's two-step sign-in: RFC 6238 itself, the step either side of now, and what is refused.2.4 KB · 4 days agotriage.test.tsCovers §23–§24's triage: tab counts, awaiting reply, repo/type/word filters, hiding one reply, and pausing new issues per repo.8.1 KB · 5 days agoversion.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.4.7 KB · 5 days agoworker.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.3.1 KB · 1 week ago
biome.json361 B · 2 weeks agobun.lock20.8 KB · 1 week agobunfig.toml40 B · 2 weeks agokepr.example.tomlCopy to kepr.toml (never saved: it holds the admin password hash and the bucket key).851 B · 1 week agopackage.json524 B · 4 days agoREADME.mdKepr is a self-hosted website for your Koh projects.1.3 KB · 1 week agotsconfig.json441 B · 2 weeks ago
f03421d19ef3pin koh3 3.0.108 and prove a stolen repo's offer stops on a clash instead of choosing a side (v3.0.70)2 weeks agobb2b6cc5f7e2record guided steal completion in Koh 3.0.102 (v3.0.69)2 weeks ago1d0e27dd457arecord that guided steal (8e) was discarded unbuilt, not in flight (v3.0.68)2 weeks ago1e6bacd9a98dclose the joint test's review: prove the explicit offer, every field, and the clock-order prune (v3.0.67)2 weeks agofe8c5250fc91upgrade a stolen repo through offer, and pin koh3 3.0.98 (v3.0.66)2 weeks ago1b4865e81200prove public steal end to end: list the saves and objects a clone walks, and prune the redemption limit by value (v3.0.65)2 weeks ago4c969e0a75afserve public repos read-only in Koh's remote layout (v3.0.64)2 weeks ago731c1ce0a9b6close the connect review findings and follow koh3 3.0.94's renamed view command (v3.0.63)2 weeks agob16612d47778hand out bucket access to a signed-in machine through a one-time code (v3.0.62)2 weeks ago4928df826985note why the hidden-checkbox row stays on one line, closing the last R11 finding (v3.0.61)2 weeks agoefb3a30ea420move the koh3 pin to the release build now installed, verified against the whole suite (v3.0.60)2 weeks ago75c84df65b78record the corrections and the final counts in continuity (v3.0.59)2 weeks ago2886f480bd44pin the mirror's strip landing with a regression test that fails without it, note why two long HTML rows stay whole, and move the koh3 pin to the binary it was verified with (v3.0.58)2 weeks ago47192351ee32close the joint update test's review: a tampered download refused with the binary untouched, a watchdog and a timeout on every wait, the temporary folders cleaned up, and the environment's limits named in the file (v3.0.57)2 weeks ago9445b343df7fmake the frozen Koh 2 route a permanent 404, keep executable bits in tarballs and confine the sandbox to raw files and uploaded assets, with the pin moved to the koh3 they were verified against (v3.0.56)2 weeks agocf30e2643e1arecord the campaign in AGENTS.md and continuity: the rebalanced budgets, the writing rules, the koh3 version pin and what the joint tests cover (v3.0.55)2 weeks agof4a466e83f88test that koh3 updates itself from a release Kepr served: check exit codes, an unreachable download refused with the binary untouched, and the installed copy signed and running (v3.0.54)2 weeks agodedcbd4f3830test the joint release contract with the real koh3: offer --builds publishes, Kepr serves the release on every route byte for byte, and the suite is pinned to the koh3 it was verified with (v3.0.53)2 weeks ago2b7a429de79aapply the rebalanced budgets and R11's normal layout across Kepr, and close the five fixes: the frozen Koh 2 404 body, executable bits in tarballs, the per-address sign-in lockout, the sandbox on raw files and uploaded assets, and Koh's own strip rule in the mirror (v3.0.52)2 weeks agodbdfebfae1f4refuse a kepr.toml domain whose port is outside 1-65535, closing the codex re-check of the review fixes (v3.0.51)2 weeks ago0f0b95ee972fdocument haproxy on the same host as the production reverse proxy in place of caddy (v3.0.50)2 weeks agod784c3018552record the kepr 3 campaign outcome and june's open decisions in continuity (v3.0.49)2 weeks agobb3469688eaarecord each Kepr 2 fixture request into a fresh header file and fail on curl errors other than the expected max-filesize stop, and note the review fixes in continuity (v3.0.48)2 weeks agofd5e11c6a76ctest that a whole-history strip already in the mirror strips late-arriving saves made before it and spares one made after (v3.0.47)2 weeks ago009e5c4064e1place timeline dots and card ticks between the earliest and latest save times, and end a /** */ description at its */ when code follows on the line (v3.0.46)2 weeks ago8722a5c608afgate Kepr 2's redirects behind the visibility check, treat a page past the last as page 1, refuse a non-hostname domain at startup, reject a flag or clear event with a path, and validate static paths before touching the disk (v3.0.45)2 weeks ago71ae032e7c17make the Kepr 2 import fail loudly before any bucket write on a bad imported row, credit replies to the operator only from Kepr 2's operator marks and refuse third-party ones, and accept a 412 only when the object holds the same bytes (v3.0.44)2 weeks ago946c9882a405add the one-time Kepr 2 import tool, writing put-if-absent and checked by the sync's own release validator, with a local-Postgres test, and record phase 8 in continuity (v3.0.43)2 weeks ago7ec223c3528aanswer Kepr 2's moved URLs with 301s and its retired ones with 410 Gone, refuse to sync bucket repos named like Kepr's own routes, and check the route list both ways (v3.0.42)2 weeks agob73f541c166bwrite backup download entries 0600 through a file mode on the tar writer, keeping source tarballs 0644, and refuse signatures over 60 KB before the body cap (v3.0.41)2 weeks agodbc8eb3d4b8acache per-save pages, raw files and tarballs as private for a year so no shared cache keeps a repo after it turns private, and note why a backup cannot interleave with a signature change (v3.0.40)2 weeks ago4538c2a89e9aadd daily backups of kepr.db by vacuum into plus assets into data/backups with the last 14 kept and sessions left out, the status page's last backup and download backup as a tarball, a restore test onto a fresh instance, the docs' admin and backup sections, and phase 7 in continuity (v3.0.39)2 weeks ago0c07b179ceebadd the admin site and profile section: site name, tagline, branding, handle, bio, location, link and building since, and a signature upload checked by magic bytes as png, jpeg or webp only, stored content-named under data/assets with svg refused (v3.0.38)2 weeks agof412b53f8e44add the admin releases section: every version per repo with download counts per platform, displayed notes stored in kepr.db over the record's, and hide or unhide, tested to drop a hidden version from pages, latest and every feed (v3.0.37)2 weeks ago1a15eaa5791badd the admin issues section: every repo's issues with open, closed and hidden filters, the reporter's contact detail, reply, close with an optional fixed-in save, reopen, hide, unhide and set type, tested end to end from a public filing to the operator's answer and close (v3.0.36)2 weeks ago0750fb5f4f0aadd the admin repos section: every repo the sync found with its visibility switch, category, homepage, card order, three install lines, last sync time and error, and sync now, tested to 404 every public surface and drop a private repo from every list and count (v3.0.35)2 weeks ago3917c91388dfadd the admin sign-in at /sign-in with an argon2id check, a per-address and global failure limit and a double-submit token, 30-day revocable sessions stored as hashes, sign-out, and the /admin guard requiring a session plus origin and form token on every post, with the status page (v3.0.34)2 weeks ago1c735cca38e4count public lines and languages at the newest real save so a checkpoint at head never reaches the cloud, bar, cards or header, follow reduced-motion changes in the hex glow, and test encoded traversal and nested asset paths (v3.0.33)2 weeks ago53b804b9db21serve /docs with the self-hosting guide and /support from markdown in the repo, rendered once at startup, and record phase 6 in continuity (v3.0.32)2 weeks ago9a87fc577759add the operator's profile at /@<handle>: the hex backdrop of real save ids with its glow island, the signature image served from data/assets or the handle in sacramento, settings-driven identity, public stats, the language bar, recent activity and repo cards, and a 404 for any other handle (v3.0.31)2 weeks agob623f609221badd the front page and browse: the drifting save-message ticker, the library's count of distinct objects, the file-type and category cloud, latest offered and shared repo cards with one tick per save, all from public repos and real saves only (v3.0.30)2 weeks agode6037e2c124rate-limit issue filing by the socket peer, taking x-forwarded-for's rightmost entry only from a loopback proxy (v3.0.29)2 weeks ago6fcced41a42cserve public issue pages: filing with honeypot, 3-second stamp, hashed-ip rate limit and size cap, one-time follow-up links, and the marked thread (v3.0.28)2 weeks ago755ef3f89667add the issues and thread tables to kepr.db with per-repo numbers, hashed follow-up tokens and the data layer the public pages read (v3.0.27)2 weeks ago3835b4d58a83take update-info's head from the actual head save, send cors on the api feeds' 404s, compare version components exactly, and refuse a releases/latest that is not a version (v3.0.26)2 weeks ago1fc904a2b237record phase 4 in continuity: release decisions, peach android's confirmed contract and the missing koh 2.1.16 release (v3.0.25)2 weeks agoa79b2f329d95serve the generic install.sh per repo, tested end to end against a stand-in s3, and add robots.txt, the public-repos sitemap and kepr 2's favicon (v3.0.24)2 weeks ago075f6d740acctest every recorded kepr 2 route against kepr 3: byte-exact feeds, history, version.txt, checksums and 404s, and the shape where the spec makes kepr 3 differ, with the frozen koh 2 route on 2.1.16 (v3.0.23)2 weeks ago0f7e06f66cceserve the release feeds, checksums and downloads of §22.1 and §22.4 with kepr 2's bytes and error bodies, count downloads before a five-minute presigned redirect, count nix tarball fetches as installs, and pin the koh 2 route on 2.1.16 (v3.0.22)2 weeks ago4622d4048bd6add the builds panel with versions newest first, notes or their fallback, per-file label, size, sha-256, download count and install hints, and show the newest release in the repo header (v3.0.21)2 weeks ago

← newerolder →

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.