← 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
M .env.exampleM AGENTS.mdM README.mdM db/schema.sqlM docs/ARCHITECTURE.mdM docs/COMPLIANCE.mdM docs/SPEC.mdM ecosystem.config.jsM lib/db.jsM lib/google-oauth.jsM package-lock.jsonM package.jsonM public/css/app.cssM public/js/sort-density.jsM scripts/deploy-kamatera.shM server.jsM tests/smoke.test.jsM views/home.ejsM views/partials/header.ejs
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 →