[object Object]

← back to AbramsOS

rename OwnershipOS → AbramsOS (per Steve): pkg/db/pm2/env/brand/sessions/localStorage all swept; tests + live server still green on :9931

434eca9788247d6c82f3c58700a1e96cc0e9520f · 2026-05-09 23:28:57 -0700 · Steve

Files touched

Diff

commit 434eca9788247d6c82f3c58700a1e96cc0e9520f
Author: Steve <steve@designerwallcoverings.com>
Date:   Sat May 9 23:28:57 2026 -0700

    rename OwnershipOS → AbramsOS (per Steve): pkg/db/pm2/env/brand/sessions/localStorage all swept; tests + live server still green on :9931
---
 .env.example               | 10 +++++-----
 AGENTS.md                  |  6 +++---
 README.md                  |  8 ++++----
 db/schema.sql              |  4 ++--
 docs/ARCHITECTURE.md       |  2 +-
 docs/COMPLIANCE.md         |  6 +++---
 docs/SPEC.md               | 10 +++++-----
 ecosystem.config.js        |  2 +-
 lib/db.js                  |  2 +-
 lib/google-oauth.js        |  8 ++++----
 package-lock.json          |  4 ++--
 package.json               |  6 +++---
 public/css/app.css         |  2 +-
 public/js/sort-density.js  |  6 +++---
 scripts/deploy-kamatera.sh |  4 ++--
 server.js                  |  6 +++---
 tests/smoke.test.js        |  2 +-
 views/home.ejs             |  4 ++--
 views/partials/header.ejs  |  4 ++--
 19 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/.env.example b/.env.example
index 65a5471..45ad264 100644
--- a/.env.example
+++ b/.env.example
@@ -7,7 +7,7 @@ BASE_URL=http://localhost:9931
 # Kamatera or remote: set PG_HOST to hostname/IP and provide PG_PASSWORD.
 PG_HOST=/tmp
 PG_PORT=5432
-PG_DATABASE=ownership_os
+PG_DATABASE=abrams_os
 PG_USER=stevestudio2
 PG_PASSWORD=
 
@@ -18,13 +18,13 @@ SESSION_SECRET=change-me-32-bytes-of-random
 ENCRYPTION_KEY=
 
 # Google OAuth — registered separately from george-gmail
-GOOGLE_OAUTH_OWNERSHIPOS_CLIENT_ID=
-GOOGLE_OAUTH_OWNERSHIPOS_CLIENT_SECRET=
-GOOGLE_OAUTH_OWNERSHIPOS_REDIRECT_URI=http://localhost:9931/auth/google/callback
+GOOGLE_OAUTH_ABRAMSOS_CLIENT_ID=
+GOOGLE_OAUTH_ABRAMSOS_CLIENT_SECRET=
+GOOGLE_OAUTH_ABRAMSOS_REDIRECT_URI=http://localhost:9931/auth/google/callback
 
 # Local LLM (Mac1 Ollama default per memory)
 OLLAMA_BASE_URL=http://192.168.1.133:11434
 OLLAMA_MODEL=qwen3:14b
 
 # Branded contact
-INFO_EMAIL=info@ownershipos.agentabrams.com
+INFO_EMAIL=info@abramsos.agentabrams.com
diff --git a/AGENTS.md b/AGENTS.md
index fb5a9ff..b90f1b3 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,4 +1,4 @@
-# AGENTS.md — OwnershipOS engineering guardrails
+# AGENTS.md — AbramsOS engineering guardrails
 
 This file is read by Claude Code, Codex, and any other coding agent that touches this repo. It overrides general defaults.
 
@@ -17,7 +17,7 @@ This file is read by Claude Code, Codex, and any other coding agent that touches
 ## Hard NOs
 
 - **No Anthropic API key.** Use the `claude` CLI or local Ollama. Never `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` in any process env.
-- **No mocking the database in tests** — use a throwaway `ownership_os_test` DB.
+- **No mocking the database in tests** — use a throwaway `abrams_os_test` DB.
 - **No specs/numbers in marketing body copy.** Editorial prose only; structured fields live in the schema.
 - **No external action without an `audit_log` entry** referencing the consent grant that authorized it.
 - **No PII to model providers** without redaction. Redact name, address, account numbers, MRN, NDC-as-PHI before any prompt.
