Saer on Lunary, a production codebase.

Lunary is the founder’s own app, in production on the web and iOS. Saer scanned its 4,262 files locally on 22 October 2026, with saer 0.1.5. Every number, colour and file path on this page is copied from that scan.

Summary

Colour tokens reconstructed
167
Hard-coded colours equal to a token, and their uses
22 / 436
Near-matches, kept apart
78
Components, and names defined twice
1,668 / 15
Uses of <Button> that restyle it
164 of 538
Failing contrast pairs, default context
48
$ saer scan
SAER
Colour system reconstructed.
167 canonical colour entities

Found
  22 exact drift finding(s)
  78 experimental near-match(es)
  13 dead declaration(s)

# typography and foundations trimmed here

Components
  1668 component(s), 100% of use sites resolved
  15 exact-name duplicate(s), 0 experimental near-duplicate(s)
  20 variant finding(s), 19 component(s) overridden at use sites

Accessibility (static checks, not a conformance claim)
  48 failing colour pair(s) (111 more only in another colour context), 2781 passing, 7863 unknown
  2 focus style finding(s)
  1 tap target(s) below 24px, 31 below 44px

(73.6s)
Colour · in the beta

Colour: the system as declared, and where the code went around it.

167 colour tokens, every var() chain followed to a value (632 of 633 references resolved; the rest is reported as unresolved, not guessed).

From observations to questions

  1. 28,798observations of colour in the code: raw values and token classes
  2. 115findings: 22 exact, 93 inferred and labelled as such
  3. 14questions only a person can answer, asked once each

Every token, by hue

A green bar under a swatch: a raw hex somewhere in the code is identical to it. Hollow: declared, never used. Families are a browsing lens computed from hue, not a finding.

Family
Finding

Showing 167 of 167 tokens. Select a swatch, or use the arrow keys, to inspect it.

color-primary

CSS custom property, declared in src/app/globals.css

Default
#8458d8
Light
#8458d8
Dark
#8458d8
Uses through a class
0
Raw hex uses
104
Exact drift
72

Bypassed by an identical raw value

#8458d8 written 72 times. Files (Saer’s sample):

  • src/app/admin/bip/BipTriggerButtons.tsx
  • src/app/api/forecast/yearly/calendar/route.ts
  • src/app/api/newsletter/daily-horoscope/opt-in/route.ts
  • src/app/birth-chart/transits/TransitReadingView.tsx
  • src/app/birth-chart/transits/TransitTeaserView.tsx
