Pricing Dock

Plan cards that fold into the comparison table's sticky header as you scroll. Each card folds straight down into its own column: the price shrinks in beside the name, the button narrows, the badge flattens into an accent line, and the cards close into one bar. Click a docked name to see its whole card again.

  • Pricing
  • Scroll
  • Table

Uses motion, clsx, tailwind-merge

Open in ChatGPTOpen in Claude

Pricing

Start free. Pay as your traffic grows.

Every plan gets the same models and the same speed. Higher tiers raise your limits and add the controls a security review asks for.

Feature
Free
$0 /mo

No card needed

Prototype with every fast model.

  • 20 requests per minute
  • 1M tokens a month
  • Fast and embedding models
  • Community support
Most popular
Pro
$40 /mo

Billed monthly

For apps with real users in production.

  • 500 requests per minute
  • Reasoning models
  • Batch API at half price
  • 5 team seats
Scale
$400 /mo

Billed monthly

High volume, tuned to your own data.

  • 5,000 requests per minute
  • Fine-tuning and evals
  • Zero data retention
  • Priority support
Enterprise
Custom

Annual contract

Private deployments and custom terms.

  • Private model deployments
  • SSO, SCIM and audit logs
  • Pin data to a region
  • 99.99% uptime SLA
Usage
Requests per minuteSustained rate across all models. Short bursts up to 2× are allowed.
20
500
5,000
Custom
Tokens per month
1M
50M
1B
Unlimited
Context windowThe most tokens a single request can read, prompt and files included.
32K
200K
1M
1M
Batch API
Not included
Included
Included
Included
Prompt caching
Not included
Included
Included
Included
Models
Fast models
Included
Included
Included
Included
Reasoning models
Not included
Included
Included
Included
Embeddings and rerank
Included
Included
Included
Included
Fine-tuningTrain on your own examples and serve the result at the base model's price.
Not included
Not included
Included
Included
Private deployments
Not included
Not included
Not included
Included
Collaboration
Team seats
1
5
25
Unlimited
Shared projects
Not included
Included
Included
Included
Usage alerts
Included
Included
Included
Included
Role-based access
Not included
Not included
Included
Included
Security
SSO (SAML, OIDC)
Not included
Not included
Add-on
Included
Data retentionHow long prompts and outputs are kept for abuse monitoring. Never used for training.
30 days
30 days
Zero
Custom
SOC 2 Type II report
Not included
Included
Included
Included
Audit logs
Not included
Not included
Included
Included
Region pinning
Not included
Not included
US or EU
Any region
Support
Support
Community
Email
Priority, 4h
Dedicated
Uptime SLA
Not included
Not included
99.9%
99.99%

Need more than 5,000 requests a minute?

We set custom limits within a day and can run models in your own cloud.

Talk to sales

Installation

Add the component on its own with the CLI, or copy the file in by hand.

The CLI writes components/ui/pricing-dock.tsx and installs motion, clsx and tailwind-merge. It needs the @keyframeui registry in components.json; add it once per project.

npx shadcn@latest add @keyframeui/pricing-dock

Examples

Finished sections built with Pricing Dock. Each one installs whole, with the component included.

Studio Packages

A design studio's three ways to work together, set in an editorial serif with tighter corners (`radius={6}`), a wider `gap` and warm `--dock-border` lines. `formatPrice` writes prices in thousands, the Sprint sets its own `/sprint` period, and Quarterly billing rolls the retainers down.

Atelier North · Work with us

A senior design team, on call

Three ways to work together. Every plan gets the same people; you choose how much of their week.

Feature
Sprint
$8k /sprint

Two weeks, fixed scope

A launch page, deck or rebrand in two weeks.

  • One request at a time
  • Delivered in two weeks
  • Two rounds of revisions
  • Source files included
Most chosen
Retainer
$12k /mo

Pause or cancel any month

Senior designers shipping weekly, no hiring.

  • Two active requests
  • 48-hour turnaround
  • A dedicated lead designer
  • Shared Slack channel