@@ -42,7 +42,7 @@ This file is read by Claude Code, Codex, and any other coding agent that touches
 
 ## Compliance posture
 
-OwnershipOS is consumer-only today. Medical features are gated behind a separate consent grant and (eventually) a HIPAA-grade deployment lane. See `docs/COMPLIANCE.md`. Until that lane exists, do **not** ingest provider-sourced PHI; user-uploaded medical receipts are fine.
+AbramsOS is consumer-only today. Medical features are gated behind a separate consent grant and (eventually) a HIPAA-grade deployment lane. See `docs/COMPLIANCE.md`. Until that lane exists, do **not** ingest provider-sourced PHI; user-uploaded medical receipts are fine.
 
 ## Standing rules inherited from Steve's global instructions
 
diff --git a/README.md b/README.md
index 4c4b4d5..1e46aeb 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-# OwnershipOS
+# AbramsOS
 
 A household "rights operating system." Ingests receipts (Gmail), warranties, recall feeds, and service guarantees into a unified ownership graph; runs a case engine that decides what's owned, what risks/deadlines apply, and what next action is worth taking.
 
-**Status:** scaffold + Gmail-connector MVP. Single-user local. Port 9931. Standalone PG (`ownership_os`).
+**Status:** scaffold + Gmail-connector MVP. Single-user local. Port 9931. Standalone PG (`abrams_os`).
 
 **Canonical spec:** [`docs/SPEC.md`](docs/SPEC.md). Roadmap in [`docs/ROADMAP.md`](docs/ROADMAP.md). Architecture in [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md). Schema in [`docs/DATA-MODEL.md`](docs/DATA-MODEL.md). Compliance posture in [`docs/COMPLIANCE.md`](docs/COMPLIANCE.md). Engineering guardrails in [`AGENTS.md`](AGENTS.md).
 
@@ -10,8 +10,8 @@ A household "rights operating system." Ingests receipts (Gmail), warranties, rec
 
 ```bash
 npm install
-createdb ownership_os                 # one-time
-psql -d ownership_os -f db/schema.sql # idempotent
+createdb abrams_os                 # one-time
+psql -d abrams_os -f db/schema.sql # idempotent
 cp .env.example .env                  # then fill ENCRYPTION_KEY + Google OAuth via /secrets
 npm start                             # → http://localhost:9931
 ```
diff --git a/db/schema.sql b/db/schema.sql
index f9eb01f..4cbe703 100644
--- a/db/schema.sql
+++ b/db/schema.sql
@@ -1,5 +1,5 @@
--- OwnershipOS — declarative current schema (v0.1, Phase 0)
--- Apply: psql -d ownership_os -f db/schema.sql
+-- AbramsOS — declarative current schema (v0.1, Phase 0)
+-- Apply: psql -d abrams_os -f db/schema.sql
 -- Idempotent. For deltas after this, use db/migrations/NNNN_*.sql.
 
 BEGIN;
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index b3a3aea..156110d 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -22,7 +22,7 @@ See `SPEC.md` for the source-of-truth diagrams. This file holds the runtime view
        │     lib/gmail-fetcher    lib/db (pg.Pool)
        │     lib/google-oauth         │
        │           │                  ▼
-       └───────────┴───────────►  PostgreSQL ownership_os
+       └───────────┴───────────►  PostgreSQL abrams_os
                                    ├ user_account
                                    ├ consent_grant
                                    ├ connector_account (refresh_token AES-256-GCM)
diff --git a/docs/COMPLIANCE.md b/docs/COMPLIANCE.md
index aefa175..28618c7 100644
--- a/docs/COMPLIANCE.md
+++ b/docs/COMPLIANCE.md
@@ -1,6 +1,6 @@
 # Compliance Posture
 
-OwnershipOS is **consumer-only** in v0 and operates as a personal tool for Steve. The compliance bar will rise in lockstep with each milestone in `ROADMAP.md`. Document this file as the system grows.
+AbramsOS is **consumer-only** in v0 and operates as a personal tool for Steve. The compliance bar will rise in lockstep with each milestone in `ROADMAP.md`. Document this file as the system grows.
 
 ## Today (Phase 0)
 