All 167 tokens as a table
Every colour token in Lunary with its values and use
TokenDefaultLightDarkClass usesExact driftNote
chart-shadow#000000#ffffff#000000067
color-bg-deep#050505#050505#050505010
lunary-bg-deep#050505#050505#050505010
chart-backdrop-edge#08060f#ffffff#08060f067
color-bg#0a0a0a#0a0a0a#0a0a0a062
lunary-bg#0a0a0a#0a0a0a#0a0a0a062
page-bg#0a0a0anot set#0a0a0a062
surface-base#0a0a0a#faf9ff#0a0a0a53162
lunary-success-950#0c120e#0c120e#0c120e10
tint-success#0c120e#e7efe9#0c120e130
lunary-success-900#19251c#19251c#19251c20
tint-success-mid#19251c#ceded3#19251c160
lunary-success-200#ceded3#ceded3#ceded350
lunary-error-100#f6e0e0#f6e0e0#f6e0e010
lunary-success-100#e7efe9#e7efe9#e7efe910
lunary-secondary-50#f2f2fd#f2f2fd#f2f2fd00Never used
lunary-accent-50#f8f0ff#f8f0ff#f8f0ff10
lunary-rose-50#fdf1f5#fdf1f5#fdf1f500Never used
lunary-primary-50#f6f3fc#f6f3fc#f6f3fc20
lunary-error-50#fcf3f3#fcf3f3#fcf3f300Never used
lunary-highlight-50#fbf2fd#fbf2fd#fbf2fd00Never used
lunary-success-50#f6f9f7#f6f9f7#f6f9f710
chart-star#fff8e7#7e58be#fff8e702
chart-text#ffffff#2c1f44#ffffff067
color-text#ffffff#ffffff#ffffff067
content-primary#ffffff#1a0f2e#ffffff3,38868
lunary-text#ffffff#ffffff#ffffff067
lunary-rose-950#1b030b#1b030b#1b030b00Never used
tint-rose#1b030b#fadbe5#1b030b30
lunary-rose-400#e84a7d#e84a7d#e84a7d220
color-rose#ee789e#ee789e#ee789e024
lunary-rose#ee789e#ee789e#ee789e13424
lunary-rose-300#f089aa#f089aa#f089aa580
lunary-rose-900#360716#360716#36071610
tint-rose-mid#360716#f6b7cb#360716290
lunary-rose-800#5b0b25#5b0b25#5b0b2550
tint-rose-edge#5b0b25#f6b7cb#5b0b2540
lunary-rose-700#881137#881137#881137250
lunary-rose-600#b5174a#b5174a#b5174a90
lunary-rose-500#e21d5c#e21d5c#e21d5c110
lunary-error-950#180707#180707#18070700Never used
tint-error#180707#f6e0e0#180707120
lunary-error-900#2f0e0e#2f0e0e#2f0e0e20
tint-error-mid#2f0e0e#ecc0c0#2f0e0e180
lunary-error-800#4f1717#4f1717#4f171790
tint-error-edge#4f1717#ecc0c0#4f171760
lunary-error-700#762323#762323#762323500
lunary-error-600#9d2f2f#9d2f2f#9d2f2f80
lunary-error-500#c53a3a#c53a3a#c53a3a80
color-error#d06060#d06060#d06060014
lunary-error#d06060#d06060#d060609514
lunary-error-400#d06262#d06262#d06262100
chart-aspect-square#f87171#be4848#f87171011
chart-retrograde#f87171#be4848#f87171011
chart-fire#ff7b74#c65c5c#ff7b7400
content-error#e19999#c53a3a#e19999840
lunary-error-300#e19999#e19999#e19999470
lunary-error-200#ecc0c0#ecc0c0#ecc0c0100
tint-warning#451a03#fef3c7#451a03230
tint-warning-mid#78350f#fde68a#78350f462
tint-warning-edge#92400e#fde68a#92400e43
chart-aspect-opposition#ffd6a3#aa7842#ffd6a306
content-warning#fcd34d#92400e#fcd34d9116
chart-earth#88b070#537b59#88b07000
lunary-success-800#293d2f#293d2f#293d2f140
tint-success-edge#293d2f#ceded3#293d2f120
lunary-success-700#3e5b47#3e5b47#3e5b47460
lunary-success-600#527a5f#527a5f#527a5f200
lunary-success-500#679876#679876#67987670
color-success#6b9b7a#6b9b7a#6b9b7a018
lunary-success#6b9b7a#6b9b7a#6b9b7a27818
lunary-success-400#85ad92#85ad92#85ad92270
content-success#b0cab8#3e5b47#b0cab8830
lunary-success-300#b0cab8#b0cab8#b0cab8540
chart-aspect-trine#7bffb8#438b65#7bffb808
chart-air#86c0eb#4a8bbc#86c0eb00
chart-aspect-sextile#94d1ff#4c82b2#94d1ff05
lunary-secondary-600#1e1eae#1e1eae#1e1eae160
lunary-secondary-500#2626d9#2626d9#2626d920
lunary-secondary-950#05051a#05051a#05051a30
tint-secondary#05051a#dcdcf9#05051a100
lunary-secondary-900#090934#090934#090934110
tint-secondary-mid#090934#babaf3#090934240
lunary-secondary-800#0f0f57#0f0f57#0f0f57320
tint-secondary-edge#0f0f57#babaf3#0f0f57150
lunary-secondary-700#171782#171782#171782400
lunary-secondary-400#5151e1#5151e1#5151e1340
color-secondary#7b7be8#7b7be8#7b7be8038
lunary-secondary#7b7be8#7b7be8#7b7be810838
chart-backdrop-mid#15102d#f2ecfa#15102d00
layer-raised#291353#ffffff#2913534867
lunary-primary-800#291353#291353#291353660
stroke-subtle#291353#d4c4eb#2913532,1730
surface-overlay#291353#e7def7#2913532089
tint-primary-edge#291353#cebdf0#291353290
chart-backdrop-center#2e1a5e#faf7ff#2e1a5e00
chat-user-border#3e1d7c#b094e6#3e1d7c00
layer-high#3e1d7c#e7def7#3e1d7c889
lunary-primary-700#3e1d7c#3e1d7c#3e1d7c3780
stroke-default#3e1d7c#b094e6#3e1d7c7610
lunary-primary-600#5227a5#5227a5#5227a54410
lunary-primary-500#6730cf#6730cf#6730cf1944
stroke-strong#6730cf#8458d8#6730cf10876
chart-angular#8e8eeb#6860be#8e8eeb00
content-brand-secondary#8e8eeb#1e1eae#8e8eeb1620
lunary-secondary-300#8e8eeb#8e8eeb#8e8eeb390
lunary-secondary-200#babaf3#babaf3#babaf300Never used
lunary-secondary-100#dcdcf9#dcdcf9#dcdcf900Never used
chart-surface-soft#0c0619#faf7ff#0c061900
layer-deep#0c0619#f6f3fc#0c06192570
lunary-primary-950#0c0619#0c0619#0c061970
surface-elevated#0c0619#f6f3fc#0c06192,2360
tint-primary#0c0619#e7def7#0c061999
chart-surface#190c32#ffffff#190c32067
chat-user-bg#190c32#e7def7#190c3209
layer-base#190c32#faf9ff#190c328080
lunary-primary-900#190c32#190c32#190c32150
surface-card#190c32#ffffff#190c3267867
tint-primary-mid#190c32#cebdf0#190c32180
lunary-accent-900#23003d#23003d#23003d80
tint-accent-mid#23003d#dcadff#23003d240
lunary-accent-800#3a0066#3a0066#3a0066110
tint-accent-edge#3a0066#dcadff#3a006650
chart-stroke-subtle#3e2a67#e2d8f1#3e2a6700
lunary-accent-700#570099#570099#570099670
lunary-accent-600#7400cc#7400cc#7400cc150
chart-stroke#6748a6#c5b5e0#6748a600
lunary-accent-500#9100ff#9100ff#9100ff120
color-primary#8458d8#8458d8#8458d8072
lunary-primary#8458d8#8458d8#8458d846472
lunary-primary-400#855ad8#855ad8#855ad81,1360
lunary-accent-400#a733ff#a733ff#a733ff650
content-muted#9a73e0#6730cf#9a73e04,4074
chart-text-muted#b094e6#705d91#b094e600
content-brand#b094e6#5227a5#b094e61,0810
lunary-primary-300#b094e6#b094e6#b094e6640
content-secondary#cebdf0#3e1d7c#cebdf02,6180
lunary-primary-200#cebdf0#cebdf0#cebdf070
lunary-primary-100#e7def7#e7def7#e7def739
lunary-accent-950#11001f#11001f#11001f10
tint-accent#11001f#edd6ff#11001f150
lunary-highlight-600#921cb0#921cb0#921cb040
chart-water#b886da#8658b0#b886da00
lunary-accent-300#c67aff#c67aff#c67aff210
chart-aspect-conjunction#c77dff#8958ca#c77dff045
chart-selected#c77dff#7400cc#c77dff045
color-accent#c77dff#c77dff#c77dff045
content-brand-accent#c77dff#7400cc#c77dff42245
lunary-accent#c77dff#c77dff#c77dff44545
lunary-accent-200#dcadff#dcadff#dcadff00Never used
lunary-accent-100#edd6ff#edd6ff#edd6ff00Never used
lunary-highlight-950#16041a#16041a#16041a10
tint-highlight#16041a#f3dcf9#16041a40
lunary-highlight-900#2c0835#2c0835#2c083520
tint-highlight-mid#2c0835#e8b9f4#2c0835290
lunary-highlight-800#490e58#490e58#490e5840
tint-highlight-edge#490e58#e8b9f4#490e5820
lunary-highlight-700#6e1584#6e1584#6e158450
lunary-highlight-500#b723dc#b723dc#b723dc20
lunary-highlight-400#c54fe3#c54fe3#c54fe340
color-highlight#d070e8#d070e8#d070e8022
lunary-highlight#d070e8#d070e8#d070e83922
lunary-highlight-300#d98ded#d98ded#d98ded20
lunary-highlight-200#e8b9f4#e8b9f4#e8b9f400Never used
lunary-highlight-100#f3dcf9#f3dcf9#f3dcf900Never used
lunary-rose-200#f6b7cb#f6b7cb#f6b7cb70
lunary-rose-100#fadbe5#fadbe5#fadbe500Never used

