Engineer-first docs that lives
where we code.


d oc u m e n t a t o n
c o d e
s e n d
w h i t e b o a r d
v a r i a b l e s
c o l l a b o r a t e
p u b l i s h
s t i c k y
We just started, but already we are in trials with teams that build world-class software
#
Core features

Publish Document
Publish engineer docs that don't go stale, directly from your editor.
Stickies
Pin quick notes to files without breaking flow. todos, lists, execute common workflows, spin up terminals.


Collaborate live
Collaborate in real time with ephemeral docs, designed to be deleted or promoted.
90
Code references
Link any code block or line to the doc that explains it. Never worry about it going stale.

//
Use cases

import { NextApiRequest, NextApiResponse } from 'next' import { supabase } from '@/lib/supabase' export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'GET') { // AI suggestion: Add pagination and filtering const { data, error } = await supabase .from('products') .select('*') .order('created_at', { ascending: false }) if (error) return res.status(500).json({ error }) return res.status(200).json(data) } }
Debugging and refactoring
Build frontend and backend seamlessly. Exact understands your entire stack—from React components to database queries.

export function validateEmail(email: string): boolean { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ return regex.test(email) } export function validatePassword(password: string): boolean { // ⚠️ Error: 'lenght' is not a property of string if (password.lenght < 8) { // ← Ligne 8 avec erreur return false } return /[A-Z]/.test(password) && /[0-9]/.test(password) }
Debugging and refactoring
Find bugs instantly with precise error detection. Refactor with AI that understands dependencies across your entire codebase.

import Stripe from 'stripe' const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16' }) // AI suggestion: Add webhook handler export async function createPaymentIntent(amount: number) { try { const paymentIntent = await stripe.paymentIntents.create({ amount: amount * 100, // Convert to cents currency: 'usd', automatic_payment_methods: { enabled: true } }) return { clientSecret: paymentIntent.client_secret } } catch (error) { // Ghost text: Handle Stripe errors properly throw new Error(`Payment failed: ${error.message}`) } }
API integration
Connect to any API in minutes. Exact generates type-safe requests, handles authentication, and suggests error handling.

import { validateEmail, hashPassword } from '../utils/auth' describe('Authentication', () => { describe('validateEmail', () => { it('should accept valid email addresses', () => { expect(validateEmail('user@example.com')).toBe(true) expect(validateEmail('test+tag@domain.co.uk')).toBe(true) }) it('should reject invalid email addresses', () => { expect(validateEmail('invalid')).toBe(false) expect(validateEmail('@example.com')).toBe(false) }) }) // AI suggestion: Add test for password hashing describe('hashPassword', () => { // Ghost text suggestions... }) })
Testing & CI/CD
Write tests faster with AI-generated test cases. Set up CI/CD pipelines with precise configuration. Ship with confidence, every time.

import { NextApiRequest, NextApiResponse } from 'next' import { supabase } from '@/lib/supabase' export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'GET') { // AI suggestion: Add pagination and filtering const { data, error } = await supabase .from('products') .select('*') .order('created_at', { ascending: false }) if (error) return res.status(500).json({ error }) return res.status(200).json(data) } }
Debugging and refactoring
Build frontend and backend seamlessly. Exact understands your entire stack—from React components to database queries.

export function validateEmail(email: string): boolean { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ return regex.test(email) } export function validatePassword(password: string): boolean { // ⚠️ Error: 'lenght' is not a property of string if (password.lenght < 8) { // ← Ligne 8 avec erreur return false } return /[A-Z]/.test(password) && /[0-9]/.test(password) }
Debugging and refactoring
Find bugs instantly with precise error detection. Refactor with AI that understands dependencies across your entire codebase.

import Stripe from 'stripe' const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16' }) // AI suggestion: Add webhook handler export async function createPaymentIntent(amount: number) { try { const paymentIntent = await stripe.paymentIntents.create({ amount: amount * 100, // Convert to cents currency: 'usd', automatic_payment_methods: { enabled: true } }) return { clientSecret: paymentIntent.client_secret } } catch (error) { // Ghost text: Handle Stripe errors properly throw new Error(`Payment failed: ${error.message}`) } }
API integration
Connect to any API in minutes. Exact generates type-safe requests, handles authentication, and suggests error handling.

import { validateEmail, hashPassword } from '../utils/auth' describe('Authentication', () => { describe('validateEmail', () => { it('should accept valid email addresses', () => { expect(validateEmail('user@example.com')).toBe(true) expect(validateEmail('test+tag@domain.co.uk')).toBe(true) }) it('should reject invalid email addresses', () => { expect(validateEmail('invalid')).toBe(false) expect(validateEmail('@example.com')).toBe(false) }) }) // AI suggestion: Add test for password hashing describe('hashPassword', () => { // Ghost text suggestions... }) })
Testing & CI/CD
Write tests faster with AI-generated test cases. Set up CI/CD pipelines with precise configuration. Ship with confidence, every time.

import { NextApiRequest, NextApiResponse } from 'next' import { supabase } from '@/lib/supabase' export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'GET') { // AI suggestion: Add pagination and filtering const { data, error } = await supabase .from('products') .select('*') .order('created_at', { ascending: false }) if (error) return res.status(500).json({ error }) return res.status(200).json(data) } }
Debugging and refactoring
Build frontend and backend seamlessly. Exact understands your entire stack—from React components to database queries.

export function validateEmail(email: string): boolean { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ return regex.test(email) } export function validatePassword(password: string): boolean { // ⚠️ Error: 'lenght' is not a property of string if (password.lenght < 8) { // ← Ligne 8 avec erreur return false } return /[A-Z]/.test(password) && /[0-9]/.test(password) }
Debugging and refactoring
Find bugs instantly with precise error detection. Refactor with AI that understands dependencies across your entire codebase.

import Stripe from 'stripe' const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16' }) // AI suggestion: Add webhook handler export async function createPaymentIntent(amount: number) { try { const paymentIntent = await stripe.paymentIntents.create({ amount: amount * 100, // Convert to cents currency: 'usd', automatic_payment_methods: { enabled: true } }) return { clientSecret: paymentIntent.client_secret } } catch (error) { // Ghost text: Handle Stripe errors properly throw new Error(`Payment failed: ${error.message}`) } }
API integration
Connect to any API in minutes. Exact generates type-safe requests, handles authentication, and suggests error handling.

import { validateEmail, hashPassword } from '../utils/auth' describe('Authentication', () => { describe('validateEmail', () => { it('should accept valid email addresses', () => { expect(validateEmail('user@example.com')).toBe(true) expect(validateEmail('test+tag@domain.co.uk')).toBe(true) }) it('should reject invalid email addresses', () => { expect(validateEmail('invalid')).toBe(false) expect(validateEmail('@example.com')).toBe(false) }) }) // AI suggestion: Add test for password hashing describe('hashPassword', () => { // Ghost text suggestions... }) })
Testing & CI/CD
Write tests faster with AI-generated test cases. Set up CI/CD pipelines with precise configuration. Ship with confidence, every time.

import { NextApiRequest, NextApiResponse } from 'next' import { supabase } from '@/lib/supabase' export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'GET') { // AI suggestion: Add pagination and filtering const { data, error } = await supabase .from('products') .select('*') .order('created_at', { ascending: false }) if (error) return res.status(500).json({ error }) return res.status(200).json(data) } }
Debugging and refactoring
Build frontend and backend seamlessly. Exact understands your entire stack—from React components to database queries.

export function validateEmail(email: string): boolean { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ return regex.test(email) } export function validatePassword(password: string): boolean { // ⚠️ Error: 'lenght' is not a property of string if (password.lenght < 8) { // ← Ligne 8 avec erreur return false } return /[A-Z]/.test(password) && /[0-9]/.test(password) }
Debugging and refactoring
Find bugs instantly with precise error detection. Refactor with AI that understands dependencies across your entire codebase.

import Stripe from 'stripe' const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16' }) // AI suggestion: Add webhook handler export async function createPaymentIntent(amount: number) { try { const paymentIntent = await stripe.paymentIntents.create({ amount: amount * 100, // Convert to cents currency: 'usd', automatic_payment_methods: { enabled: true } }) return { clientSecret: paymentIntent.client_secret } } catch (error) { // Ghost text: Handle Stripe errors properly throw new Error(`Payment failed: ${error.message}`) } }
API integration
Connect to any API in minutes. Exact generates type-safe requests, handles authentication, and suggests error handling.

import { validateEmail, hashPassword } from '../utils/auth' describe('Authentication', () => { describe('validateEmail', () => { it('should accept valid email addresses', () => { expect(validateEmail('user@example.com')).toBe(true) expect(validateEmail('test+tag@domain.co.uk')).toBe(true) }) it('should reject invalid email addresses', () => { expect(validateEmail('invalid')).toBe(false) expect(validateEmail('@example.com')).toBe(false) }) }) // AI suggestion: Add test for password hashing describe('hashPassword', () => { // Ghost text suggestions... }) })
Testing & CI/CD
Write tests faster with AI-generated test cases. Set up CI/CD pipelines with precise configuration. Ship with confidence, every time.
Whiteboarding
Env variables
CLI.VE
ADR


Whiteboarding
Whiteboard alongside the docs. Meridian's canvas treats every sketch as a first-class artifact. Pin it to the spec it explains, link a shape to the function it represents, and the diagram stays accurate as the underlying code evolves.
--
Testimonials
I write a runbook, hit cmd+enter, and the command runs in the terminal beside it. It changed what 'documentation' even means for our oncall rotation.
Anderson
Full-stack engineer, Stripe
Code references alone justified the rollout. A new hire clicks a symbol in an onboarding doc and they're inside the function.
Wesley
Senior Engineer, Okta
The 'docs are stale' excuse died the day we switched - every PR now updates the spec it touches, because the spec sits in the same repo.
Anne
Full-stack engineer, Stripe
I've never seen staff engineers adopt a tool this fast. They refused Confluence, tolerated Notion, and opened Meridian on their own.
Eamon
Senior Engineer, Google
We moved 250 pages off Notion using Meridians importer tool in just minutes.
Ben
CTO, Flagship
Stickies is my favourite. In the AI age, I run scripts and terminal workflows many times a day and now everything is easier.
Brandon
CTO, Crowded
I write a runbook, hit cmd+enter, and the command runs in the terminal beside it. It changed what 'documentation' even means for our oncall rotation.
Anderson
Full-stack engineer, Stripe
The 'docs are stale' excuse died the day we switched - every PR now updates the spec it touches, because the spec sits in the same repo.
Anne
Full-stack engineer, Stripe
We moved 250 pages off Notion using Meridians importer tool in just minutes.
Ben
CTO, Flagship
Code references alone justified the rollout. A new hire clicks a symbol in an onboarding doc and they're inside the function.
Wesley
Senior Engineer, Okta
I've never seen staff engineers adopt a tool this fast. They refused Confluence, tolerated Notion, and opened Meridian on their own.
Eamon
Senior Engineer, Google
Stickies is my favourite. In the AI age, I run scripts and terminal workflows many times a day and now everything is easier.
Brandon
CTO, Crowded
I write a runbook, hit cmd+enter, and the command runs in the terminal beside it. It changed what 'documentation' even means for our oncall rotation.
Anderson
Full-stack engineer, Stripe
We moved 250 pages off Notion using Meridians importer tool in just minutes.
Ben
CTO, Flagship
I've never seen staff engineers adopt a tool this fast. They refused Confluence, tolerated Notion, and opened Meridian on their own.
Eamon
Senior Engineer, Google
The 'docs are stale' excuse died the day we switched - every PR now updates the spec it touches, because the spec sits in the same repo.
Anne
Full-stack engineer, Stripe
Code references alone justified the rollout. A new hire clicks a symbol in an onboarding doc and they're inside the function.
Wesley
Senior Engineer, Okta
Stickies is my favourite. In the AI age, I run scripts and terminal workflows many times a day and now everything is easier.
Brandon
CTO, Crowded
#
Pricing
First release [sold out]
$9
/month
For the entire team
10/10 sold
Expired 1st May
Expires 1st June
Final Release
DTB
For the entire team
Not Released
Starts 1st June
First release [sold out]
$9
/month
For the entire team
10/10 sold
Expired 1st May
Expires 1st June
Final Release
DTB
For the entire team
Not Released
Starts 1st June
First release [sold out]
$9
/month
For the entire team
10/10 sold
Expired 1st May
Expires 1st June
Final Release
DTB
For the entire team
Not Released
Starts 1st June
//
FAQ
Questions? We've got answers.
What do you mean we own our own docs?
Can my team see my stickies?
How do collaborative docs work?
Which IDE's can I use Meridian in?
How does Meridian compare to Notion or Confluence?
What if I open Meridian in another repository or workspace?
What is first, second and third release?
What happens if I'm offline?
Try Meridian
Install in seconds.
Start immediately.