Partner
$20k /mo

Three-month minimum

Brand, product and web, run like your in-house team.

  • Three active requests
  • Same-day turnaround on small asks
  • Design lead and design engineer
  • Quarterly brand strategy
Capacity
Active requestsHow many briefs we work on at once. Queue as many as you like; the next starts when one ships.
1
2
3
Turnaround
2 weeks
48 hours
Same day
Revisions
2 rounds
Unlimited
Unlimited
Pause any time
Not included
Included
Included
Team
Dedicated designer
Not included
Included
Included
Design engineer
Not included
Not included
Included
Creative direction
Not included
Monthly
Weekly
Slack channel
Not included
Included
Included
What we make
Brand identity
Refresh
Included
Included
Websites and landing pages
Included
Included
Included
Framer or Webflow buildWe hand over a live site your team can edit, not just the design files.
Not included
Included
Included
Motion and video
Not included
Add-on
Included
Product UI
Not included
Included
Included
Terms
Minimum term
One sprint
One month
Three months
You own everything
Included
Included
Included

Let's talk about your next launch

Twenty minutes with a founder, no slides. We'll tell you honestly if we're the right fit.

Book a call

Why Switch

Us against the two tools teams switch from, with logo cards instead of prices: each mark shrinks in beside its name as the cards dock. On a phone, the plan pills pick whose column the table shows, or swipe the table sideways.

Compare

Why teams switch to Northlight

The two tools teams most often move from, side by side. Hover a column to follow it, or click a name once it docks to see its card again.

Feature
Free migration
Northlight

Reviews that read the whole repo, not just the diff.

  • First review in under a minute
  • Learns your team's conventions
  • Fixes as one-click suggestions
  • Cloud or self-hosted
Competitor A

Rule-based linting with an AI summary on top.

  • First review in 5–10 minutes
  • Fixed rule sets
  • Comments only, no fixes
  • Cloud only
Competitor B

A general chat assistant wired into pull requests.

  • First review in 2–4 minutes
  • Prompted per repository
  • Suggestions in a chat thread
  • Cloud only
Speed
Time to first review
Under 1 min
5–10 min
2–4 min
Large pull requests
1,000+ files
Up to 200
Up to 300
Re-reviews only what changed
Included
Not included
Included
Review quality
Reads the whole repositoryFollows imports, call sites and tests outside the diff before it comments.
Included
Not included
Open files
Learns team conventions
Included
Not included
By prompt
One-click fixes
Included
Not included
Included
False-positive rateComments dismissed without a change, across 40 open-source repos we reviewed in September 2026.
3%
18%
9%
Writes missing tests
Included
Not included
Not included
Workflow
GitHub, GitLab, Bitbucket
Included
GitHub only
GitHub, GitLab
Slack and Linear
Included
Slack
Not included
Custom review rules
Included
Included
Not included
CLI and pre-commit hook
Included
Not included
Not included
Security
Self-hosting
Included
Not included
Not included
Zero data retention
Included
Not included
Enterprise
SOC 2 Type II
Included
Included
Included
SSO and SCIM
Included
Enterprise
Included
Never trains on your code
Included
Opt-out
Included
Price
Per seat, per month
$19
$29
$24
Free for open source
Included
Not included
Included
Migration help
Free, hands-on
Not included
Not included

Bring your rules with you

We import your existing review rules and ignore lists, so day one feels like day one hundred.

Start the migration

Props

plansRequired

TypePricingDockPlan[]

One card and one table column per plan, left to right. Three or four fit best; the cards sit over their columns from a 48rem-wide container, and narrower ones get the phone layout.

groupsRequired

TypePricingDockGroup[]

The comparison table: { label, rows } per section. Each label sticks under the docked bar until the next one pushes it out.

billing

TypePricingDockBilling[]

Options for the billing toggle, as { id, label, note?, period? }, e.g. { id: "yearly", label: "Yearly", note: "−20%" }. The toggle sits in the top-left cell and shrinks into the docked bar, where it still works. Leave it out for one price per plan.

