Brand Audit

All 14 SaaS Landing Pages

What every app actually looks like today, why "match Bloggy" isn't quite the right goal, and the cheapest path to one consistent brand across the suite.

Boom Media SaaS · Created 2026-07-20 · eric@boommedia.us

Contents

  1. The correction — Bloggy isn't a design system
  2. All 14 apps, side by side
  3. Three live bugs to fix regardless of theming
  4. Fork lineage — and why it doesn't predict what you'd expect
  5. The plan: one shared boom-theme.css
  6. Effort per app

01The correction

Worth reading before committing to a direction — it changes the target.

"Match Bloggy" and "match Graphite Violet" are two different things

Bloggy is not a design system. It's a well-styled page built on hardcoded hex values. Its landing page contains zero design tokens — grep -c "var(--" returns 0.

And the colors it renders are not the Graphite Violet palette. They're a legacy graphite ramp that's close, but different — and the correct tokens are sitting unused in Bloggy's own globals.css.

RoleGraphite Violet (defined, unused)What Bloggy renders
Background#0B0B0F#0a0a0f
Surface / card#141419#12121a
Border#262631#2a2a3d
Muted text#8B8B99#8888a8
Accent#8b7bf0#8b7bf0 ✅ (via ramp remap)

Hardcoded occurrences in Bloggy's source: 1,105 of #2a2a3d, 977 of #8888a8, 629 of #555570, 405 of #12121a. Roughly 4,000 hex literals total.

Why Bloggy looks violet anyway — and the one thing worth copying

It remaps Tailwind's entire violet scale, so every violet-600 button in the app inherits the brand accent for free. This block is the most portable asset in the audit:

/* Bloggy/src/app/globals.css:8-18 */
@theme {
  --color-violet-500: #8b7bf0;   --color-purple-500: #8b7bf0;
  --color-violet-600: #6d5ce0;   --color-violet-400: #a99bf5;
  /* …the full 50–950 ramp */
}
The consequence: copying Bloggy into 13 apps would propagate ~4,000 legacy hex literals across the suite. Meanwhile Replyee already matches Graphite Violet exactly, and Approvee has the most sophisticated token setup of any app (the only one with light mode). Those are the better references.
Bloggy renders in Arial. globals.css:57 sets body { font-family: Arial, Helvetica, sans-serif }, overriding the Geist font loaded in layout.tsx:12-20. The same bug affects Signnee, Compliee, Replyee, Dashee, Rankee, and Addee. Only Assistee and Posttee wired Geist correctly. One line each to fix.

02All 14 apps, side by side

Each card renders that app's real palette and actual hero copy. Ratings are against Graphite Violet, not against Bloggy.

Replyee

MATCHES
✦ Early Access — 50% off
Your AI support team,
ready in 60 seconds.
Fake browser mockup w/ floating violet chat widget
Start FreeSee demo →
0B0B0F
141419
8b7bf0
8B8B99
The best exemplar. Already on-brand. Font fix only.

Approvee

CLOSE
1,200+ agencies use Approvee
One Dashboard.
Every Client
Approved.
Wireframe mockup w/ teardrop annotation pins
Start Free
0B0B0F
8b7bf0
060f06
light
Best token architecture — only app with light mode + alpha ramp. Remove green leftovers.

Bloggy (reference)

CLOSE
● Early Access — 50% off
One Dashboard.
Every Client Blog. Done.
As low as $9.80 per client.
Start FreeSee the math →
0a0a0f
12121a
2a2a3d
8888a8
Legacy ramp, not tokens. 1,268-line landing, 26 components. Renders in Arial.

Rankee

CLOSE
Early access — 50% off
One Dashboard.
Every Client Site.
Ranked.
⚠ this text is #262631 — invisible in the real app
0B0B0F
8b7bf0
262631
MUTED!
Not shippable. Cards use bg color as their background — invisible.

Compliee

CLOSE
Find and fix your website's
accessibility issues
Body copy is lavender, not neutral grey — reads more purple than the rest of the suite
Scan your site
0b0b0f
8b7bf0
a99bf5
141419
Correct palette, restrained. Swap lavender body → #8B8B99.

QRcodee

CLOSE
Early access
One Dashboard.
Every QR Code.
Done.
Start Free
0B0B0F
8b7bf0
0891b2
22d3ee
Best technique — already var()-driven. Only the logo + CTAs + headline gradient leaked cyan. ~9 swaps.

Displayee

DIFFERENT
✦ Boom Media Digital Signage
Any TV becomes a
managed display
Replace Yodeck at 75% less cost. ● LIVE
0B0B0F
8b7bf0
34d399
141419
Dashboard IS tokenized (var(--di-accent)) — the July work was real. Landing hardcodes literals. No font loaded.

Dashee