Exact drift: 22 colours, 436 uses

Each segment is a literal colour from the code, sized by uses, identical to a declared token. Select one to see the tokens and files.

#8458d8

Exact drift · deterministic

Written
72 times
Share of all exact drift
16.5%

Identical to

color-primary · lunary-primary · stroke-strong

Files (Saer’s sample, up to five)

  • src/app/admin/bip/BipTriggerButtons.tsx
  • src/app/api/forecast/yearly/calendar/route.ts
  • src/app/api/newsletter/daily-horoscope/opt-in/route.ts
  • src/app/birth-chart/transits/TransitReadingView.tsx
  • src/app/birth-chart/transits/TransitTeaserView.tsx
All 22 exact drift findings as a table
Exact drift · deterministic
Raw valueIdentical tokenUsesFirst file
#8458d8color-primary, lunary-primary, stroke-strong72src/app/admin/bip/BipTriggerButtons.tsx
#ffffffchart-backdrop-edge, chart-shadow, chart-surface, chart-text, color-text, content-primary, layer-raised, lunary-text, surface-card67src/app/api/admin/reactivate-users/route.ts
#0a0a0acolor-bg, lunary-bg, page-bg, surface-base62src/app/admin/bip/page.tsx
#c77dffchart-aspect-conjunction, chart-selected, color-accent, content-brand-accent, lunary-accent45src/app/(authenticated)/app/group-sky/page.tsx
#7b7be8color-secondary, lunary-secondary38src/app/api/forecast/yearly/calendar/route.ts
#ee789ecolor-rose, lunary-rose24src/app/api/forecast/yearly/calendar/route.ts
#d070e8color-highlight, lunary-highlight22src/app/api/forecast/yearly/calendar/route.ts
#6b9b7acolor-success, lunary-success18src/app/api/forecast/yearly/calendar/route.ts
#d06060color-error, lunary-error14src/app/api/forecast/yearly/calendar/route.ts
#fcd34dcontent-warning14src/app/birth-chart/chart-wheel-og.tsx
#f87171chart-aspect-square, chart-retrograde11src/app/(authenticated)/app/time-machine/page.tsx
#050505color-bg-deep, lunary-bg-deep10src/app/admin/transit-blog/page.tsx
#e7def7chat-user-bg, layer-high, lunary-primary-100, surface-overlay, tint-primary9src/app/birth-chart/transits/TransitReadingView.tsx
#7bffb8chart-aspect-trine8src/app/(authenticated)/app/group-sky/page.tsx
#ffd6a3chart-aspect-opposition6src/app/(authenticated)/app/group-sky/page.tsx
#94d1ffchart-aspect-sextile5src/app/(authenticated)/app/group-sky/page.tsx
#6730cfcontent-muted, lunary-primary-500, stroke-strong4src/app/birth-chart/transits/TransitReadingView.tsx
#92400econtent-warning, tint-warning-edge2src/app/grimoire/candle-magic/page.tsx
#fff8e7chart-star2src/components/states/CosmicErrorBoundary.tsx
#1a0f2econtent-primary1src/components/charts/chartTheme.ts
#78350ftint-warning-mid1src/app/grimoire/candle-magic/colors/page.tsx
#fde68atint-warning-edge, tint-warning-mid1src/app/birth-chart/chart-wheel-svg.tsx

