Prerequisites
- Node.js 22.5+ — the server uses the built-in
node:sqlitemodule, which needs 22.5 or later. - Python 3 (optional) — lets
npm installauto-provision paperr's own bundled AI server. Skipped safely if Python isn't found; add it later and re-runnpm installinserver/to enable it. - Ollama or LM Studio (optional) — external local LLM providers, if you'd rather point dotAi at one of those instead of the bundled server.
Quick start
Fetch paperr and start the dev servers. install:all creates server/.env from the example and auto-generates real random JWT_SECRET / JWT_REFRESH_SECRET values — there's no manual copy/paste step, and it never overwrites secrets you've already set.
$ npx paperr # fetches paperr into ./paperr $ cd paperr $ npm run install:all # root + server + client deps, writes .env $ npm run dev # API :3000 · client :5173
$ git clone https://github.com/biswasprateek/paperr.git $ cd paperr $ npm run install:all # root + server + client deps, writes .env $ npm run dev # API :3000 · client :5173
# (re-)generate server/.env only — safe, never overwrites set secrets $ npm run setup:env
Both options land in the same place — the npm package is just a thin fetcher. paperr is a self-hosted app, not a library, so there's nothing to npm install into an existing project.
On first launch, the Setup Wizard walks you through creating your first space and admin account. Every new space is seeded with type-appropriate starter lists, a starter routine, and a "Welcome to Paperr" onboarding project that tours the app.
Bundled AI server
npm run install:all (which runs npm install inside server/) automatically provisions paperr's own local AI model via litert-lm — a small, efficient AI model that runs on as little as CPU in under 2GB of RAM, uses your iGPU or GPU when available — scaling to the hardware you have — and auto-offloads from memory when idle. It looks for a Python interpreter to build a project-local virtual environment at server/ai/litert/venv:
| Platform | Looks for |
|---|---|
| Windows | py -3, then python |
| macOS | python3, then python |
| Linux | python3, then python |
If no Python interpreter is found, this step is skipped with a warning and the rest of the install continues normally. Install Python 3 and re-run npm install in server/ to enable it later, or use Ollama / LM Studio instead. Once installed, manage the server — start/stop, live memory usage, auto-offload, model picker, extra models — from Settings → paperr AI Server.
Production
Recommended for everyday use. Build the client once, then let Express serve the API and app together on port 3000.
# one click — builds the client, then serves on :3000 > ./start-paperr.ps1 > ./start-paperr.ps1 -NoBuild # skip rebuild if current
# one click on macOS / Linux $ ./start-paperr.sh
$ npm run build # bundles the React app $ npm start # Express serves API + app on :3000
Then open http://<your-machine-ip>:3000 from any device on your network.
Network access
paperr binds to 0.0.0.0, so it's reachable from every device on your LAN. Find your local IP (ipconfig on Windows, ifconfig / ip a on Linux/macOS) and open:
$ http://192.168.x.x:3000Tip: Set a static IP or DHCP reservation for the host machine so the URL never changes, and add a desktop/taskbar shortcut to the launcher for one-click startup. Any spare tablet — an old iPad, a Fire tablet, an Android slate — can then be mounted as an always-on shared screen.
Configuration
server/.env is created automatically by npm run install:all, with the JWT secrets pre-generated. Edit it directly to adjust anything else:
| Variable | Default | Description |
|---|---|---|
PORT | 3000 | Server port |
JWT_SECRET | auto-generated | Signs access tokens |
JWT_REFRESH_SECRET | auto-generated | Signs refresh tokens |
DB_PATH | ./data/databases/paperr.db | SQLite database file path |
UPLOADS_PATH | ./uploads | File attachment storage |
LLM_BASE_URL | http://localhost:11434 | Ollama / LM Studio base URL |
LLM_MODEL | llama3 | Local model name for dotAi |
HTTPS_ENABLED | false | Enable TLS on the LAN (optional) |
Keep LLM_BASE_URL pointed at the bundled server or a local Ollama / LM Studio to stay fully private. Pointing it at an endpoint outside your LAN — OpenAI, OpenRouter, or any other hosted API — means the data dotAi reads is transmitted to that third party. See AI privacy.
Demo data
Want paperr pre-populated to explore? The seed script creates a fully-populated demo space — "The Reyes Family", 4 members, realistic tasks, projects, notes and routines across every section.
$ node scripts/seed-demo.cjs # log in with password: paperrdemo1
Log in as any member with the password paperrdemo1 (maya is admin). Re-running it wipes and recreates just that demo space.
Tech stack
| Layer | Technology |
|---|---|
| Runtime | Node.js 22.5+ (built-in node:sqlite) |
| API | Express.js |
| Database | SQLite via node:sqlite — single file, zero config, no native build |
| Auth | JWT (HTTP-only cookies) + bcrypt (bcryptjs) |
| Real-time | Socket.io |
| Scheduling | node-cron (backups, proactive agents) |
| Frontend | React 18 + Vite + React Router v6 |
| State | Zustand + React Query |
| Styling | Tailwind CSS |
| Editors / Charts / DnD / Dates | @uiw/react-md-editor · Recharts · @dnd-kit · date-fns |
| Bundled AI | litert-lm server paperr installs and supervises itself (Win / macOS / Linux) |
| External AI | Any OpenAI-compatible local LLM — Ollama, LM Studio, llama.cpp |
| Images | sharp — downscales curated Frame art to match uploads |
| License | Apache 2.0 |
Project layout
Want to contribute? See CONTRIBUTING.md in the repo for setup, PR guidelines, and how to file a bug report.