Reference
Repository guide
On this page
Cookie-free website analytics in your own account. Add a script, count page loads, sources, campaigns and goal conversions, then export or restore history. The run site presents the product, launch instructions and documentation built from this repository's Markdown. Installed instances open on their own Lobby.
The public site is at https://run-vane.com.
Run locally
Install Git and RER, then:
npx -y @runeditrun/rer cli install
git clone https://github.com/just-every/run-vane.git
cd run-vane
rer devAdd the installer's printed directory to your shell PATH if requested. rer dev
installs pinned dependencies, selects Node 22.20.0, and prepares a local owner
and D1 database. The first launch takes a few minutes and prints progress. Open
RER_OPEN on this computer, confirm the owner on Finish setup, then open
Your sites. The link is a credential: keep it private. No external email is
sent. Repeating rer dev reuses the server. Stop with rer dev --stop.
For your own identity on a fresh checkout, use rer install, then
rer setup --owner-email you@example.com, then rer dev. Use rer dev --login
for ordinary email-link sign-in through the private local outbox. Local personas
rer dev --as admin and rer dev --as member use real administrator/read-only
roles. Never use the review identity as your production owner.
First website
- In Add a site, enter a name and exact origin, such as
https://fern.example. Enter/,/pricingand/thanksas allowed paths, one per line;signup=/thanksas a goal;launchas a campaign; andsearch.exampleas a referring hostname. Choose consent mode. List only public static paths and labels, never names, addresses or customer identifiers. - Prepare site, review the complete proposal in Approvals, then Approve change as owner. Administrators prepare; only the owner approves. Both actor and time are recorded.
- Open the site and Settings. Copy its script tag into your website. For
consent-required sites, load it after consent and set
window.vaneConsent = truebefore it runs. If your site has a CSP, allow Vane's origin inscript-srcandconnect-src. - Visit an allowed page, then
/thanks?utm_campaign=launch. Report shows page loads, the matching goal, sources and campaigns, and compares the current seven UTC days against the preceding seven days.
For a real local website, save an index.html containing the tag in a separate
folder outside this checkout and serve it with
python3 -m http.server 8098 --bind 127.0.0.1. Register
http://127.0.0.1:8098. Add thanks/index.html, approve /thanks/ and
signup=/thanks/, and visit those pages. Vane starts empty; no sample data loads.
Visits means accepted page loads, not unique people or sessions. Reloads count again. A goal is a load of its configured path. DNT and Global Privacy Control suppress collection. The script uses no cookies or browser storage. It sends approved paths/labels, a fresh event ID and consent state. Analytics stores no IP address, user agent, visitor ID, full URL or arbitrary properties. Owner sign-in data is separate.
Sampling is 10%, 25%, 50% or 100% of eligible loads. Counts are observed, never
scaled estimates. Unknown sources/campaigns become other; no referrer becomes
direct. Consent exclusions, blockers and unlisted pages are invisible, so
Vane does not claim complete traffic coverage or inferred causes. Non-browser
senders can spoof the public collector. Admission is capped at 10,000 page loads
per site per UTC day.
Import, undo and portability
The first move-in kit accepts Umami v2 Events API JSON pages. Read the documented shape and limits. In a site's History, upload, Preview import, inspect, then Apply import. Preview writes nothing. Apply records the owner, fingerprint and Base import-kit journal. Repeat the same reviewed page if processing remains. Undo import removes that import's unchanged contributions; repeat while undo is incomplete. Imported consent and sampling are unknown, rather than invented.
tests/fixtures/umami-events.json is synthetic test data with /, /thanks,
signup=/thanks, launch and search.example. Its October 2026 dates may fall
outside the current report window; select From 2026-10-01 and Until 2026-10-04
to see them. The full archive/journal retains all three records. Production never loads this fixture itself.
Data history → Download installation archive exports every site's analytics, proposals, deletion journal and import custody, excluding authentication. Restore from Data history after signing into an empty analytics installation. Supply any later export as Later journal: old archives are refused when it records a later deletion. A fresh installation cannot know about an omitted journal. Checksums detect corruption, not a malicious archive author; accept only your own archives. Browser transfer is limited to 10 MB / 50,000 rows. For larger installations:
rer dev --stop
rer export --output ../vane-installation.rer
# In an empty destination checkout, after rer install:
rer import --input ../vane-installation.rer --yesRER installation archives also carry access-control records, suspend local dev
identities, exclude sessions/secrets and preserve migration history. Supply
--journal ../later-installation.rer after erasure. Keep private settings and
archives outside source control. rer reset --yes destroys local state; export
before using it.
The owner can Prepare history erasure, then approve the permanent deletion. Apply retention erases events older than the configured 30, 90 or 365 days. Retention is manual in this release. Repeat until imported rows are processed. Deletion retires affected import custody and records a deletion fence.
Commands and roles
Agent command protocol: authenticated administrators prepare
site.create, site.configure and history.erase; the owner reviews and decides
in the UI. No approval command is exposed by the agent protocol. Every private
handler enforces native sessions and roles. Members read reports; owners import,
export, restore and approve deletion. Base's /auth/invite supports real member
and administrator invitations through ordinary email links.
Deploy
Stop dev and commit changes, then validate with no provider calls:
rer deploy --dry-runFor a real deploy, use a Cloudflare account with a workers.dev subdomain and a
Workers/D1 management token, plus a verified Resend sender. Set MAIL_FROM in
deploy.json to that sender and commit. Supply CLOUDFLARE_ACCOUNT_ID,
CLOUDFLARE_API_TOKEN, OWNER_EMAIL and MAIL_API_KEY in a private mode-0600
environment file outside this checkout, or your process environment. RER
supplies initial session/setup secrets and claims the owner. Never print or
commit values.
rer deploy --env-file /absolute/private/vane-deploy.envDeploy builds, creates D1, applies migrations and checks health/setup. It runs no
tests. Back up private .rer/deploy/ resource-ownership records. Open the hosted
address, sign in through your mailbox, finish setup and register your website.
Identity is analytics/vane, Worker vane-production, D1 vane-production-db;
do not rename these. Domain purchase is unnecessary. This round validates local
hosting and dry run, with no live provider calls.
Development
rer check --profile first-party
rer verifyVerify builds, typechecks, tests public flows and checks hosted assets. CI runs one Verify per push. Build/deploy do not run tests. See acceptance and source attribution. MIT licensed.
Run site and documentation
rer build --site writes the static run site to dist/site: the approved
Vane homepage, /run, /docs, seven Markdown guides and a not-found page.
The homepage and docs share the installed app's Geologica type, paper and ink
tokens, and indigo isobar artwork. All fonts and artwork are served locally.
rer dev prints the separate RER_SITE address alongside the installed app.
It preserves the installed / Lobby and never adds marketing routes to the app.
The docs manifest is src/site/docs/manifest.ts. Add or update repository
Markdown there; the site build reads the files directly. Links to published
Markdown become /docs links. Other repository files link to Source.
The site workflow is gated by RUN_SITE_DEPLOY and publishes to
https://run-vane.com on pushes to main when enabled. deploy-site.json
declares the public domain. There is no hosted demo.