Near-matches, kept apart

78 raw colours sit perceptually close to a token. Saer shows the distance and leaves the decision to you: close is not the same as equal.

  • #080b12 → color-bgΔOKLab 0.017 · 17 uses
  • #2c2140 → chart-textΔOKLab 0.011 · 9 uses
  • #0a0a0f → color-bgΔOKLab 0.011 · 9 uses
  • #feffff → chart-backdrop-edgeΔOKLab 0.001 · 8 uses
  • #e7d7fb → lunary-accent-100ΔOKLab 0.011 · 8 uses
  • #2f2448 → chart-textΔOKLab 0.017 · 6 uses
  • #ff6b6b → chart-aspect-squareΔOKLab 0.015 · 5 uses
  • #7f1d1d → lunary-error-700ΔOKLab 0.019 · 5 uses
  • #2d2548 → chart-textΔOKLab 0.018 · 4 uses
  • #1a1030 → content-primaryΔOKLab 0.005 · 3 uses
  • #09090b → color-bgΔOKLab 0.006 · 3 uses
  • #f8fafc → layer-baseΔOKLab 0.006 · 3 uses

12 of 78 near-matches. Inferred, never mixed with exact drift: a person decides.

All 78 near-matches as a table
Near-match · inferred
Raw valueNearest tokenΔOKLabUsesFirst file
#080b12color-bg, lunary-bg (#0a0a0a)0.01717src/app/birth-chart/transits/TransitsCaptureClient.tsx
#2c2140chart-text (#2c1f44)0.0119src/constants/seo/thematic-palette-config.ts
#0a0a0fcolor-bg, lunary-bg (#0a0a0a)0.0119src/app/admin/bip/BipTriggerButtons.tsx
#feffffchart-backdrop-edge, chart-shadow (#ffffff)0.0018src/components/OnboardingFlow.tsx
#e7d7fblunary-accent-100, tint-accent (#edd6ff)0.0118src/app/grimoire/wheel-of-the-year/page.tsx
#2f2448chart-text (#2c1f44)0.0176src/constants/seo/thematic-palette-config.ts
#ff6b6bchart-aspect-square, chart-retrograde (#f87171)0.0155src/app/api/tiktok/callback/route.ts
#7f1d1dlunary-error-700 (#762323)0.0195src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#2d2548chart-text (#2c1f44)0.0184src/constants/seo/thematic-palette-config.ts
#1a1030content-primary (#1a0f2e)0.0053src/lib/instagram/design-system.ts
#09090bcolor-bg, lunary-bg (#0a0a0a)0.0063src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#f8fafclayer-base, surface-base (#faf9ff)0.0063src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#1a0a2echart-surface, chat-user-bg (#190c32)0.0093src/lib/instagram/design-system.ts
#111111lunary-success-950, tint-success (#0c120e)0.0133src/lib/instagram/caption-content.ts
#e6edf3lunary-success-100, tint-success (#e7efe9)0.0163src/components/ui/CodeBlock.tsx
#1f3a30lunary-success-800, tint-success-edge (#293d2f)0.0183src/constants/seo/thematic-palette-config.ts
#431407tint-warning (#451a03)0.0183src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#2e5a48content-success, lunary-success-700 (#3e5b47)0.0193src/constants/seo/thematic-palette-config.ts
#f4f4fflayer-deep, lunary-primary-50 (#f6f3fc)0.0042src/app/api/cosmic-report/generate/route.ts
#9b75e3content-muted (#9a73e0)0.0062src/lib/pdf/styles.ts
#081210lunary-success-950, tint-success (#0c120e)0.0072src/lib/instagram/design-system.ts
#f5f5f5lunary-error-50 (#fcf3f3)0.0102src/app/grimoire/candle-magic/page.tsx
#0b0b0fcolor-bg, lunary-bg (#0a0a0a)0.0112src/app/admin/gpt-bridge/page.tsx
#1a1028content-primary (#1a0f2e)0.0132src/lib/pdf/styles.ts
#e9e3ffchat-user-bg, layer-high (#e7def7)0.0152src/components/gifts/SubscriptionGiftCard.tsx
#121212lunary-success-950, tint-success (#0c120e)0.0152src/lib/pdf/styles.ts
#ffe08atint-warning-edge, tint-warning-mid (#fde68a)0.0152src/app/(authenticated)/app/group-sky/page.tsx
#c084fcchart-aspect-conjunction, chart-selected (#c77dff)0.0192src/components/SaveToCollection.tsx
#7c2d12tint-warning-mid (#78350f)0.0192src/lib/moon/identities.ts
#6d28d9content-muted, lunary-primary-500 (#6730cf)0.0202src/app/api/admin/reactivate-users/route.ts
#ff7b72chart-fire (#ff7b74)0.0031src/components/ui/CodeBlock.tsx
#f7effflunary-accent-50 (#f8f0ff)0.0031src/app/grimoire/wheel-of-the-year/page.tsx
#fff0f5lunary-rose-50 (#fdf1f5)0.0041src/lib/instagram/design-system.ts
#f5f0fflunary-accent-50 (#f8f0ff)0.0041src/lib/instagram/design-system.ts
#14102achart-backdrop-mid (#15102d)0.0061src/lib/instagram/design-system.ts
#f7fafclunary-success-50 (#f6f9f7)0.0071src/app/api/blog/weekly/route.ts
#f9fafblayer-base, surface-base (#faf9ff)0.0071utils/og/symbols.ts
#f0f0fflunary-secondary-50 (#f2f2fd)0.0071src/lib/instagram/ig-utils.tsx
#08070dchart-backdrop-edge (#08060f)0.0081src/lib/quiz/cosmic-vibe.ts
#fed7aachart-aspect-opposition (#ffd6a3)0.0081src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#fff8edchart-star (#fff8e7)0.0081src/app/grimoire/wheel-of-the-year/page.tsx
#fffbe6chart-star (#fff8e7)0.0081src/components/charts/MoonPhase.tsx
#1b0f2acontent-primary (#1a0f2e)0.0081src/lib/quiz/cosmic-vibe.ts
#8fae6echart-earth (#88b070)0.0091src/lib/pdf/templates/CosmicReportTemplate.tsx
#f3d4fflunary-accent-100, tint-accent (#edd6ff)0.0091src/app/share/birth-chart/ShareBirthChartLayout.tsx
#7a1f1flunary-error-700 (#762323)0.0101src/lib/quiz/cosmic-vibe.ts
#07110dlunary-success-950, tint-success (#0c120e)0.0101src/app/share/birth-chart/ShareBirthChartLayout.tsx
#fffdf7chart-backdrop-edge, chart-shadow (#ffffff)0.0101src/lib/instagram/design-system.ts
#0a0613chart-backdrop-edge (#08060f)0.0101src/lib/pdf/templates/CosmicReportTemplate.tsx
#f3f4f6layer-deep, lunary-primary-50 (#f6f3fc)0.0101src/app/admin/crystal-gallery/page.tsx
#a23030lunary-error-600 (#9d2f2f)0.0111src/app/share/birth-chart/ShareBirthChartLayout.tsx
#fff8f0chart-star (#fff8e7)0.0121src/lib/instagram/design-system.ts
#2a1010lunary-error-900, tint-error-mid (#2f0e0e)0.0121src/lib/instagram/design-system.ts
#eeeeeelunary-success-100, tint-success (#e7efe9)0.0131scripts/send-reset-emails.js
#1a0a0alunary-error-950, tint-error (#180707)0.0131src/lib/instagram/design-system.ts
#d4dffflunary-secondary-100, tint-secondary (#dcdcf9)0.0131src/app/share/birth-chart/ShareBirthChartLayout.tsx
#6b5b95chart-text-muted (#705d91)0.0131src/lib/quiz/cosmic-vibe.ts
#07081achart-surface-soft, layer-deep (#0c0619)0.0131src/app/share/birth-chart/ShareBirthChartLayout.tsx
#1f3f2flunary-success-800, tint-success-edge (#293d2f)0.0131src/lib/quiz/cosmic-vibe.ts
#eefcfflunary-success-50 (#f6f9f7)0.0131src/app/grimoire/wheel-of-the-year/page.tsx
#0d0d0dcolor-bg, lunary-bg (#0a0a0a)0.0141utils/og/symbols.ts
#e8ecffchart-backdrop-mid (#f2ecfa)0.0141src/components/charts/chartTheme.ts
#121208lunary-success-950, tint-success (#0c120e)0.0151src/lib/instagram/design-system.ts
#120808lunary-error-950, tint-error (#180707)0.0151src/lib/instagram/design-system.ts
#b8b8e8lunary-secondary-200, tint-secondary-edge (#babaf3)0.0161src/lib/instagram/ig-utils.tsx
#120f08lunary-success-950, tint-success (#0c120e)0.0161src/lib/instagram/design-system.ts
#1a0612lunary-rose-950, tint-rose (#1b030b)0.0161src/lib/quiz/cosmic-vibe.ts
#0a0b12color-bg, lunary-bg (#0a0a0a)0.0171src/app/share/birth-chart/ShareBirthChartLayout.tsx
#1c0a28content-primary (#1a0f2e)0.0181src/lib/instagram/design-system.ts
#0f0a1achart-surface-soft, layer-deep (#0c0619)0.0181utils/og/symbols.ts
#2a0a0alunary-error-900, tint-error-mid (#2f0e0e)0.0181src/lib/quiz/cosmic-vibe.ts
#12060alunary-error-950, tint-error (#180707)0.0191src/app/share/birth-chart/ShareBirthChartLayout.tsx
#2d1f4echart-text (#2c1f44)0.0191utils/og/symbols.ts
#100820chart-surface-soft, layer-deep (#0c0619)0.0191src/lib/instagram/design-system.ts
#ddd6felunary-secondary-100, tint-secondary (#dcdcf9)0.0191src/app/grimoire/guides/learn-birth-chart/ChartReadingExampleInteractive.tsx
#0a1418lunary-success-950, tint-success (#0c120e)0.0191src/lib/instagram/design-system.ts
#e8e8ffchart-backdrop-mid (#f2ecfa)0.0201src/lib/instagram/ig-utils.tsx
#d25656color-error, lunary-error (#d06060)0.0201src/components/charts/chartTheme.ts
Typography · in the beta