@@ -10,7 +10,7 @@ OwnershipOS is **consumer-only** in v0 and operates as a personal tool for Steve
 | OAuth | server-side authorization-code flow against Google for Gmail readonly |
 | Tokens | refresh tokens AES-256-GCM-encrypted at rest with `ENCRYPTION_KEY` |
 | Scopes | `gmail.readonly` + `userinfo.email` ONLY (tighter than george-gmail's full-workspace bundle) |
-| Data residency | local PG `ownership_os` on Mac2; nothing in cloud yet |
+| Data residency | local PG `abrams_os` on Mac2; nothing in cloud yet |
 | PII handling | no redaction yet — single-user; do NOT add multi-tenant until redaction lands |
 | Model providers | local Ollama qwen3:14b on Mac1 only; **no Anthropic API**, no OpenAI calls |
 | HIPAA | N/A — no PHI ingested in v0; medical_* tables not implemented |
@@ -41,4 +41,4 @@ OwnershipOS is **consumer-only** in v0 and operates as a personal tool for Steve
 
 ## Not legal advice
 
-OwnershipOS produces drafts and educational content. It is not a lawyer, an insurance agent, or a billing service. Output should always carry a "for your review" framing in the UI; do not auto-send anything that asserts a legal claim without the user reading and approving the exact text.
+AbramsOS produces drafts and educational content. It is not a lawyer, an insurance agent, or a billing service. Output should always carry a "for your review" framing in the UI; do not auto-send anything that asserts a legal claim without the user reading and approving the exact text.
diff --git a/docs/SPEC.md b/docs/SPEC.md
index b589edc..161bae9 100644
--- a/docs/SPEC.md
+++ b/docs/SPEC.md
@@ -1,16 +1,16 @@
-# OwnershipOS — Canonical Specification
+# AbramsOS — Canonical Specification
 
 > Captured verbatim from the project kickoff brief, 2026-05-09. Source of truth for product scope. Update only by appending dated revision sections; do not rewrite history.
 
 ## Executive summary
 
-OwnershipOS is viable, but only if it is designed as a consent-led, event-driven consumer protection system rather than a generic "receipt manager." The winning architecture is a source-of-truth graph that merges inbox receipts, marketplace exports, card transactions, product identifiers, medical device/drug registries, warranties, service commitments, recall feeds, and jurisdiction-specific rights rules into a single case engine. That engine should decide three things continuously: **what the user owns or purchased, what risks or deadlines now apply, and what action is worth taking next**. The official data landscape is strong for recalls and regulated medical products — especially through the U.S. Consumer Product Safety Commission, NHTSA, FDA / openFDA, AccessGUDID, DailyMed, RxNorm, and Medicare DME supplier directories — but fragmented for retail guarantees, service promises, and card benefits, which are spread across merchant policies, issuer benefit guides, and consumer-protection rules.
+AbramsOS is viable, but only if it is designed as a consent-led, event-driven consumer protection system rather than a generic "receipt manager." The winning architecture is a source-of-truth graph that merges inbox receipts, marketplace exports, card transactions, product identifiers, medical device/drug registries, warranties, service commitments, recall feeds, and jurisdiction-specific rights rules into a single case engine. That engine should decide three things continuously: **what the user owns or purchased, what risks or deadlines now apply, and what action is worth taking next**. The official data landscape is strong for recalls and regulated medical products — especially through the U.S. Consumer Product Safety Commission, NHTSA, FDA / openFDA, AccessGUDID, DailyMed, RxNorm, and Medicare DME supplier directories — but fragmented for retail guarantees, service promises, and card benefits, which are spread across merchant policies, issuer benefit guides, and consumer-protection rules.
 
 The core product insight is that **the hard problem is not AI generation; it is rights-aware orchestration**. Models can gather missing facts, normalize purchases, match recalls, draft letters, assemble claim packets, and prepare disputes — but external side effects must be constrained by user approvals, standing consent, and auditable policy gates. Anthropic's Claude Code and MCP stack are well-aligned with a multi-agent buildout and per-user connector model; OpenAI's tool and function-calling primitives are suitable for production orchestration and selective tool loading.
 
 The biggest product constraints are access and compliance. There is no general published consumer-order API for retail Amazon purchases analogous to seller APIs; the official consumer paths are order history, product-safety alerts, and personal-data requests. Likewise, WhatsApp officially supports chat export and backup/transfer flows for users, but that is not the same as an open personal-history API. Credit-card protections also split between public-law rights and issuer-specific benefits. That means an MVP should focus first on mail/calendar connectors, official recall feeds, user-authorized exports, receipt ingestion, warranty parsing, deadline reminders, and draft-first claim automation. Full autonomy — auto-registering products, sending letters, launching disputes, filing regulator complaints, or submitting medical safety reports — should come later, with explicit approval tiers and stronger legal/compliance controls.
 
-The recommended product positioning is therefore: **"a household rights operating system"** with first-class support for products, services, medical equipment, and pharmaceuticals. It should behave like a blend of asset registry, recall sentinel, warranty manager, service-guarantee tracker, travel-rights assistant, and claim-prep engine. In the early product, every risky action should end as a prepared draft. In the mature product, low-risk actions can run automatically under standing consent while high-risk actions remain user-approved. That sequencing is what makes OwnershipOS ambitious but operable.
+The recommended product positioning is therefore: **"a household rights operating system"** with first-class support for products, services, medical equipment, and pharmaceuticals. It should behave like a blend of asset registry, recall sentinel, warranty manager, service-guarantee tracker, travel-rights assistant, and claim-prep engine. In the early product, every risky action should end as a prepared draft. In the mature product, low-risk actions can run automatically under standing consent while high-risk actions remain user-approved. That sequencing is what makes AbramsOS ambitious but operable.
 
 ## Integration and source strategy
 
@@ -199,7 +199,7 @@ Produce a plain-language verdict per item: **worth it / borderline / skip**.
 
 ## Security, privacy, compliance
 
-Mirror HIPAA-style safeguards even in consumer deployments because medical features will drift toward PHI. Use OAuth 2.0 authorization-code with PKCE for public clients, short-lived service credentials, refresh-token vault. Anthropic explicitly warns that third-party MCP servers can create prompt-injection risk → OwnershipOS needs a **Connector Security Gateway** with URL allowlists, schema validation, content sanitization, and egress restrictions.
+Mirror HIPAA-style safeguards even in consumer deployments because medical features will drift toward PHI. Use OAuth 2.0 authorization-code with PKCE for public clients, short-lived service credentials, refresh-token vault. Anthropic explicitly warns that third-party MCP servers can create prompt-injection risk → AbramsOS needs a **Connector Security Gateway** with URL allowlists, schema validation, content sanitization, and egress restrictions.
 
 Required posture (non-negotiable):
 
@@ -242,4 +242,4 @@ MVP realistic at 4–6 months. Full platform 9–15 months. Build cost MVP $0.9M
 4. Service guarantees are merchant-specific; depends on policy ingestion + screenshot preservation.
 5. Medical compliance boundary depends on go-to-market lane (consumer vs provider channel).
 
-**Strategic conclusion:** build OwnershipOS as a rights-aware evidence engine with progressive autonomy, not a generic AI concierge.
+**Strategic conclusion:** build AbramsOS as a rights-aware evidence engine with progressive autonomy, not a generic AI concierge.
diff --git a/ecosystem.config.js b/ecosystem.config.js
index b1944f8..405a251 100644
--- a/ecosystem.config.js
+++ b/ecosystem.config.js
@@ -1,7 +1,7 @@
 module.exports = {
   apps: [
     {
-      name: 'ownershipos',
+      name: 'abramsos',
       script: './server.js',
       cwd: __dirname,
       instances: 1,
diff --git a/lib/db.js b/lib/db.js
index 6a99897..4ef9a20 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -3,7 +3,7 @@ const { Pool } = require('pg');
 const cfg = {
   host: process.env.PG_HOST || 'localhost',
   port: parseInt(process.env.PG_PORT || '5432', 10),
-  database: process.env.PG_DATABASE || 'ownership_os',
+  database: process.env.PG_DATABASE || 'abrams_os',
   user: process.env.PG_USER || process.env.USER,
   max: 10,
   idleTimeoutMillis: 30_000,
diff --git a/lib/google-oauth.js b/lib/google-oauth.js
index 7e6035c..020ced7 100644
--- a/lib/google-oauth.js
+++ b/lib/google-oauth.js
@@ -6,11 +6,11 @@ const SCOPES = [
 ];
 
 function client() {
-  const id = process.env.GOOGLE_OAUTH_OWNERSHIPOS_CLIENT_ID;
-  const secret = process.env.GOOGLE_OAUTH_OWNERSHIPOS_CLIENT_SECRET;
-  const redirect = process.env.GOOGLE_OAUTH_OWNERSHIPOS_REDIRECT_URI;
+  const id = process.env.GOOGLE_OAUTH_ABRAMSOS_CLIENT_ID;
+  const secret = process.env.GOOGLE_OAUTH_ABRAMSOS_CLIENT_SECRET;
+  const redirect = process.env.GOOGLE_OAUTH_ABRAMSOS_REDIRECT_URI;
   if (!id || !secret || !redirect) {
-    throw new Error('Google OAuth env vars not configured. Set GOOGLE_OAUTH_OWNERSHIPOS_{CLIENT_ID,CLIENT_SECRET,REDIRECT_URI} via /secrets.');
+    throw new Error('Google OAuth env vars not configured. Set GOOGLE_OAUTH_ABRAMSOS_{CLIENT_ID,CLIENT_SECRET,REDIRECT_URI} via /secrets.');
   }
   return new google.auth.OAuth2(id, secret, redirect);
 }
diff --git a/package-lock.json b/package-lock.json
index 7e94015..67f8334 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
 {
-  "name": "ownershipos",
+  "name": "abramsos",
   "version": "0.1.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "ownershipos",
+      "name": "abramsos",
       "version": "0.1.0",
       "license": "UNLICENSED",
       "dependencies": {
diff --git a/package.json b/package.json
index e686356..6e3e327 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "ownershipos",
+  "name": "abramsos",
   "version": "0.1.0",
   "description": "Household rights operating system — receipts, warranties, recalls, claims",
   "main": "server.js",
@@ -7,8 +7,8 @@
     "start": "node server.js",
     "dev": "nodemon server.js",
     "test": "node --test tests/*.test.js",
-    "migrate": "psql -d ownership_os -f db/schema.sql",
-    "seed": "psql -d ownership_os -f db/seed.sql"
+    "migrate": "psql -d abrams_os -f db/schema.sql",
+    "seed": "psql -d abrams_os -f db/seed.sql"
   },
   "dependencies": {
     "cookie-session": "^2.1.0",
diff --git a/public/css/app.css b/public/css/app.css
index 5dfd4a3..ca78802 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -1,4 +1,4 @@
-/* OwnershipOS — liquid-glass UI tokens */
+/* AbramsOS — liquid-glass UI tokens */
 
 :root {
   --bg-0: #0a0f1c;
diff --git a/public/js/sort-density.js b/public/js/sort-density.js
index 41cb5b1..7f349f2 100644
--- a/public/js/sort-density.js
+++ b/public/js/sort-density.js
@@ -1,4 +1,4 @@
-// Canonical sort + density slider for OwnershipOS grids.
+// Canonical sort + density slider for AbramsOS grids.
 // Inherits the pattern from /sort-skill (corkwallcovering, dw-collections-viewer).
 // Persists choices in localStorage so they survive reloads.
 
@@ -9,8 +9,8 @@
   const sortSelect = document.getElementById('sortSelect');
   const densityRange = document.getElementById('densityRange');
 
-  const SORT_KEY = 'ownershipos.sort.purchase';
-  const DENSITY_KEY = 'ownershipos.density.purchase';
+  const SORT_KEY = 'abramsos.sort.purchase';
+  const DENSITY_KEY = 'abramsos.density.purchase';
 
   function applyDensity(px) {
     grid.style.gridTemplateColumns = `repeat(auto-fill, minmax(${px}px, 1fr))`;
diff --git a/scripts/deploy-kamatera.sh b/scripts/deploy-kamatera.sh
index 886a3b6..fa64e69 100755
--- a/scripts/deploy-kamatera.sh
+++ b/scripts/deploy-kamatera.sh
@@ -1,5 +1,5 @@
 #!/usr/bin/env bash
-# Deferred. OwnershipOS stays local-only until Steve confirms the Gmail flow ingests his real receipts cleanly.
-# When ready: rsync to /root/Projects/OwnershipOS, install deps, migrate PG, register pm2, point CF + LE.
+# Deferred. AbramsOS stays local-only until Steve confirms the Gmail flow ingests his real receipts cleanly.
+# When ready: rsync to /root/Projects/AbramsOS, install deps, migrate PG, register pm2, point CF + LE.
 echo "[deploy-kamatera] not implemented — local-only by design today. See docs/ROADMAP.md."
 exit 1
diff --git a/server.js b/server.js
index 0aa3ac8..2b42253 100644
--- a/server.js
+++ b/server.js
@@ -26,7 +26,7 @@ app.use(express.json({ limit: '2mb' }));
 app.use(express.urlencoded({ extended: true }));
 
 app.use(cookieSession({
-  name: 'oos.sid',
+  name: 'aos.sid',
   keys: [process.env.SESSION_SECRET || 'dev-only-rotate-me'],
   maxAge: 24 * 60 * 60 * 1000,
   sameSite: 'lax',
@@ -35,7 +35,7 @@ app.use(cookieSession({
 }));
 
 // Make INFO_EMAIL available to all views
-app.locals.infoEmail = process.env.INFO_EMAIL || 'info@ownershipos.agentabrams.com';
+app.locals.infoEmail = process.env.INFO_EMAIL || 'info@abramsos.agentabrams.com';
 app.use((req, res, next) => { res.locals.infoEmail = app.locals.infoEmail; next(); });
 
 app.use(express.static(path.join(__dirname, 'public'), { maxAge: '0' }));
@@ -53,7 +53,7 @@ app.use((err, _req, res, _next) => {
 
 if (require.main === module) {
   app.listen(PORT, () => {
-    console.log(`[ownershipos] listening on http://localhost:${PORT}`);
+    console.log(`[abramsos] listening on http://localhost:${PORT}`);
   });
 }
 
diff --git a/tests/smoke.test.js b/tests/smoke.test.js
index da80c8e..8149b93 100644
--- a/tests/smoke.test.js
+++ b/tests/smoke.test.js
@@ -38,7 +38,7 @@ test('healthz returns 200', async () => {
 test('home renders', async () => {
   const r = await get('/');
   assert.strictEqual(r.status, 200);
-  assert.match(r.body, /OwnershipOS/);
+  assert.match(r.body, /AbramsOS/);
 });
 
 test('connectors page renders', async () => {
diff --git a/views/home.ejs b/views/home.ejs
index a288548..a572e07 100644
--- a/views/home.ejs
+++ b/views/home.ejs
@@ -2,7 +2,7 @@
 
 <section class="hero glass">
   <h1>Your ownership, in one place.</h1>
-  <p class="subtle">OwnershipOS quietly tracks what you own, what risks apply, and what's worth doing about it.</p>
+  <p class="subtle">AbramsOS quietly tracks what you own, what risks apply, and what's worth doing about it.</p>
 </section>
 
 <section class="stat-row">
@@ -23,7 +23,7 @@
 <% if (connectorCount === 0) { %>
   <section class="cta glass">
     <h2>Connect your inbox to begin</h2>
-    <p>OwnershipOS reads receipts only — no sending, no scanning your other mail. You can revoke access any time.</p>
+    <p>AbramsOS reads receipts only — no sending, no scanning your other mail. You can revoke access any time.</p>
     <a class="button primary" href="/auth/google/start">Connect Gmail</a>
   </section>
 <% } %>
diff --git a/views/partials/header.ejs b/views/partials/header.ejs
index 311e9b0..f69e3ee 100644
--- a/views/partials/header.ejs
+++ b/views/partials/header.ejs
@@ -3,7 +3,7 @@
 <head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
-  <title><%= typeof title !== 'undefined' ? title + ' · OwnershipOS' : 'OwnershipOS' %></title>
+  <title><%= typeof title !== 'undefined' ? title + ' · AbramsOS' : 'AbramsOS' %></title>
   <link rel="stylesheet" href="/css/app.css">
   <script>
     (function () {
@@ -17,7 +17,7 @@
 <body>
   <header class="topbar glass">
     <div class="brand">
-      <a href="/">OwnershipOS</a>
+      <a href="/">AbramsOS</a>
       <span class="version">v0.1</span>
     </div>
     <nav>

← ef35e84 smoke green: PG via /tmp socket (peer auth), test glob fix,  ·  back to AbramsOS  ·  feat: 'Import all receipts' button + 2FA gate + Plaid sandbo 2113e8d →