Skip to content


Repository files navigation


A simple, private website for your curriculum vitae

Designed for securing and sharing sensitive documents, links and downloads with small groups of people. Built in modern javascript. Intended for deployment to a serverless environment.

Stateless, serverless, simple.

  • file based - no databases or remote I/O
  • zero javascript on the front-end, minimal dependencies otherwise
  • limit access to documents with passphrases and time-limits
  • URLs structured for no-nonsense metrics
  • markdown-rendered pages and templates
  • API access built-in
  • deploys to Cloudflare Pages in <2mins
  • HMAC-backed stateless authentication

See it in action: ← use the passphrase "let me in"

🤖 Quick Start: life on the Edge in <2mins

CVMS is currently optimised for deployment to Cloudflare Pages - designed to play very nicely at the low-end of the generous free tier. To deploy the site per the example below you'll need a Cloudflare account (also free).

  1. Clone the repo
git clone
cd cv
  1. Install the app
npm install
  1. Publish to the edge 1
npm run publish
  1. Visit the published url and log in with the passphrase let me in

👻 Basic analytics

You can enable basic, domain-scoped analytics for your application by following the instructions in env.local.example to include the relevant information.

To view your admin-only analytics dashboard, first update the passphrase in routes/analytics/auth.json (the default value is "analytics") and then re-deploy the application. Once deployed, enter your updated passphrase on the homepage. Analytics metrics will begin populating soon after deployment.

Further detail coming soon ...

Still to do ...

  • basic analytics for routes (CF GraphQL API)
  • admin route to view stats
  • component attributes / variables / placeholders
  • markdown components
  • live editing: edit routes / markdown (GH API)


  1. A note for the wary: For those who live life far from the edge, or who simply prefer to test things locally before publishing to the world-wide-web, use npm run dev in place of step 3. ¯\_ (ツ)_/¯