Glossary
Terms that come up in these docs and in the UI. Skim before reading the deeper guides if any of these feel unfamiliar.
Network & hosting
ValinorPC — the Ubuntu 24 machine in the office that hosts the intranet and Laurelin. Local IP 192.168.247.200. Not directly reachable from the internet — Cloudflare Tunnel is the only way in.
Cloudflare Tunnel — Cloudflare-operated tunnel that exposes ValinorPC to the public internet at intra.valinorinfo.com (the intranet) and laurelin.valinorinfo.com (Laurelin direct). cloudflared runs on the machine and dials out to Cloudflare; no router ports are opened, nothing on the public IP is exposed.
Cloudflare Access — the login wall in front of both URLs. Authenticates against @valinordigital.com. Emails a one-time code; sessions persist across visits. Anyone not on the Access policy literally cannot reach either URL — they see a sign-in page and never touch ValinorPC.
Nginx — the web server on ValinorPC that serves the intranet at port 80 (local-only). Cloudflare Tunnel proxies intra.valinorinfo.com to it. Nginx reads files from /var/www/team-site/.
Deployment
deploy.sh — the script that runs every 5 minutes via cron, pulls from GitHub if there are new commits, and copies files into the web root. Source: ~/valinor-intra/deploy.sh on ValinorPC.
JSX wrap — when you add a .jsx file to apps/, the deploy script wraps it in an HTML page with React 18 + Babel-standalone before serving it. Laurelin is the exception: it's bundled with esbuild for speed.
Manifest — /var/www/team-site/manifest.json, auto-generated by deploy.sh. Lists companies, apps, and docs. Currently informational; the homepage renders a hardcoded list.
systemd / valinor-intra.service — the Node process that runs server.js (Laurelin backend). deploy.sh restarts it when backend files change.
Laurelin — the four nouns
Company — an external organization (Bridge, Tempo, Stripe). Has email_domains, a stage, importance, health, an owner_id. Soft-deleted via deleted_at.
Person — an individual. Has person_type (internal for Valinor team, external for counterparties). Linked to companies via affiliations.
Project — a unit of work. Types include Deal, Fund, Product, Biz Dev, Research, Diligence, Legal, Internal. Has phase, deal_stage, project_stage, status, health, importance (1-10), intensity (0-10).
Interaction — something that happened: an email, call, meeting, note, telegram. Linked to a company, optionally a project, and any number of people.
Laurelin — fields & states
stage (company) — where a company sits in our funnel: dormant, prospect, exploring, active, core, passed, in_market.
ball_with — who owes the next move. us means we need to send the next reply. them means we're waiting.
importance (company) — high / medium / low. Used for sorting and dashboards.
health — green / yellow / red, or empty. A judgment call on how the relationship is going. Mirrored from project status updates onto the project record.
phase / deal_stage / project_stage — three orthogonal axes on a project. phase is a free-text milestone label. deal_stage walks the deal funnel (screening, IC, docs, closing, live, dead). project_stage walks the work funnel (scoping, planning, building, review, shipped, cancelled).
intensity (project) — 0-10, how active the work is right now. Drives the y-axis on the project dot plot.
importance (project) — 1-10, how much it matters strategically. Drives the x-axis on the dot plot, bucketed 1-3 / 4-6 / 7-10 for color.
ICP — Ideal Customer Profile. Free-text label on a company.
Sync
Sync Inbox — the queue of unrouted incoming interactions waiting for human approval. Open it, approve into a company, dismiss, or merge into an existing item.
Auto-router — the logic that classifies each incoming email/Slack/Telegram message. Known sender → log directly. Known domain, new person → auto-create person + log. Internal-only → skip. Unknown → Sync Inbox.
Watermark — a per-source-per-channel timestamp recording how far we've polled. Stops a worker restart from replaying history.
Skip rule — a pattern (sender, domain, subject substring) you set to permanently ignore. Stored in sync_skip_rules.
Domain blocklist — global "never auto-create a company for this domain" list (e.g., gmail.com, outlook.com). Stops a personal email from spawning a fake company.
Signature parser — a deterministic regex pass that reads email signatures on incoming mail and auto-fills phone / title / LinkedIn / Telegram on the matching person row. Capped at 3 attempts per person.
Lost-thread detector — a worker that scans outbound emails and flags ones you sent that haven't been replied to within a threshold. Two urgency tiers: normal and emergency.
Do-not-track — a per-contact toggle. Marks specific email addresses as "never log my correspondence with this person." Stored in email_do_not_track.
Sync — connector-specific
Channel mapping (Slack) — a sticky one-time choice: which company does #ext-tempo-valinor belong to? Once set, every future message in that channel routes to that company without asking.
Pairing code (Telegram) — a 10-minute HMAC-signed code that binds your Telegram user ID to your Laurelin person row. One-time per team member.
Business mode (Telegram) — Telegram's feature for letting a bot read chats from your personal account. Required because Laurelin's Telegram integration is a bot, not a userbot.
Data — under the hood
better-sqlite3 — the synchronous SQLite library Laurelin uses. No async/await on DB calls.
WAL — Write-Ahead Logging mode. Standard for SQLite in production. Means there are three files (.sqlite, .sqlite-wal, .sqlite-shm); a cp of just the first one can corrupt under load. Use scripts/backup-laurelin.sh to snapshot.
changelog — a table that records every UPDATE to companies/people/projects: who changed which field, when, from what to what. Used as an audit trail.
Soft-delete — deleted_at column set instead of deleting the row. Lets us undo and keeps FKs intact.
Migration block — the pattern in db.js after initSchema() that runs once per deploy to add columns to existing tables. Uses PRAGMA table_info(table) to check before adding.
Agents (Claude tooling)
Laurelin agents — five specialized Claude agents that handle Laurelin tasks: laurelin-database, laurelin-ui, laurelin-architect, laurelin-discovery, laurelin-supervisor. Definitions live in the valinor_claude repo, not this one.
Safety rules — laurelin-safety.md in the agents repo. Canonical enum lists, what an agent must never do (drop a table, push to main without a PR, etc.).