DIFFERENT
Attorneys · Bail Bonds · Moving
Your Client Dashboard.
Built for Your Industry.
⚠ fine print at #252560 on #08081a ≈ 1.5:1 — invisible
08081a
181840
6366f1
252560
Indigo on blue-black. But only 6 constants drive it — trivial to swap. Has a contrast failure.

Rewardee

DIFFERENT
🤖 AI-powered · Built on Claude
Your regulars should spend 67% more
847 points · 💎 VIP Member · $8.47
Get Started
0f0f13
f97316
fb923c
22c55e
Zero violet. ~300 arbitrary-hex class strings across 837 lines. Heavy emoji.

Addee

DIFFERENT
Early Access
One Dashboard.
Every Brand AD. Done.
Cards still carry blue/lime/yellow from an older amber theme
Start Free
0f0610
ec4899
a855f7
fb923c
Furthest off-brand — despite being a 247-hit Bloggy fork. Leaks bloggy.online in production.

Assistee

DIFFERENT
🔒 Enterprise-grade remote support
Help your clients instantly.
No tech skills required.
Emoji icons throughout
Get Started
08111f
0ea5e9
94a3b8
0f1e33
Contradicts itself — dashboard is violet, landing is blue. But only 8 constants. Trivial.

Signnee

DIFFERENT
E-Signatures Without the
DocuSign Price Tag
Only 4 sections — no mockup, no social proof, no FAQ
Get started
0d1b2a
4fc3f7
8fa3b8
16324a
Migration started and abandoned — violet sidebar on a navy app. 25 files. Landing underbuilt.

Posttee

DIFFERENT
Built for local businesses
One calendar to schedule &
publish everywhere.
📘 📷 🐦 💼 📍 — emoji squares as channel logos
0B0B0F
a99bf5
4f74ff
141419
Placeholder — 72 lines, no glows or gradients. Already var()-driven. Needs a real page.

Localey

NO LANDING
redirect(user ? '/dashboard' : '/login')
page.tsx is 11 lines. There is no landing page.
0B0B0F
8b7bf0
141419
262631
Tokens are perfect and completely unrendered. Cost is authoring, not retheming.
Summary: 1 MATCHES · 5 CLOSE · 7 DIFFERENT · 1 has no landing page. Five apps are in an entirely different hue family — Addee (pink), Dashee (indigo), Rewardee (orange), Assistee (sky blue), Signnee (navy/cyan).

But every single app already has Graphite Violet tokens defined in its globals.css. The problem is uniformly that landing pages ignore them.

03Three live bugs — fix these regardless

Found during the design audit; none are theming issues. Two are user-facing failures.

1. Addee leaks Bloggy in production — including a broken password reset.
  • forgot-password/page.tsx:22 — SSR fallback redirects to https://www.bloggy.online/reset-password. Users cannot reset their password.
  • terms/page.tsx:6canonical: 'https://bloggy.online/terms'. Your SEO points at a different product.
  • ChatWidget.tsx:21 — greets users as "I'm Bloggy's AI assistant"
  • auth/actions.ts:21 — admin gate checks eric@bloggy.online
2. Rankee has invisible content. page.tsx:39 sets const MUTED = '#0B0B0F' — identical to the page background — then uses it as the card background at lines 150, 169, 179, 191, 206. Cards are invisible but for their borders. The border hex #262631 is also used as text color at six sites. Same bug in dashboard/page.tsx:17. A mechanical color swap went wrong.
3. Six apps render in Arial. Bloggy, Signnee, Compliee, Replyee, Dashee, Rankee, and Addee all load Geist via next/font and then override it with body { font-family: Arial } in globals.css. One line each. Copy the correct pattern from Assistee/globals.css:38.