defaultBilling

Typestring

The billing option selected at first. Defaults to the first one.

onBillingChange

Type(id: string) => void

Called with the option's id when the visitor switches billing.

formatPrice

Type(amount: number, plan: PricingDockPlan, billing?: string) => stringDefaultwhole US dollars

Turns a number price into text, e.g. (n) => "€" + n or (n) => "$" + n + "k". Digits roll on their own wheels when billing changes.

period

TypestringDefault"/mo"

Shown after every number price. A billing option's period, then a plan's, override it. Text prices like "Custom" show none.

intro

TypeReact.ReactNode

A line in the top-left cell, under the toggle. It slides away with the page as the cards dock.

compareLabel

Typestring | nullDefault"Compare all features"

Label of the link at the bottom of the top-left cell, which scrolls to exactly where the cards have docked. null hides it.

featureLabel

TypestringDefault"Feature"

Screen-reader header of the feature column.

top

TypenumberDefault0

Where the docked bar pins, in px from the top of the scrollport: your fixed nav's height, or 0. The cards' top edges slide under whatever covers the space above it.

containerRef

TypeReact.RefObject<HTMLElement | null>

The scroll container, when the table scrolls inside an overflow-y-auto box. Leave it out for the window.

radius

TypenumberDefault20

Corner radius of the cards before they dock, in px. The corners square off as the cards close into the bar, and a peeked card gets them back. 0 keeps them square throughout.

gap

TypenumberDefault12

Space between the cards before they dock, in px. It closes as they dock, so the bar has none.

className

Typestring

Classes for the table. Theme it with CSS variables: --dock-accent (featured card, badge and check marks), --dock-accent-foreground (text on it), --dock-surface (cards and the docked bar), --dock-page (the page behind, used by the group labels) and --dock-border (card outlines, the bar's dividers and the table's lines). They default to your foreground and background colors, e.g. [--dock-border:var(--color-stone-200)].

plan.idRequired

Typestring

PricingDockPlan: keys this plan's column in each row's values.

plan.nameRequired

Typestring

PricingDockPlan: the plan's name, also its column header for screen readers.

plan.price

Typenumber | string | Record<string, number | string>

PricingDockPlan: a number goes through formatPrice; text ("Custom") shows as is. One per billing option: { monthly: 24, yearly: 19 }.

plan.period

Typestring

PricingDockPlan: overrides the period after this plan's price, e.g. "/seat/mo".

plan.caption

TypeReact.ReactNode | Record<string, React.ReactNode>

PricingDockPlan: small print under the price, one for all billing options or one per option.

plan.logo

TypeReact.ReactNode

PricingDockPlan: shown instead of a price, e.g. a product's mark on a comparison page. It shrinks in before the name when docked.

plan.pitch

TypeReact.ReactNode

PricingDockPlan: one line under the price. Two lines at most.

plan.highlights

TypeReact.ReactNode[]

PricingDockPlan: three to five points under the button. They slide under it and fade as the card docks.

plan.featured

Typeboolean

PricingDockPlan: tints the card and runs the tint down its whole column.

plan.badge

TypeReact.ReactNode

PricingDockPlan: a label over the name, e.g. "Most popular". Flattens into a 2px accent line along the top of the docked cell.

plan.cta

Type{ label: string; href?: string; onClick?: () => void }

PricingDockPlan: the plan's button, a link with href or a button with onClick. It is the same element docked and undocked, so focus and tab order never jump.

row.featureRequired

TypeReact.ReactNode

PricingDockRow: the feature's name, the row's header.

row.hint

TypeReact.ReactNode

PricingDockRow: explanation shown from a small info icon beside the feature.

row.valuesRequired

TypeRecord<string, boolean | React.ReactNode>

PricingDockRow: one value per plan id. true draws a check mark, false (or a missing value) a dash; text and elements render as they are.