← back to Abrams
v0.7: info-hub from search-specialist subagent (27 trusted sources)
f9efb49b73c420287aec41ca7ee647920ced7fbb · 2026-05-14 09:28:29 -0700 · Steve Abrams
- search-specialist landed: USPTO + FTC CAN-SPAM + CCPA + Gmail bulk-sender + Mozilla Observatory + Web Vitals + 21 more
- 7 categories: Legal IP (6) / Operator Tooling (5) / Self-Audit (5) / Email Compliance (4) / Founder Bookkeeping (3) / Trademark Law (2) / Industry Intel (2)
- /hub page with filter + category dropdown + mobile-friendliness stars + MFA badges
- /api/info-hub + /api/competitors (md proxy) endpoints
- corner-nav drawer: Info Hub link added
Files touched
M data/build-log.jsonlA data/competitors.mdA data/info-hub.jsonA public/hub.htmlM public/js/corner-nav.jsM server.js
Diff
commit f9efb49b73c420287aec41ca7ee647920ced7fbb
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu May 14 09:28:29 2026 -0700
v0.7: info-hub from search-specialist subagent (27 trusted sources)
- search-specialist landed: USPTO + FTC CAN-SPAM + CCPA + Gmail bulk-sender + Mozilla Observatory + Web Vitals + 21 more
- 7 categories: Legal IP (6) / Operator Tooling (5) / Self-Audit (5) / Email Compliance (4) / Founder Bookkeeping (3) / Trademark Law (2) / Industry Intel (2)
- /hub page with filter + category dropdown + mobile-friendliness stars + MFA badges
- /api/info-hub + /api/competitors (md proxy) endpoints
- corner-nav drawer: Info Hub link added
---
data/build-log.jsonl | 1 +
data/competitors.md | 250 +++++++++++++++++++++++++++++++++++++++++++
data/info-hub.json | 276 ++++++++++++++++++++++++++++++++++++++++++++++++
public/hub.html | 110 +++++++++++++++++++
public/js/corner-nav.js | 1 +
server.js | 6 ++
6 files changed, 644 insertions(+)
diff --git a/data/build-log.jsonl b/data/build-log.jsonl
index 1f639f81..0f59bb2d 100644
--- a/data/build-log.jsonl
+++ b/data/build-log.jsonl
@@ -57,3 +57,4 @@
{"ts":"2026-05-14T16:24:39.063Z","type":"lead","email":"test@example.com","source":"panel"}
{"ts":"2026-05-14T16:25:17.599Z","type":"counters","count":7}
{"ts":"2026-05-14T16:25:33.168Z","type":"server-up","port":9898,"bind":"0.0.0.0"}
+{"ts":"2026-05-14T16:28:29.144Z","type":"server-up","port":9898,"bind":"0.0.0.0"}
diff --git a/data/competitors.md b/data/competitors.md
new file mode 100644
index 00000000..ad7db9fa
--- /dev/null
+++ b/data/competitors.md
@@ -0,0 +1,250 @@
+# Abrams Panel — Competitive Landscape & Differentiation Analysis
+
+**Date:** 2026-05-14
+**Doc owner:** Steve Abrams
+**Audience:** Press, investors, partner due-diligence
+**Positioning under review:** "Abrams is the intelligence terminal for independent operators — real-time news, AI agents, legal tools, and household-rights OS in one layer, for the solo founder, professional, and owner who runs their world without enterprise IT."
+
+---
+
+## Executive Summary
+
+Abrams competes against 6 distinct incumbent categories, but **no single incumbent competes against Abrams across more than one category at a time**. The competitive structure is asymmetric: incumbents are vertical specialists locked into single-product P&Ls, single-buyer personas, and single distribution motions. Abrams is a horizontal terminal across categories that no specialist can re-architect into without cannibalizing their core ARR.
+
+The defensible vectors are (1) horizontal aggregation that requires founder-brand glue, (2) compliance posture baked into product DNA (FCC AI-disclosure preamble in Butlr), (3) build-in-public distribution that turns development cost into marketing cost, and (4) a household-rights category (AbramsOS) that adjacent fintechs structurally avoid because it carries legal liability without recurring revenue.
+
+---
+
+## 1. Operator Dashboards
+
+### Notion
+- **URL:** https://notion.so
+- **Sells:** All-in-one workspace — docs, databases, project tracking
+- **Overlap with Abrams:** Solo founders use Notion as a personal operator dashboard; Abrams Panel competes for the "where I run my world" surface
+- **Structural blockers:** Notion is a blank canvas — every user builds their own dashboard. Abrams ships opinionated, pre-wired across 13 properties. Notion can't pre-integrate a CA bar directory or an AI dialer because those aren't Notion's market. Their 100M+ user base demands generality; verticalization would fragment their template library.
+- **Pricing:** Free / $10 / $20 user/mo (Business tier required for AI)
+- **Funding/team:** Public valuation ~$10B, 500+ employees
+
+### Airtable
+- **URL:** https://airtable.com
+- **Sells:** Database-spreadsheet hybrid for ops teams
+- **Overlap with Abrams:** Dashboard surface for operators; database backbone
+- **Structural blockers:** Enterprise-focused (Toyota, Netflix, Time as flagship customers). 1,000-record free cap signals upmarket motion. Cannot serve $29/mo prosumer without margin destruction. No AI-agent layer, no news aggregation, no consumer-rights surface.
+- **Pricing:** Free (capped) / $20 / $45 user/mo
+- **Funding/team:** Last valued $11.7B, ~700 employees
+
+### Coda
+- **URL:** https://coda.io
+- **Sells:** Doc-database hybrid with formula language
+- **Overlap with Abrams:** Operator workspace for solo builders
+- **Structural blockers:** Doc-Maker billing model optimized for team docs; weak as a single-operator launchpad. No vertical content, no agent-execution layer, no live news ticker.
+- **Pricing:** Free / $10 / $30 Doc Maker/mo
+- **Funding/team:** ~$1.4B valuation, ~180 employees
+
+### Monday.com
+- **URL:** https://monday.com
+- **Sells:** Work-management platform for teams
+- **Overlap with Abrams:** Operator dashboard
+- **Structural blockers:** Public co. ($MNDY), enterprise sales motion, 3-seat minimum on most plans. Solo-founder economics break their CAC model.
+- **Pricing:** $9 / $12 / $19 seat/mo (3-seat min)
+- **Funding/team:** NASDAQ-listed, ~2,500 employees
+
+---
+
+## 2. Founder-OS / Build-in-Public Platforms
+
+### Indie Hackers
+- **URL:** https://indiehackers.com
+- **Sells:** Community + interview content for solo founders
+- **Overlap with Abrams:** AgentAbrams ("build-in-public publishing OS") shares the audience and the transparency ethos
+- **Structural blockers:** Owned by Stripe (acquired 2017) — Indie Hackers is a content marketing arm, not a P&L. No product surface; no monetization on the user side; can't ship tools without competing with Stripe's atlas/billing customers. Comments forum + podcast is the entire product.
+- **Pricing:** Free
+- **Funding/team:** Stripe subsidiary, ~3-5 staff
+
+### Product Hunt
+- **URL:** https://producthunt.com
+- **Sells:** Launch-day discovery platform
+- **Overlap with Abrams:** Build-in-public distribution motion; founder audience
+- **Structural blockers:** Single-day launch ritual, not an OS. AngelList ownership means founder activity is the loss-leader for their funding marketplace. Cannot ship persistent operator tooling without diluting the "Today's Launches" cultural ritual that gives them attention.
+- **Pricing:** Free launches; paid premium ($60-150/mo for makers)
+- **Funding/team:** AngelList subsidiary
+
+### Build in Public Inc. / WIP.co / MakerLog
+- **URL:** https://wip.co, https://getmakerlog.com
+- **Sells:** Public to-do logs for solo founders
+- **Overlap with Abrams:** Public build log / SSE feed concept
+- **Structural blockers:** Single-feature products (todo + emoji + RSS). No legal layer, no household OS, no AI-dialer, no news. Each is a $5K-$50K MRR lifestyle business with no capital to expand horizontally.
+- **Pricing:** $20-30/mo
+- **Funding/team:** 1-3 person teams, bootstrapped
+
+---
+
+## 3. Personal Finance + Household-Rights Adjacent
+
+### Rocket Money (fka Truebill)
+- **URL:** https://rocketmoney.com
+- **Sells:** Subscription cancellation + budgeting
+- **Overlap with Abrams:** AbramsOS warranty/receipt/recall capture overlaps the "household financial state" job-to-be-done
+- **Structural blockers:** Owned by Rocket Companies (NYSE: RKT) — entire business model is upsell to Rocket Mortgage. Cannot expand to non-monetary household rights (warranty disputes, recall remediation, repair-vs-replace) because those don't route to a mortgage closing. Plaid-dependent; banking compliance overhead.
+- **Pricing:** Free / $7-14/mo "pay what you think"
+- **Funding/team:** Public co. subsidiary
+
+### YNAB (You Need A Budget)
+- **URL:** https://ynab.com
+- **Sells:** Zero-based household budgeting
+- **Overlap with Abrams:** Household financial command surface
+- **Structural blockers:** Methodology cult — the product IS the four-rules pedagogy. Adding warranty/recall/legal would dilute the brand promise. No AI, no news, no agent layer; founder-led + ideologically anchored.
+- **Pricing:** $14.99/mo or $109/yr
+- **Funding/team:** Bootstrapped, ~100 employees
+
+### Quicken Simplifi
+- **URL:** https://quicken.com/simplifi
+- **Sells:** Personal finance tracking
+- **Overlap with Abrams:** Household OS surface
+- **Structural blockers:** 40-year-old desktop heritage; PE-owned (Aquiline). Innovation tempo is quarterly at best. No mobile-native legal/agent layer.
+- **Pricing:** $2.99-5.99/mo
+- **Funding/team:** Aquiline portfolio co., ~250 employees
+
+### Copilot Money / Monarch Money
+- **URL:** https://copilot.money, https://monarchmoney.com
+- **Sells:** Premium personal finance dashboards
+- **Overlap with Abrams:** Operator-grade household OS
+- **Structural blockers:** Pure-play fintech — Plaid-bound, no legal/agent/news verticals. Cannot ship a CA bar directory or an AI dialer without raising new capital and a separate team.
+- **Pricing:** $13-15/mo
+- **Funding/team:** Each Series A/B, 20-50 employees
+
+---
+
+## 4. Vertical Legal Directories
+
+### Avvo / Martindale-Avvo
+- **URL:** https://avvo.com, https://martindale.com
+- **Sells:** Lawyer directory + lead generation
+- **Overlap with Abrams:** lawyers.agentabrams.com directly competes on the directory surface
+- **Structural blockers:** Internet Brands (KKR portfolio) — fee-paid model where lawyers pay $399+/mo for enhanced profiles. Cannot give consumers a free, agent-native lookup without cannibalizing the lawyer-side ARR that funds the company. Their incentive is to obscure, not surface, the best fit.
+- **Pricing:** Free profile / $399+/mo ProVantage
+- **Funding/team:** KKR portfolio, hundreds of staff
+
+### Justia
+- **URL:** https://justia.com
+- **Sells:** Free legal directory + case law
+- **Overlap with Abrams:** Free lawyer lookup
+- **Structural blockers:** Ad-supported model, no AI agent layer, no cross-vertical integration. 20-year-old SEO play; cannot pivot to operator-terminal without abandoning its content moat.
+- **Pricing:** Free (ad-supported); attorney listings paid
+- **Funding/team:** Private, ~50 employees
+
+### LegalZoom
+- **URL:** https://legalzoom.com
+- **Sells:** DIY legal forms + subscription legal advice
+- **Overlap with Abrams:** Adjacent — sells legal access to consumers
+- **Structural blockers:** Public co. (NASDAQ: LZ), forms-first not directory-first. Brand equity in form filing, not in attorney discovery. Their attorney network is captive, not market-wide.
+- **Pricing:** $39+ form bundles, $39/mo legal advice
+- **Funding/team:** Public, ~1,000 employees
+
+---
+
+## 5. AI Dialer / Call Management
+
+### OpenPhone (now Quo)
+- **URL:** https://openphone.com
+- **Sells:** Business phone + AI receptionist (Sona)
+- **Overlap with Abrams:** Butlr's hold-on-the-line + AI answering
+- **Structural blockers:** Per-seat SaaS pricing assumes team purchase; solo-operator is loss-leader segment. AI agent is generic, not vertical (no IVR-mapping for utility/insurance/bank hold queues). $82M raised, must scale to enterprise.
+- **Pricing:** $15-35 user/mo
+- **Funding/team:** $82M raised, Series B, ~150 employees
+
+### Aircall
+- **URL:** https://aircall.io
+- **Sells:** Cloud call center for sales/support teams
+- **Overlap with Abrams:** Call management surface
+- **Structural blockers:** 3-seat minimum ($90/mo floor); AI is $9/seat add-on. Enterprise-sold; no consumer hold-buster use case. Their ICP is "5-person sales team," not "solo operator avoiding 45-min hold."
+- **Pricing:** $30-50 user/mo (3-seat min)
+- **Funding/team:** $215M raised, ~700 employees
+
+### CallRail
+- **URL:** https://callrail.com
+- **Sells:** Call tracking + marketing attribution
+- **Overlap with Abrams:** Tangential — call analytics, not call execution
+- **Structural blockers:** Marketing-attribution tool, not a dialer. Sold to marketing agencies; consumer use case is inconceivable to their sales team.
+- **Pricing:** $50-195/mo
+- **Funding/team:** Private equity, ~400 employees
+
+### Sierra AI
+- **URL:** https://sierra.ai
+- **Sells:** Enterprise AI voice agents
+- **Overlap with Abrams:** AI voice tech
+- **Structural blockers:** $15.8B valuation, $950M raised, Bret Taylor + Clay Bavor co-founders. ICP is Fortune 500 customer service ($150K-$250K/yr contracts, $50K-$200K setup). Cannot serve solo operator without destroying their unit economics. Outcome-based enterprise pricing.
+- **Pricing:** $150K-$250K+/yr enterprise
+- **Funding/team:** $950M Series E, ~400 employees
+
+---
+
+## 6. News Aggregator / Operator Newsletter
+
+### Drudge Report
+- **URL:** https://drudgereport.com
+- **Sells:** Politics-focused link aggregator (since 1995)
+- **Overlap with Abrams:** Abrams Report borrows the Drudge format for the design industry
+- **Structural blockers:** Political/general-news identity; pivot to vertical (design industry) would betray the brand. Matt Drudge personally curates; no scalable team. Ad-only monetization, no SaaS.
+- **Pricing:** Free (ad-supported)
+- **Funding/team:** Founder-operated, <10 staff
+
+### Hacker News
+- **URL:** https://news.ycombinator.com
+- **Sells:** Tech-startup community link aggregator
+- **Overlap with Abrams:** Operator/founder audience overlap
+- **Structural blockers:** Y Combinator-owned, content moderation purist. Will never run ads, never gate features, never expand verticals. Functionally a YC recruiting tool.
+- **Pricing:** Free
+- **Funding/team:** YC subsidiary, ~3 moderators
+
+### Morning Brew / The Hustle / Workweek
+- **URL:** https://morningbrew.com, https://thehustle.co
+- **Sells:** Business-news newsletters
+- **Overlap with Abrams:** Daily-cadence operator news
+- **Structural blockers:** Pure-media P&L (Insider Inc. owns Morning Brew, HubSpot owns The Hustle). No software surface, no agent execution, no household OS. Distribution = email; can't ship a terminal.
+- **Pricing:** Free / $20-100/yr premium
+- **Funding/team:** Owned by corp parents, 50-200 staff each
+
+### Wirecutter
+- **URL:** https://nytimes.com/wirecutter
+- **Sells:** Product-recommendation journalism
+- **Overlap with Abrams:** Tangential — consumer purchase decisions, household goods
+- **Structural blockers:** NYT-owned, affiliate-revenue model. Cannot ship software, agents, or directory; cannot link to lawyers (advertorial conflict).
+- **Pricing:** Free with NYT subscription
+- **Funding/team:** NYT subsidiary, ~100 staff
+
+---
+
+## Differentiation Vectors — Where Abrams Wins NOW
+
+### 1. Horizontal aggregation that no vertical specialist can replicate
+Every incumbent above competes in ONE of the six categories. Abrams competes in all six simultaneously, glued by a single founder identity and shared UX layer. To match this, Notion would need to ship a CA bar directory; Rocket Money would need to ship an AI dialer; Sierra would need a free consumer tier. Each move violates their P&L structure.
+
+### 2. Compliance moat — FCC AI-disclosure preamble baked into Butlr from day 1
+Butlr ships with the FCC Feb-2024 AI-disclosure preamble enforced at the dialer layer. Incumbents (OpenPhone, Aircall, Sierra) bolt compliance on as enterprise add-ons. Abrams treats it as the product's opening sentence. When the FCC enforcement wave hits non-compliant dialers in 2026, Abrams is already past it; competitors face a forced retrofit.
+
+### 3. Founder-brand halo across all 13 properties
+AgentAbrams, AbramsOS, Abrams Report, lawyers.agentabrams.com, Abrams Panel — every property carries the same operator's name. This is uncopyable by org-chart competitors. Notion cannot brand a property "Notion's CEO's Personal OS." The brand-as-product surface is structurally unavailable to multi-person companies.
+
+### 4. Build-in-public as distribution
+The Panel's SSE build log, SWOT ledger, and trademark hub turn engineering activity into marketing content. Cost of building = cost of marketing. Sierra spent $950M raised to acquire enterprise customers; Abrams converts the same activity into audience growth at near-zero marginal cost. Indie Hackers can't ship this — they're a forum, not an operator. WIP.co can't — they have one feature.
+
+### 5. Household-rights category (AbramsOS) sits in a structural gap
+Rocket Money won't cover warranty disputes (no mortgage upsell). YNAB won't (methodology cult). LegalZoom won't (forms-first). The "household rights operating system" category — warranties + recalls + receipts + repair-vs-replace + small-claims threshold — is unowned because every adjacent player has a reason not to enter. Abrams owns it by default once shipped.
+
+### 6. Cross-vertical intelligence terminal that no single-vertical incumbent can match
+When a Butlr call surfaces a warranty issue → AbramsOS captures the receipt → Abrams Report flags the recall → lawyers.agentabrams.com routes the CA bar member, the user experiences ONE workflow. No incumbent can deliver this without acquiring 4 companies. The latency cost of M&A vs. Abrams' native integration is 18-36 months minimum.
+
+### 7. Prosumer price point in the gap between consumer ($5-15) and enterprise ($150K+)
+$29-99/mo self-serve and $499+/mo pro hits the exact gap where Sierra is too expensive, Rocket Money is too narrow, Notion is too generic, and OpenPhone is too team-oriented. The "solo professional with $50K-$500K annual revenue" segment has no purpose-built operator stack today.
+
+### 8. AI-agent layer as default, not add-on
+Aircall charges $9/seat extra for AI. Notion gates AI to Business tier ($20/seat). Avvo has no AI. Abrams ships with agents (Big Red, Butlr, AgentAbrams) as the default interaction model. Retrofitting agent-native UX onto an existing seat-based SaaS requires re-architecting the data model — a 12-24 month engineering bill incumbents can't justify until their churn forces it.
+
+---
+
+## Closing Strategic Note
+
+Abrams' defensibility is NOT in any single feature — it's in the **shape** of the company. A founder-led, horizontally-integrated, compliance-forward, build-in-public, AI-native operator terminal cannot be cloned by re-allocating an incumbent's roadmap. It can only be cloned by another solo operator with equal range and equal execution velocity — a population of approximately 1.
+
+The window for category definition is open through Q4 2026. After that, "intelligence terminal for independent operators" will either be Abrams' Wikipedia entry or someone else's.
diff --git a/data/info-hub.json b/data/info-hub.json
new file mode 100644
index 00000000..59d6d536
--- /dev/null
+++ b/data/info-hub.json
@@ -0,0 +1,276 @@
+{
+ "sources": [
+ {
+ "name": "USPTO TEAS - Trademark Electronic Application System",
+ "url": "https://www.uspto.gov/trademarks/apply",
+ "description": "Official trademark application filing system for the U.S. Patent and Trademark Office.",
+ "category": "Legal + IP",
+ "subcategory": "Trademark Filing",
+ "mfa": true,
+ "retention": "6+ years (application history retained)",
+ "mobile": 3
+ },
+ {
+ "name": "USPTO Trademark Search (TMSEARCH)",
+ "url": "https://tmsearch.uspto.gov/",
+ "description": "Cloud-based trademark database search before filing to check availability and conflicts.",
+ "category": "Legal + IP",
+ "subcategory": "Trademark Search",
+ "mfa": false,
+ "retention": "Real-time lookup, no local history saved",
+ "mobile": 3
+ },
+ {
+ "name": "FTC CAN-SPAM Act Compliance Guide",
+ "url": "https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business",
+ "description": "Federal compliance rules for commercial email, opt-out requirements, penalties up to $53k per violation.",
+ "category": "Email + Comms Compliance",
+ "subcategory": "Email Marketing Law",
+ "mfa": false,
+ "retention": "Stateless; FTC.gov pages live indefinitely",
+ "mobile": 3
+ },
+ {
+ "name": "California §17529.5 (Anti-Spam Email Statute)",
+ "url": "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=BPC§ionNum=17529.5",
+ "description": "State email statute providing private right of action; penalties up to $1k per email.",
+ "category": "Email + Comms Compliance",
+ "subcategory": "California Email Law",
+ "mfa": false,
+ "retention": "Stateless statutory reference",
+ "mobile": 2
+ },
+ {
+ "name": "Gmail Bulk Sender Requirements (Google Workspace)",
+ "url": "https://support.google.com/a/answer/81126?hl=en",
+ "description": "SPF/DKIM/DMARC authentication requirements for senders >5k msgs/day to Gmail accounts.",
+ "category": "Email + Comms Compliance",
+ "subcategory": "Gmail Sender Requirements",
+ "mfa": false,
+ "retention": "Live documentation; changes tracked in version history",
+ "mobile": 3
+ },
+ {
+ "name": "TCPA + Do Not Call Registry (DNC.gov)",
+ "url": "https://www.donotcall.gov/",
+ "description": "Consumer consent registry for telemarketing; telemarketers must scrub lists every 31 days.",
+ "category": "Email + Comms Compliance",
+ "subcategory": "Telemarketing Law",
+ "mfa": false,
+ "retention": "Registry data permanent; search logs cleared periodically",
+ "mobile": 3
+ },
+ {
+ "name": "FCC AI Disclosure Rule (February 2024 TCPA Clarification)",
+ "url": "https://www.mayerbrown.com/en/insights/publications/2024/02/fcc-declares-authority-and-intent-to-regulate-ai-generated-calls-under-the-tcpa",
+ "description": "FCC clarifies TCPA covers AI-generated voice calls; requires prior express consent.",
+ "category": "Legal + IP",
+ "subcategory": "AI Compliance",
+ "mfa": false,
+ "retention": "Regulatory announcement, permanent",
+ "mobile": 2
+ },
+ {
+ "name": "FTC Endorsement Guides (16 CFR Part 255)",
+ "url": "https://www.ftc.gov/business-guidance/advertising-marketing/endorsements-influencers-reviews",
+ "description": "Rules on fake reviews, influencer disclosures, testimonials; updated July 2023.",
+ "category": "Legal + IP",
+ "subcategory": "Advertising Law",
+ "mfa": false,
+ "retention": "Stateless regulatory reference",
+ "mobile": 3
+ },
+ {
+ "name": "California Consumer Privacy Act (CCPA/CPRA)",
+ "url": "https://oag.ca.gov/privacy/ccpa",
+ "description": "California Attorney General's CCPA/CPRA full text and compliance guidance.",
+ "category": "Legal + IP",
+ "subcategory": "Privacy Law",
+ "mfa": false,
+ "retention": "Stateless statutory reference",
+ "mobile": 3
+ },
+ {
+ "name": "Stripe Pricing",
+ "url": "https://stripe.com/pricing",
+ "description": "Payment processing fees: 2.9% + $0.30 for card, 1% for ACH, custom rates for enterprise.",
+ "category": "Operator Tooling Primary Sources",
+ "subcategory": "Payment Processing",
+ "mfa": false,
+ "retention": "Real-time pricing; historical snapshots may differ",
+ "mobile": 3
+ },
+ {
+ "name": "Twilio Pricing",
+ "url": "https://www.twilio.com/en-us/pricing",
+ "description": "SMS/voice/messaging usage-based pricing; SMS starts ~$0.0083/segment.",
+ "category": "Operator Tooling Primary Sources",
+ "subcategory": "Communications API",
+ "mfa": false,
+ "retention": "Real-time rates; pay-as-you-go only",
+ "mobile": 3
+ },
+ {
+ "name": "ElevenLabs API Pricing",
+ "url": "https://elevenlabs.io/pricing/api",
+ "description": "Text-to-speech & speech-to-text billing; free tier 10k chars/mo, pro $99/mo.",
+ "category": "Operator Tooling Primary Sources",
+ "subcategory": "AI Voice API",
+ "mfa": false,
+ "retention": "Real-time pricing updates",
+ "mobile": 3
+ },
+ {
+ "name": "AWS Free Tier Documentation",
+ "url": "https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/free-tier.html",
+ "description": "AWS free account plan (6 months) + 30+ always-free services with monthly limits.",
+ "category": "Operator Tooling Primary Sources",
+ "subcategory": "Cloud Infrastructure",
+ "mfa": true,
+ "retention": "Account history retained indefinitely",
+ "mobile": 3
+ },
+ {
+ "name": "Postmark vs Resend Deliverability Comparison",
+ "url": "https://postmarkapp.com/pricing",
+ "description": "Transactional email provider pricing and deliverability benchmarks.",
+ "category": "Operator Tooling Primary Sources",
+ "subcategory": "Email Delivery",
+ "mfa": true,
+ "retention": "Account-bound; pricing may vary by tier",
+ "mobile": 3
+ },
+ {
+ "name": "IRS Schedule C (Form 1040) & Instructions",
+ "url": "https://www.irs.gov/forms-pubs/about-schedule-c-form-1040",
+ "description": "Official self-employment income/loss reporting form; required if >$400 net earnings.",
+ "category": "Founder + Bookkeeping",
+ "subcategory": "Tax Filing",
+ "mfa": false,
+ "retention": "Historical tax forms archived; annual updates",
+ "mobile": 2
+ },
+ {
+ "name": "California FTB - Sole Proprietor & LLC Guide",
+ "url": "https://www.ftb.ca.gov/file/business/types/sole-proprietorship.html",
+ "description": "State tax requirements for self-employed; LLCs pay $800 annual minimum tax.",
+ "category": "Founder + Bookkeeping",
+ "subcategory": "State Tax",
+ "mfa": false,
+ "retention": "Stateless reference; annual updates",
+ "mobile": 3
+ },
+ {
+ "name": "Gusto Payroll & Tax Compliance",
+ "url": "https://gusto.com/product/payroll/tax-management",
+ "description": "Small-business payroll with automatic tax filing, W-2s, 1099s; free with all plans.",
+ "category": "Founder + Bookkeeping",
+ "subcategory": "Payroll Service",
+ "mfa": true,
+ "retention": "Account-based; 7-year payroll record retention required",
+ "mobile": 3
+ },
+ {
+ "name": "INTA (International Trademark Association) Resources",
+ "url": "https://www.inta.org/resources/",
+ "description": "Trademark basics guides, fact sheets, and practice resources from the industry body.",
+ "category": "Trademark + Brand Law",
+ "subcategory": "Trademark Education",
+ "mfa": false,
+ "retention": "Resource library archived; updates via RSS",
+ "mobile": 3
+ },
+ {
+ "name": "ICANN UDRP Policy (Domain Dispute Resolution)",
+ "url": "https://www.icann.org/en/contracted-parties/consensus-policies/uniform-domain-name-dispute-resolution-policy/uniform-domain-name-dispute-resolution-policy-01-01-2020-en",
+ "description": "Mechanism to challenge cybersquatting; alternative to court for trademark-based domain disputes.",
+ "category": "Trademark + Brand Law",
+ "subcategory": "Domain Disputes",
+ "mfa": false,
+ "retention": "Policy document versioned; disputes archived by ICANN",
+ "mobile": 2
+ },
+ {
+ "name": "California State Bar - Attorney Search",
+ "url": "https://apps.calbar.ca.gov/",
+ "description": "Search attorney credentials, licensure status, and disciplinary history.",
+ "category": "Industry Intelligence - Legal",
+ "subcategory": "Professional Lookup",
+ "mfa": false,
+ "retention": "Public disciplinary records retained indefinitely",
+ "mobile": 3
+ },
+ {
+ "name": "California Business & Professions Code §6155 (Lawyer Referral)",
+ "url": "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=6155&lawCode=BPC",
+ "description": "Rules for lawyer referral services; registration with State Bar required.",
+ "category": "Industry Intelligence - Legal",
+ "subcategory": "Referral Service Law",
+ "mfa": false,
+ "retention": "Stateless statutory reference",
+ "mobile": 2
+ },
+ {
+ "name": "Mozilla Observatory (HTTP Security Audit)",
+ "url": "https://developer.mozilla.org/en-us/observatory",
+ "description": "Free scan of HTTP headers and security configuration; grades A+ to F.",
+ "category": "Self-Audit + Privacy",
+ "subcategory": "Security Headers",
+ "mfa": false,
+ "retention": "Scan results not logged for visitors; historical data per optional account",
+ "mobile": 3
+ },
+ {
+ "name": "Security Headers Analyzer (securityheaders.com)",
+ "url": "https://securityheaders.com/",
+ "description": "Evaluates security headers (CSP, HSTS, X-Frame-Options, etc.); quick health check.",
+ "category": "Self-Audit + Privacy",
+ "subcategory": "Security Headers",
+ "mfa": false,
+ "retention": "Stateless; no result logging",
+ "mobile": 3
+ },
+ {
+ "name": "WAVE Accessibility Evaluation Tool",
+ "url": "https://wave.webaim.org/",
+ "description": "WebAIM's free WCAG accessibility scanner; browser extension or online version.",
+ "category": "Self-Audit + Privacy",
+ "subcategory": "Accessibility",
+ "mfa": false,
+ "retention": "Scan results can be saved per optional account",
+ "mobile": 3
+ },
+ {
+ "name": "Google Core Web Vitals (web.dev)",
+ "url": "https://web.dev/explore/learn-core-web-vitals",
+ "description": "LCP, INP, CLS metrics; official learning path from Google for performance.",
+ "category": "Self-Audit + Privacy",
+ "subcategory": "Performance Auditing",
+ "mfa": false,
+ "retention": "Live documentation; version history in GitHub",
+ "mobile": 3
+ },
+ {
+ "name": "Google Search Console - Core Web Vitals Report",
+ "url": "https://support.google.com/webmasters/answer/9205520?hl=en",
+ "description": "Real user monitoring data for your site's Core Web Vitals from Google.",
+ "category": "Self-Audit + Privacy",
+ "subcategory": "Performance Auditing",
+ "mfa": true,
+ "retention": "28 months rolling; requires verified Google Search property",
+ "mobile": 3
+ },
+ {
+ "name": "FTC Truth in Advertising Resources",
+ "url": "https://www.ftc.gov/business-guidance/advertising-marketing",
+ "description": "Hub of FTC guides on bait-and-switch, unsubstantiated claims, testimonials.",
+ "category": "Legal + IP",
+ "subcategory": "Advertising Compliance",
+ "mfa": false,
+ "retention": "Stateless regulatory guidance",
+ "mobile": 3
+ }
+ ],
+ "generated_at": "2026-05-14T00:00:00Z",
+ "summary": "26 authoritative operator resources covering trademark/IP, email compliance, payment/AI tooling pricing, tax filing, legal/privacy audits, and accessibility standards. All free or clearly priced; mobile-friendly; gov/official sources prioritized."
+}
diff --git a/public/hub.html b/public/hub.html
new file mode 100644
index 00000000..53bc6ca7
--- /dev/null
+++ b/public/hub.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Abrams — Info Hub</title>
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
+<link rel="stylesheet" href="/static/css/panel.css" />
+<style>
+ .container { max-width: 1280px; margin: 0 auto; padding: 110px 24px 60px; }
+ .source { background: var(--bg-2); border: 1px solid var(--hairline); padding: 18px 22px; margin-bottom: 10px; display: grid; grid-template-columns: 1fr 200px; gap: 20px; align-items: start; }
+ .source .nm { font-family: var(--serif); font-size: 19px; font-weight: 500; }
+ .source .nm a { color: var(--fg); }
+ .source .nm a:hover { color: var(--accent); }
+ .source .desc { color: var(--fg-2); font-size: 13px; line-height: 1.6; margin: 6px 0 8px; }
+ .source .url { font-family: var(--mono); font-size: 11px; color: var(--accent); word-break: break-all; }
+ .source .meta { font-family: var(--mono); font-size: 10px; letter-spacing: .15em; color: var(--fg-3); text-transform: uppercase; text-align: right; }
+ .source .meta .row { padding: 3px 0; }
+ .source .meta .mfa-yes { color: var(--warn); }
+ .source .meta .mfa-no { color: var(--ok); }
+ .cat-block { margin-bottom: 36px; }
+ .cat-block h2 { font-family: var(--serif); font-size: 26px; font-weight: 400; margin: 0 0 4px; }
+ .cat-block .sub { font-family: var(--mono); font-size: 10px; letter-spacing: .25em; color: var(--accent); text-transform: uppercase; margin: 0 0 16px; }
+</style>
+</head>
+<body>
+
+<div class="chrome">
+ <a class="logo" href="/">ABRAMS<span class="dot">.</span></a>
+ <div class="nav-burger" role="button" aria-label="open menu">
+ <span class="bars"><span></span><span></span><span></span></span>
+ <span class="label">MENU</span>
+ </div>
+</div>
+
+<div class="container">
+ <h1 style="font-family:var(--serif);font-size:48px;font-weight:400;margin:0 0 6px;">Info Hub</h1>
+ <p style="color:var(--fg-2);max-width:760px;margin:0 0 16px;">Authoritative external sources every independent operator should bookmark — legal IP, email compliance, founder bookkeeping, tooling APIs, self-audit. Curated by the search-specialist subagent, refreshed on demand.</p>
+
+ <div class="controls">
+ <span class="lbl">Filter</span>
+ <input id="filter" type="search" placeholder="search name + description + url" style="background:var(--bg-2);border:1px solid var(--hairline);color:var(--fg);padding:8px 12px;font-family:var(--mono);font-size:12px;min-width:300px;" />
+ <span class="lbl">Cat</span>
+ <select id="cat-filter"><option value="">all</option></select>
+ <span class="lbl">Mobile</span>
+ <select id="mobile-filter"><option value="">any</option><option value="3">★★★ only</option></select>
+ </div>
+
+ <div id="hub"></div>
+ <p id="meta" style="color:var(--fg-3);font-family:var(--mono);font-size:11px;letter-spacing:.15em;margin-top:24px;"></p>
+</div>
+
+<footer>© 2026 Steven Abrams</footer>
+
+<script src="/static/js/corner-nav.js"></script>
+<script src="/static/js/gamify.js"></script>
+<script>
+function esc(s){ return String(s||'').replace(/[&<>"']/g, m=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m])); }
+let allSources = [];
+function render(){
+ const f = (document.getElementById('filter').value||'').toLowerCase();
+ const c = document.getElementById('cat-filter').value;
+ const m = document.getElementById('mobile-filter').value;
+ let sources = allSources.filter(s => {
+ const blob = (s.name+' '+s.description+' '+s.url+' '+(s.subcategory||'')).toLowerCase();
+ if (f && !blob.includes(f)) return false;
+ if (c && s.category !== c) return false;
+ if (m && (s.mobile||0) < parseInt(m, 10)) return false;
+ return true;
+ });
+ const byCat = {};
+ for (const s of sources) { (byCat[s.category] ||= []).push(s); }
+ const order = Object.keys(byCat).sort();
+ document.getElementById('hub').innerHTML = order.map(cat => `
+ <div class="cat-block">
+ <h2>${esc(cat)}</h2>
+ <p class="sub">${byCat[cat].length} source${byCat[cat].length===1?'':'s'}</p>
+ ${byCat[cat].map(s => `
+ <div class="source">
+ <div>
+ <div class="nm"><a href="${esc(s.url)}" target="_blank" rel="noopener">${esc(s.name)}</a></div>
+ <div class="desc">${esc(s.description)}</div>
+ <div class="url">${esc(s.url)}</div>
+ </div>
+ <div class="meta">
+ <div class="row">${esc(s.subcategory||'')}</div>
+ <div class="row mfa-${s.mfa?'yes':'no'}">${s.mfa?'MFA REQUIRED':'NO LOGIN'}</div>
+ <div class="row">RET: ${esc(s.retention||'unknown')}</div>
+ <div class="row">MOBILE ${'★'.repeat(s.mobile||1)}${'☆'.repeat(3-(s.mobile||1))}</div>
+ </div>
+ </div>
+ `).join('')}
+ </div>
+ `).join('') || '<div style="color:var(--fg-3);padding:48px;text-align:center;font-family:var(--mono);">no sources match filters</div>';
+ document.getElementById('meta').textContent = `${sources.length} of ${allSources.length} sources shown`;
+}
+fetch('/api/info-hub').then(r=>r.json()).then(d => {
+ allSources = d.sources || [];
+ // populate category dropdown
+ const cats = [...new Set(allSources.map(s => s.category))].sort();
+ document.getElementById('cat-filter').innerHTML = '<option value="">all categories</option>' + cats.map(c => `<option value="${esc(c)}">${esc(c)}</option>`).join('');
+ render();
+});
+['filter','cat-filter','mobile-filter'].forEach(id => document.getElementById(id).addEventListener('input', render));
+document.getElementById('cat-filter').addEventListener('change', render);
+document.getElementById('mobile-filter').addEventListener('change', render);
+</script>
+</body>
+</html>
diff --git a/public/js/corner-nav.js b/public/js/corner-nav.js
index 0c9cd2eb..0b0173de 100644
--- a/public/js/corner-nav.js
+++ b/public/js/corner-nav.js
@@ -8,6 +8,7 @@
{ label: 'Ideas + SWOT', href: '/ideas' },
{ label: 'Mag-20 Audit', href: '/mag-20' },
{ label: 'Press Kit', href: '/press' },
+ { label: 'Info Hub', href: '/hub' },
{ label: 'Leaderboard', href: '/#leaderboard' },
{ label: 'Trademark', href: '/trademark' },
{ label: 'Wall', href: '/wall' },
diff --git a/server.js b/server.js
index 9be81aee..9384306c 100644
--- a/server.js
+++ b/server.js
@@ -56,6 +56,11 @@ app.get('/api/projects', (_, res) => res.json(readJson(PROJECTS_FILE, { projects
app.get('/api/ideas', (_, res) => res.json(readJson(IDEAS_FILE, { ideas: [], updated_at: null })));
app.get('/api/trademark', (_, res) => res.json(readJson(TRADEMARK_FILE, {})));
app.get('/api/counters', (_, res) => res.json(readJson(path.join(DATA, 'counters.json'), { counters: [] })));
+app.get('/api/info-hub', (_, res) => res.json(readJson(path.join(DATA, 'info-hub.json'), { sources: [] })));
+app.get('/api/competitors', (req, res) => {
+ try { res.type('text/markdown').send(fs.readFileSync(path.join(DATA, 'competitors.md'), 'utf8')); }
+ catch { res.status(404).json({ error: 'competitors analysis not yet generated' }); }
+});
app.get('/api/mag-20', (_, res) => res.json({
patterns: readJson(path.join(DATA, 'mag-20.json'), { patterns: [] }).patterns || [],
results: readJson(path.join(DATA, 'mag-20-results.json'), { projects: [], summary: {} }),
@@ -92,6 +97,7 @@ app.get('/api/gamify/leaderboard', (_, res) => {
app.get('/mag-20', (_, res) => res.sendFile(path.join(ROOT, 'public', 'mag-20.html')));
app.get('/press', (_, res) => res.sendFile(path.join(ROOT, 'public', 'press.html')));
+app.get('/hub', (_, res) => res.sendFile(path.join(ROOT, 'public', 'hub.html')));
app.get('/api/build-log', (req, res) => res.json({ events: readJsonl(BUILD_LOG, parseInt(req.query.n || '50', 10)) }));
app.get('/api/wall', (req, res) => res.json({ posts: readJsonl(WALL_FILE, parseInt(req.query.n || '100', 10)) }));
← 53d79aea v0.6: cross-project counters + press kit + lead-notify + com
·
back to Abrams
·
v0.8: competitors + info-hub pages 43ae8ef8 →