linr.cc — visual timelines for careers, projects, and life stories.
Linr draws events as a git-style tree: lanes, branches, and connections over time. Data stays in your browser (localStorage). Export JSON for backup, or SVG/Print for sharing.
- Multiple timelines — create, switch, rename, and delete
- Range & punctual events — start/end dates or a single date
- Parent / bifurcation links — child events branch from a parent lane
- Optional description & image — URL or upload (stored as base64)
- Vertical or horizontal layout
- Fit / Expand — fit to screen, or expand to natural size with adaptive date ticks
- Hover cards — hover a line or node to see details; related parent/children highlight
- Import / Export
- JSON — full data backup (all timelines)
- SVG — vector of the active timeline (natural size)
- Print — print the same SVG
- Add events with a title, dates, color, and optional parent.
- Linr assigns lanes and draws connectors (solid for ranges, dashed for branches).
- Everything persists in
localStorageunder the Linr key. - Export JSON to move data between browsers; export SVG/Print for documents and slides.
No account, no server, no sync — by design.
Requirements: Node.js 20+ and npm.
npm install
npm run devOpen the URL Vite prints (usually http://localhost:5173).
| Command | Description |
|---|---|
npm run dev |
Dev server with HMR |
npm run build |
Production build → dist/ |
npm run preview |
Serve the production build locally |
npm run lint |
Lint with Oxlint |
Site: https://linr.cc
This is a static Vite app. Build output is in dist/.
- Push this repo to GitHub.
- Import the project in Vercel.
- Framework preset: Vite (build:
npm run build, output:dist). - Add the domain
linr.cc(andwwwif you want) in Vercel → Domains. - Point DNS at Vercel as they instruct (A/CNAME).
vercel.json in the repo sets SPA-friendly headers/caching.
Any static host works after npm run build:
- Netlify — publish
dist, usenetlify.toml - Cloudflare Pages — build command
npm run build, outputdist - GitHub Pages — serve
dist(setbaseinvite.config.jsif using a subpath)
-
npm run lintpasses -
npm run buildsucceeds -
npm run previewlooks correct - Custom domain DNS → host
- HTTPS enabled (automatic on Vercel/Netlify/Cloudflare)
src/
components/ # Timeline, Toolbar, EventEditor, …
hooks/ # useTimeline (state + persistence)
utils/ # layout, storage, SVG export
public/ # favicon, static assets
docs/ # design notes / specs
See CONTRIBUTING.md.
Private / unpublished unless otherwise stated. Contact the maintainers before redistributing.
