All writing

Designing the Fern dashboard

· 7 min read · Kapil Gowru
Ferndesignproduct
The Fern dashboard welcome screen: a 'Welcome to Fern' sign-in panel with a Continue with GitHub button on the left, and 'Instantly offer SDKs and API Docs' beside a floating card of SDK languages over a faded docs preview on the right.

I designed and built Fern's first dashboard from scratch. It launched in November 2025, and 11,700+ people have taken 355,000+ actions in it since. Here are the design decisions that made it feel like Fern.

TL;DR Fern ran entirely through a CLI and config files. That was right for CI pipelines but wrong for humans. For example, generating a team member to the Fern org meant messaging our support team. I designed every screen of the dashboard and shipped a share of the code myself. As a result, our monthly active users grew 6x in the three months after launch.

Before the dashboard

Fern turns API definitions into SDKs and Docs sites. For years the whole product was a CLI and a fern/ folder in your repo. For the core workflow that model was fine: SDK generation belongs in CI, Docs deploys belong in a pull request, and configuration belongs in Git version control where it can be reviewed.

But it broke the moment a task was not a pipeline. Generating an API key. Inviting a teammate. Pointing a Docs site at a custom domain. Some of these don't need a YAML edit, but YAML was the only interface we had, so customers did the reasonable thing: they asked our team to do it for them. Every one of those requests was a small tax on them and on us.

Our goal was simple, give everyone who touches Fern a visual home (engineers and docs writers alike). In addition, ensure it matches the polish of the docs sites that Fern renders for them. Salo Serfati at Chariot said it best on launch day:

Nice! No more having to edit docs through code editor

The system

Two major themes carried throughout the design: calm. It is the same principle that later shaped our marketing site rebuild.

Calm shows up as restraints in 3 main forms:

  1. The information architecture.
  2. The simplicity of copy.
  3. The speed to action.

The sidebar is a perfect example: we only surface the bare minimum of nav items to the user. Each nav item has a delightful custom crafted animation on hover. These philosophies extended to the dashboard.

The Fern dashboard SDKs screen: a table of seven SDKs across TypeScript, Python, Go, Java, C#, Ruby, and PHP, each with publish status, version, registry, and last generation date.
The SDKs screen is deliberately a table. Seven languages, publish status, registry links. Calm is a screen that answers your question and stops.

I designed the system in Figma and then worked daily with the engineer who built the first scaffolding: Zach Kirsh. I also shipped polish in code where owning the last detail mattered, like the subtle animation on each nav item. Designers who commit get to keep the nuance that usually dies in handoff.

The front door

The welcome screen sets the product itself adrift. A card of SDK languages hovers over a faded Docs site on a field of soft gradient and animated noise. The products introduce themselves quietly and have a subtle approach on hover.

The Fern dashboard welcome screen in light mode: 'Instantly offer SDKs and API Docs' with a floating SDK language card over a faded docs preview and soft green gradient.The Fern dashboard welcome screen in dark mode: a sign-in panel reading 'Welcome to Fern' with a Continue with Github button beside the floating SDK card composition.

Aleks Aperans at Sayari, on launch day:

I am still digesting but this feels so delightful already

Onboarding

I wanted an onboarding that surfaced the core value to our users in less than 5 minutes.

The first version kept the ask small. Configure your docs site in the simplest form I could draw: a site title and a bit of branding, nothing else. The bet was that the fastest way to earn trust was to ask for almost nothing and still hand back something real.

The first version of Fern's onboarding: a lightweight three-step wizard (Import, Configure, Publish) with fields for your company site, existing docs site, and API specs, plus example specs to pick from.
Version one. A light three-step wizard: point us at your site, add your branding, and publish. Ask for little, return something real.

The second version was led by Mathieu Legault, we wanted to get closer to a more beautiful feature-rich docs site.

To do this we improved our docs publishing engin and then we made the configuration realistic instead of minimal: pull branding straight from a company's marketing site, offer real themes and layouts, and, most importantly, show a live preview of the actual docs site in an iframe on the right. You change a color on the left and watch your own docs change on the right. The setup stops feeling like a form and starts feeling like you are already using the product.

The second version of onboarding: a branding panel on the left (import from a URL, site title, colors and logos with light and dark themes, corner radius) beside a live iframe preview of the generated Postman docs site on the right.
Version two, with Mathieu Legault. Branding pulled from a URL, real themes, and a live preview of your actual docs site on the right — configuration that shows its work.
The version-two flow, end to end: import branding, tune the theme, and watch the docs preview update live.

Mathieu knocked it out of the park with beautiful micro-interactions and animations. Outside of Mathieu, we had engineering contributions from Sarah Bawabe, Shraddha Shetty, and Tristan Declarin all shaped the version that shipped.

Floating panels

My atomic structure for the dashboard were floating panels with rounded edges. The goal was that these panels would slide around to fit the content that was important.

Everything in Fern nests. An org holds docs sites, a docs site holds settings, a setting holds a form. The standard answers are to navigate away, which loses your place, or to open a modal, which hides the context you need to fill it in.

Instead the floating panels slide from edges of the screen and the page you were on stays put underneath. Close a tray and you are exactly where you left off. You never lose the room you are standing in.

The floating panels in motion. Trays slide in from the edges and the canvas stays put underneath, so you never lose the room you're standing in.

Core functionality first

When starting from scratch, our gut reaction is to build every feature from our CLI and platform. Instead I designed all of the surface areas and we chose the top 3 flows that customers had been nagging us about:

  • Adding team members
  • Setting up custom domain
  • View Docs analytics