Typography: the scale you really use.

24 font sizes in use across 18,547 observations. Values off the declared scale are lavender, because off-scale is an inference.

Show

14px

On the declared scale

Uses
3,909
Through token classes
3,907
As raw values
2
Through variables
0

Classes

text-sm

Foundations · in the beta

Foundations: the scales hiding in the styles.

Exact drift and off-scale values in each foundation
FoundationObservationsExact drift (uses)Off the scale, inferred
Spacing and sizing34,66523 (58)39
Border radius5,1014 (7)8
Shadows and elevation2450 (0)43
Z-index1750 (0)11
Breakpoints2,4962 (9)3
Border widths3,7141 (1)0
Opacity3735 (6)0
Motion3961 (1)2
Components · in the beta

Components: what exists, what is duplicated, what gets restyled.

1,668 components, every one of 10,774 JSX use sites resolved to its definition. 100 unused, 20 variant findings, 19 components restyled at their call sites.

<Button>: 164 of 538 uses restyle it

One square per use of <Button> across 194 files. Filled: the call site overrides a property the component already sets.

What the call sites override

  • color61 sites
  • background-color60 sites
  • radius-bl44 sites
  • radius-br44 sites
  • radius-tl44 sites
  • radius-tr44 sites

Most frequent overriding classes: rounded-full (41), text-xs (21), border-stroke-default (18), text-content-muted (16), hover:bg-surface-card (15), gap-1.5 (12).

