Source

Thedesignistheproduct

No more handoffs. You're welcome.

northstar-app
design/stat-card
Layers
App
DashboardPage
Sidebar
Overview
StatRow
StatCard×3
RevenueChart
CustomerTable
Northstar
OverviewCustomersReportsSettings
OverviewLast 30 days
StatCard × 3
Revenue$48.2k+12.4%
Customers1,284+3.1%
Retention96.4%+0.4%
Revenue by day
NorthwindActive$12,480
InitechTrial$3,200
UmbrellaActive$28,150
SoylentActive$9,640
StylesCodeStatCard
layout
directioncolumn
gapspace.2
card
paddingspace.4
radiusradius.md
fillsurface.raised
borderborder.subtle
children
Labeltone muted
Headinglevel 3 · numeric
Deltawhen present
import { Card, Label, Heading, Delta } from '~/ui'export function StatCard({ label, value, delta }: StatCardProps) {
  return (
    <Card padding="4" radius="md">
      <Label tone="muted">{label}</Label>
      <Heading level={3} variant="numeric">
        {value}
      </Heading>
      {delta ? <Delta value={delta} /> : null}
    </Card>
  )
}

Your whole career, working around the same problem.

01

Redlines. Specs. Someone else interpreting your work, and endless meetings about why it didn't match.

02

A design system living in two places, drifting from the day it shipped. Stitched and synced with band-aids and hope.

03

Then AI arrived. Prompt it, wait, and get very good at chatting. Take the prompt away, and nothing ships.

You deserve better.

Sourceisforpeoplewhorefusetotradecraftforshortcuts.Whatyoucreateiswhatships,becausetherenevershouldhavebeenagap.

A local-first desktop app for macOS, Windows, and Linux.

Launching Fall 2026.

You're designing in production now.

Open the actual repo, and it follows what's there. Your team decides what's safe for designers to touch.

Open a repo
start
Open an existing repoYour folders, naming and conventions stay exactly as they are.
Start something newA clean project you would not be embarrassed to inherit.
recent
northstar-apppnpm · React · CSS Modules
2m
acme-design-systempnpm · React · Tailwind
yesterday
orbit-marketingnpm · Vue · Sass
3d
fieldkitpnpm · Svelte · CSS
last week
package.jsontsconfig.jsonReact 18CSS Modules214 components47 tokens

Your app's DNA.
No drift.

Tokens and global styles are written into your repo. Update and everything downstream follows.

src/tokens/theme.css
accent scale
--color-accent
--color-surface
--color-text
--radius-md
Monthly revenue$48,200
View report

Your components.
Not pictures of them.

Layouts, styles, variants, props. Not a mockup with a variant switcher. Exactly what your users get.

src/components/Button.tsx
sm
md
lg
primary
secondary
ghost

Explore as much as you want. Keep one.

Whole layouts side by side, properly worked out, not sketched. Nothing touches the codebase until you choose.

src/screens/Overview.tsx
saved to your project

Third-party libraries, on your canvas.

Real components, real props, read from your repo's dependencies. Nothing redrawn, nothing stale.

node_modules
your dependencies
Autocomplete@mui/material
Dialog@radix-ui/react-dialog
motion.divframer-motion
DataTable@tanstack/react-table
Autocomplete
Component
but
ButtonButtonGroupIconButton
Dialog
Publish to your design system?Two components and one token change will be added to @northstar/ui.
CancelPublish
real props
data
optionscomponents
labelComponent
behavior
multiple
disabled
onChangesetValue
content
titlePublish to your design system?
descriptionTwo components, one token
behavior
open
confirmLabelPublish
onConfirmpublishToLibrary

Prototypes lie.
Your work won't.

Loops, conditions, state, events. Written into the component, running the way it will in the browser.

Cart
Aeron chair
1+
Desk lamp
1+
Monitor arm
1+
Subtotal

This is production animation.

Keyframes, easing, stagger, scroll-driven. Nothing to export, because there is nothing to convert.

src/components/StatCards.tsx
Revenue$48.2k+12.4%
Customers1,284+3.1%
Retention96.4%+0.4%
Trials312+8.2%
Renewals96%+1.7%
0.0s0.3s0.6s0.9s1.2s
opacity
translate y
stagger

Your vectors,
drawn as SVG.

Pen, anchors, Bézier curves, booleans. Saved in your repo, not exported from another app.

src/icons
arrow.svg
check.svg
bookmark.svg
plus.svg
search.svg
bell.svg
star.svg
folder.svg
lock.svg
eye.svg
clock.svg
grid.svg
link.svg
download.svg

One file.
Two views.

Work however you want. Nothing is syncing or updating because it's not two things. Fully bidirectional.

src/components/Activity.tsx
ActivitySessions across all projects7d30d90d
12,480+12.4%
const { data, range, setRange } = useMetrics('7d')

<Card title="Activity" caption="Sessions across all projects">
  <Segmented slot="action" options={ranges} value={range} onChange={setRange} />
  <Stat value={data.total} delta={data.delta} format="compact" />
  <BarChart series={data.series} labels={days} accent="brand" highlight="last" />
</Card>
drag the seam

Review it like code. Because it is.

Branch, commit, and open pull requests. See what changed by looking at it, not by reading it.

design/stat-card
before
Revenue$48,200
after
Revenue$48,200+12.4% this month
githubAdd caption to Deltapull request #218 · checks passed
mergeddesign/stat-card → main2 files, 27 insertions
npm - design systems@northstar/ui 1.4.2 → 1.5.0published

Same design. Same code. Every time.

Deterministic, not generated. No surprises on the second run.
Any framework and style library you want.

src/screens/Overview.tsxemitted
export function Overview({ range }: OverviewProps) {
  const [metrics, setMetrics] = useState<Metric[]>([])
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    let active = true
    fetchMetrics(range).then((data) => {
      if (!active) return
      setMetrics(data)
      setLoading(false)
    })
    return () => { active = false }
  }, [range])

  return (
    <Show when={!loading} fallback={<Skeleton rows={3} />}>
      <Grid columns={3} gap="4">
        {metrics.map((m) => (
          <StatCard key={m.id} label={m.label} value={m.value} delta={m.delta} />
        ))}
      </Grid>
    </Show>
  )
}

Tell Source what you want.

The AI reads your request and picks the command. Source runs it. Any model you want, including local.

src/components/CustomerList.tsx3 states added
customers
Northwind
Initech
Umbrella
Soylent
default
customers
No customers yetAdd one
empty
customers
loading
customers
!Couldn't load customersRetry
error
heard itmatched 4 commandsused your componentsyour key, your modelthe model never edits your files
Josh Adamous

Built by
one stubborn
son of a bitch.

I've been a design engineer for fifteen years. I designed and coded from the start, then kept doing it so my work wouldn't fall apart.

You shouldn't need to master both to see your work all the way through. Now you don't.

It's early, which means when you reach out, you get me.

Early access is limited.

I'm onboarding people myself. The first 25 qualified beta testers keep it free for life.

No spam. I'm too busy for that.