Also worth deleting: seven apps carry a tailwind.config.ts that is dead code. All 14 run Tailwind v4 and no globals.css contains an @config directive, so these files are never read — but they declare contradictory palettes that will mislead anyone who opens them (Addee red-on-white, Signnee cyan, Posttee blue, Localey emerald+gold, Rewardee #7c3aed).

04Fork lineage — and the surprise

Which apps descend from Bloggy, and why that turns out not to predict what you'd think.

AppRelationshipEvidence
AddeeTrue fork247 bloggy string hits; 26 of 31 components name-identical; same UTF-8 BOM on dashboard/page.tsx — a byte-level copy tell
RankeeTrue fork19 of 23 components identical; globals.css byte-identical to Bloggy lines 1–45. Cleanly de-branded (2 hits, both comments)
SignneeTrue forkAppNav.tsx match; copied the "Graphite Violet suite theme (2026-07-14)" comment — and inherited the Arial bug
Approvee, QRcodeeCopy/design forkSame hero formula, independent code: "One Dashboard. / Every Client / Approved." · "…Every QR Code. / Done."
Posttee, Localey, Rewardee, Dashee, Compliee, Assistee, Replyee, DisplayeeIndependentClean greps, own metadata, own component vocabularies

Fork status does not predict visual closeness

Addee is a 247-hit fork of Bloggy and is the furthest off-brand app in the suite (pink). Replyee shares no code with Bloggy and matches Graphite Violet exactly.

Forking predicts component reuse, not palette — the forks had their hues deliberately swapped away afterward. So don't estimate theming effort from lineage. Estimate it from where the colors live (§6).

05The plan — one shared boom-theme.css

Using delivery rails that are already proven in this codebase.

There is no shared mechanism today

No npm workspaces, no packages/, no @boom/* dependency in any package.json. Fourteen fully independent apps duplicating everything.

But one precedent already worked. boom-responsive.css now sits in all 14 apps at src/styles/, imported by every globals.css, distributed by plain file copy — and it stuck. That's the delivery vehicle. Use it again.

Why not an npm package

No workspace exists, apps deploy independently across Vercel and Coolify, and a publish → bump → redeploy loop across 14 apps costs more than it saves. Revisit once the token vocabulary is stable.

Blocker to resolve first: the token vocabulary is fragmented five ways. Bloggy/Signnee/Dashee/Compliee use --primary; Displayee uses --di-accent; Replyee --ry-primary; Assistee --as-primary; Approvee --accent; Localey/QRcodee use Tailwind-native --color-*. One must win before a shared file means anything.

Recommend Approvee's (--accent / --bg / --surface / --border) — it's the only vocabulary with a light-mode implementation and a 15-step alpha ramp, both of which you'll eventually want.

Sequence

1

Decide the target

Bloggy's rendered legacy ramp, or the true Graphite Violet tokens. Recommend the tokens — Replyee is the best existing exemplar, QRcodee the best technique exemplar.

2

Fix the three shipped bugs

Addee's password-reset redirect + canonical, Rankee's invisible cards. Independent of theming, and one is a live user-facing failure.

3

Pick one token vocabulary; delete the 7 dead configs

4

Ship boom-theme.css

Carrying the violet ramp remap, the :root tokens, and a small component layer (.boom-btn, .boom-card, .boom-badge). One-line import per app — identical to the rollout that just shipped.

5

Sweep the 7 TRIVIAL apps

Constants-only edits. Plausibly a single session.

6

Fix the Arial bug in 6 apps

One line each.

7

Then the three HEAVY apps + author the two missing pages

06Effort per app

Driven by where colors live — not by inline-vs-Tailwind, and not by fork lineage.

The counter-intuitive bit: inline styles are not automatically expensive to retheme. What matters is whether colors are centralized in constants or scattered at usage sites. Dashee is ~100% inline yet trivial — six constants drive the whole page. Bloggy is Tailwind-first yet heavy — ~4,000 scattered hex literals.

(Inline styles are genuinely hard for responsive work, because they can't hold media queries. That's a different problem, and it's why boom-responsive.css exists.)
AppEffortWhy
ReplyeeTRIVIALAlready matches. Font fix only.
QRcodeeTRIVIAL~9 hex swaps in 21 inline objects; already var()-driven. +Inter→Geist.
DasheeTRIVIAL6 constants at page.tsx:18-24.
AssisteeTRIVIAL8 constants + 4 hardcoded rgba().
RankeeTRIVIALPalette already correct — just fix the contrast bugs. 2 files.
ComplieeTRIVIALSwap lavender body copy → neutral grey.
PostteeTRIVIAL72 lines, var()-driven, one blue pill leak. But needs a real page authored.
DisplayeeMODERATEDashboard already tokenized; landing hardcodes literals. 120 inline objects. Add next/font.
ApproveeMODERATENearly right — remove green leftovers at :13 and :78.
LocaleyMODERATETokens perfect; no landing page exists. Cost is authoring.
SignneeHEAVY25 files of navy/cyan. Migration started and abandoned. Landing underbuilt (166 lines).
RewardeeHEAVY~300 arbitrary-hex class strings across 837 lines. Mechanical but large.
AddeeHEAVY~150 scattered inline objects + 247 Bloggy leaks + orphaned amber/lime/blue classes. Highest total.
BloggyHEAVY*~4,000 hex literals if tokenizing. TRIVIAL if you accept its legacy ramp as the standard instead.

The decision that sets everything else

If you keep Bloggy's rendered ramp as the standard, Bloggy is free and the other 13 shift slightly off the documented Graphite Violet spec.

If you standardize on the Graphite Violet tokens, 13 apps get the palette you actually chose and Bloggy becomes the single heavy lift — but it's mechanical find-and-replace, and it's the version that leaves you with a real design system rather than a page everyone copies.

Recommendation: the tokens. The difference between #0a0a0f and #0B0B0F is invisible to the eye but decisive for maintainability — one is a system, the other is 4,000 literals.