Defined in src/components/ui/button.tsx.

15 component names defined more than once

Component names defined in more than one file, with each file and its uses
NameDefined inUses
<BirthChart>src/app/grimoire/components/BirthChart.tsx2
src/components/BirthChart.tsx7
<Breadcrumbs>src/components/comparison/Breadcrumbs.tsx1
src/components/grimoire/Breadcrumbs.tsx29
<DailyCosmicOverview>src/components/growth/DailyCosmicOverview.tsx0
src/components/profile/DailyCosmicOverview.tsx1
<EmptyState>src/components/growth/EmptyStates.tsx0
src/components/states/EmptyState.tsx1
<GrimoireLayout>src/app/grimoire/GrimoireLayout.tsx2
src/app/grimoire/GrimoireLayoutClient.tsx1
<GuideNudge>src/components/GuideNudge.tsx3
src/components/growth/GuideNudge.tsx0
<InsightCard>src/components/InsightCard.tsx1
src/components/admin/InsightCard.tsx1
<LuckyElements>src/app/(authenticated)/horoscope/components/LuckyElements.tsx0
src/components/LuckyElements.tsx0
<PremiumPathway>src/components/PremiumPathway.tsx3
src/components/growth/PremiumPathway.tsx0
<ReflectionBox>src/components/growth/ReflectionBox.tsx0
src/components/horoscope/ReflectionBox.tsx0
<StreakBanner>src/components/StreakBanner.tsx5
src/components/growth/StreakBanner.tsx0
<TarotReflectionPrompts>src/components/growth/TarotReflectionPrompts.tsx0
src/components/tarot/TarotReflectionPrompts.tsx1
<TarotRitualForPatterns>src/components/growth/TarotRitualForPatterns.tsx0
src/components/tarot/TarotRitualForPatterns.tsx1
<TarotSeasonReading>src/components/growth/TarotSeasonReading.tsx0
src/components/tarot/TarotSeasonReading.tsx1
<TourProvider>src/components/feature-tour/tour-provider.tsx0
src/context/TourContext.tsx2
Accessibility checks · in the beta