We built the shell first and then shipped these 3 features within a 2 months. Then we continued to tack on more features as agentic workflows became more popular. Now, everyone on the Fern team has contributed to the dashboard in some format.

An early iteration of the dashboard home: a welcome header, a docs site card with domain and changelog, and a two-item SDK list.A later iteration of the dashboard home with a fuller SDK list across seven languages and a custom domain callout.
The final pre-launch iteration of the dashboard home: domain card with a custom domain prompt, changelog with status badges, and the complete SDK configuration list.
The home screen went through three full versions before launch. The shell was worth the iteration because every future feature would live inside it.

Everything else stayed in the CLI until it earned enough commotion from a customer to warrant a Dashboard buildout. That discipline is why the dashboard launched in two months instead of six. Since launch, 373 docs sites have gone live on custom domains and customers have connected 1,500+ GitHub repos, the two workflows that used to be support tickets.

Now our Dashboard supports almost all of our flows including our visual [Fern Editor](link to blog).

The docs site settings screen in the Fern dashboard: add a custom domain or subpath, a Slack channel picker for page feedback, self-hosting, and an archive action.
The settings screen is the old support queue, turned into forms.

What I got wrong

I didn't forsee the amount of data that our customers wanted out of our platform. The dashboard put usage numbers in front of customers for the first time, docs traffic, top pages, AI query analytics, and within hours of seeing them, customers asked how to get them out. Alasdair Brown at ClickHouse:

And is this data available as an API for export? It would be cool if we could do some kind of daily export into our DWH

He was right, and he was not alone. Teams wanted the raw numbers as context for their own analysis and, increasingly, for their agents. We fast followed with export through the CLI, but the lesson stuck: in developer tools, every surface you build will eventually be asked to feed a machine. Design the export path with the feature, not after it.

By the numbers

355,000+
actions by 11,700+ unique users, all time
6x
monthly active user growth, 538 in January to 3,416 in April
10,800+
docs sites created by 5,100+ people
  • First commit in March 2025; the MVP shell shipped in about two months and it launched publicly in November 2025
  • 375,000+ docs publishes recorded all time, 118,900+ of them in June alone
  • 3,700+ API specs added through the onboarding flow in the last month
  • 527 paid plan upgrades completed inside the dashboard
  • The docs tab is the most used surface, with 23,500+ views in the last 30 days. Aleks at Sayari called the analytics "like vercel analytics but better."

User counts are unique identities, a conservative lower bound.

Launch day

We formally launched the dashboard in our shared customer Slack channels on November 21st, 2025. Some favorite reactions, straight from the threads:

Three Slack messages from Aleks Aperans at Sayari: 'amazing work, the API Explorer requests analytics is a great insight', 'I am still digesting but this feels so delightful already', and 'like vercel analytics but better'.Slack message from Michael Kozakov at Cohere: 'this is great! looking at the analytics i see that docs/command-r-plus is one of the most visited docs pages. is there a way to know where the traffic for this page is coming from? it's an old model, this is kind of unexpected.'Two Slack messages from Astronomer: Yan Mastin saying 'Will do, this looks awesome!' and Julian LaNeve saying 'this looks super helpful, I was just chatting w someone about docs traffic / analytics so very timely'.Slack message from Matt Bernstein at HumanSignal: 'Will do! Was just starting to add Google Analytics to our Fern site so this is great!'Slack messages from Zachary Greathouse at Hume: a raised-hands reaction and 'This is great! Requested access!'Slack message from Nate KP at Truemed: 'This is dope!'

Try it

The dashboard is live at dashboard.buildwithfern.com.

Timeline

Two and a half years of shipping, month by month. The filled dots link to the section where I go deeper.

2025

  1. MarchDashboard is born: initial skeleton, Vercel preview deploys, and an Auth0 login page.
  2. AprilFoundations: members page, org roles, PostHog + Pylon + Redis, and the Figma-based design system.
  3. MayA quiet month, planning and no shipped changes.
  4. JuneSupabase wired in; the Visual Editor begins (Tiptap editing, sidebar, header).
  5. JulyAsk Fern lands: the fai service is integrated and the first analytics dashboard (histograms and bar charts) ships.
  6. AugustGoogle sign-in, an "Ask AI" chat button, and the fai v1.0.0 microservice; the Visual Editor matures.
  7. SeptemberAnalytics frontend plus an internal PostHog SDK; richer Visual Editor components (images, embeds, buttons).
  8. OctoberAnalytics goes big: web analytics (countries, paths, search), Algolia search analytics, and customer onboarding endpoints.
  9. NovemberThe docs onboarding wizard: guided repo creation and repo transfer.
  10. DecemberFTUX V1 launches, the first true first-time-user flow, plus a cross-domain analytics toggle.

2026

  1. JanuarySelf-serve custom domains from the dashboard (SSO by email domain, Slack alerts), and onboarding polish with URL autogeneration and a preview widget.
  2. FebruaryA sign-up page with first-time UX; onboarding tuned around real sample specs.
  3. MarchBusiest month ever: a members DataTable with login metadata, OIDC group mapping, AI-credit Slack alerts, and self-serve site deletion.
  4. AprilA streaming analytics page and analytics cron; Brandfetch-powered branding auto-applied during onboarding.
  5. MayThe agentic era: an API Tokens admin page, persisted agent conversations, Fern Writer runs, and superuser agent chat.
  6. JuneFTUX V2 build-out: iframe live preview, layout/font/button selectors, and password protection and changelog in the publish flow.
  7. JulyFTUX V2 becomes the default; an AI Usage page for customers, a resizable sidebar, and event-level search analytics.