Accessibility: static checks, with the evidence.

Contrast is judged for the text and background pairs written together in the source, in every colour context. Static checks only: not a statement of WCAG conformance.

Failing contrast pairs, default context
48
More that fail only in another context
111
Passing pairs
2,781
Pairs Saer could not judge, and says so
7,863
Focus styles removed with no replacement
2
Files animating with no reduced-motion fallback
28
Agent integration · in the beta

Then the agent asks before it builds.

A real exchange with saer mcp on Lunary, captured on 22 October 2026: a recommendation for a task, then a check of the agent’s draft. Trimmed for display, never reworded. No model is involved in the answers.

Agent calls saer_recommend

task: “add a confirm-delete dialog for removing a saved birth chart”

Saer answers

Build it from: Modal for dialog; Button variant="destructive" for delete; Button variant="default" for button. BirthChart is context: the thing the task acts on, not the UI to build (it may be the parent, or where to add this). BirthChartShowcase is related by name only; confirm it is the screen the task means before changing it.

deterministic: task words + explicit synonym and needs tables, matched on component, hook and function names (and their family and library folder), use across files, declared variant values and folders; ranked by match class, canonical standing, then uses. No model is involved.

Agent calls saer_check on its draft

export function DeleteChart() {
  return (
    <div style={{ color: "#8458d8", borderRadius: "7px", padding: "16px" }}>
      <button className="outline-none" style={{ width: 20, height: 20 }}>×</button>
    </div>
  );
}

Saer answers: verdict DRIFT, 6 findings

  • line 3#8458d8 is the value of colour token(s) lunary-primary, stroke-strong, color-primary in dark, default, light; use the token instead of the raw value
  • line 37px is on no radius step; nearest: rounded-lg (8px), rounded-md (6px)
  • line 316px is on the spacing scale: use p-4
  • line 4<button> removes the focus outline (outline-none) and shows no other focus style; add a visible focus style (for example the ones the codebase's own components use) or keep the outline
  • line 4<button> is 20.0 x 20.0 px, below 24.0px (AA)
  • line 420px is on the sizing scale: use h-5, w-5

Square: exact, deterministic. Circle: inferred, with the nearest steps. Checked as proposed code at this path (a virtual file; the repository is not changed).

See what Saer finds in your codebase.

The private beta is the full audit and saer mcp, for macOS on Apple Silicon. Everyone in the beta gets Pro free while it runs.