Production URL: captable.puter.com. The canonical URL, social metadata, structured data, and sitemap use this HTTPS origin. The production build copies robots.txt from public/ and generates sitemap.xml from the public page registry.
Manage your company's ownership, equity, cap table, options, and fundraising in one place. A web app built on Puter: your data lives in your own Puter cloud, not on anyone's server.
- Permanent history: actor-attributed business transactions with before/after records, recording and effective dates, filters, and complete JSON/CSV exports. Imports, wipes, undo, and restores preserve earlier events. Durable intents recover interrupted writes; the initial baseline explicitly marks earlier history as incomplete. See audit history and recovery.
- Cap table: outstanding and fully diluted views, grouped by share class, with an include-pool toggle and CSV export. An as-of date picker (plus one-tap chips for each financing date) shows ownership as it stood on any past day.
- Securities: share certificates (optionally reverse-vesting, for founder restricted stock, with the 83(b) filing tracked), option grants (ISO or NSO, with the $100K ISO limit checked, and early exercise where the plan allows it), RSU awards, warrants, pre- and post-money SAFEs, and convertible notes with simple-interest accrual. Vesting schedules run monthly, quarterly, or annually with a cliff, or as custom dated tranches, with single- or double-trigger acceleration. Certificate labels number themselves (CS-1, SA-2, OPT-3), and any record can carry attachments (the signed agreement, the 409A report) stored in your own Puter cloud.
- Lifecycle: record an exercise (with its certificate, or issue the certificate later), settle vested RSUs into shares, cancel unvested options back to the pool, transfer or repurchase shares (the original certificate closes and successors are issued in one commit), and mark a holder as departed - unvested options return to the pool and a post-termination exercise window starts on the rest. Every write is checked against the records it touches, so an exercise cannot predate its grant or outrun its vesting, a window cannot close before an exercise already inside it, and a transferred certificate keeps the size and date its successors were drawn from.
- Stakeholders: founders, investors, employees, advisors, and entities, with per-holder ownership. Open one for a full detail view - ownership on both bases, every security with vesting and terms, their history - which doubles as a printable equity statement (print or save as PDF) and exports to CSV.
- Share classes: common and preferred with authorized counts, issue prices, liquidation preferences, participation, and anti-dilution protection. Plus stock splits that restate every per-share number from their effective date while earlier dates keep reading in their own units.
- Equity incentive plans: one reserve per plan, each with an adoption date, the award kinds it is written for, an optional expiration, and a dated history of every resize, round top-up and transfer, so earlier snapshots keep the reserve each plan had. Awards name the plan they draw from, or sit outside every plan. Per-plan recycling rules say where a cancellation, expiration, exercise, settlement, repurchase or transfer sends its shares: back to the plan, out of the reserve for good, or poured over into a successor plan. Balances explain themselves as an opening figure and dated movements, per plan and in aggregate, and plans can be retired without touching their grants. See equity incentive plans.
- Needs attention: the records whose date has passed while the cap table still counts them as they were - expired grants and warrants still in the diluted base, notes past maturity, 83(b) windows that closed unfiled, a 409A gone stale, awards still vesting after their holder left - each with the action that settles it.
- Hiring plan: list the roles you expect to hire, how many, and how big each grant is (a share count or a percentage). The plan reserves are drawn down month by month against them, the month they run dry is named, and the shortfall sets the round model's pool top-up target instead of being guessed at. Nothing planned ever reaches the cap table.
- Round modeling: enter pre-money, new investment, and a pool top-up target. SAFEs and notes convert at the better of cap price and discount price, protected preferred classes take their anti-dilution adjustment, the pool tops up pre-money, and a dilution view shows before and after for every holder. Scenarios can be saved.
- Exit scenarios: enter a sale price and see the liquidation waterfall - convertible notes repaid off the top, then senior preferences (with the money back a SAFE elects ranking where its form puts it: beside the preferred for a post-money SAFE, ahead of every share for a pre-money one), each SAFE taking whichever of its money back or converting at the exit price pays more and each preferred class electing the same way, and options, RSUs and warrants in the money net of strike - as a per-holder table and chart, plus the breakeven prices where the waterfall changes shape. Scenarios can be saved.
- Closing a round: apply a modeled round to the cap table. Pick or create the preferred class, split the money between investors, pick the plan the pool top-up goes into, review every record first, and commit it all at once - certificates issued, convertibles marked converted and linked to the shares they became, and the plan's reserve resized.
- 409A history: record the fair market value your valuation provider gave you. Option strikes pre-fill from it and warn when set below it, and the dashboard flags a 409A that has gone stale or been overtaken by a priced round. CapTable records a 409A; it never computes one.
- Reports: what an auditor, a tax preparer, or counsel asks for at year end. Stock-based compensation under ASC 718 (grant-date fair value by Black-Scholes for options and the 409A price for RSUs, attributed straight-line or graded over vesting, forfeitures reversed as they occur, with the unrecognized cost and its weighted-average remaining period) for any fiscal year or quarter. Rule 701: the trailing twelve months of compensatory sales against the exemption's three ceilings and its $10 million disclosure threshold, on any date. Form 3921: one row per ISO exercise in a calendar year, in the shape of the form's boxes, with the January deadline on the dashboard calendar. Each exports to CSV; the assumptions (volatility, risk-free rate, expected term, attribution, fiscal year end, total assets) are recorded on the company.
- Dashboard: KPI tiles (fully diluted, outstanding, capital raised, implied valuation, current FMV), an ownership chart by class or by holder, a getting-started checklist, a "coming up" calendar of cliffs, full-vest dates, 83(b) deadlines, note maturities, and expirations, and an activity feed.
- Import, export, and restore: bring an existing cap table in from CSV (stakeholders, then securities, with column matching, an optional plan column, and a dry-run preview), export a company as a JSON backup and import it back here or into a new company, and roll back from the restore points taken automatically before a round close, a split, an import, or a wipe.
- Several companies under one account, switched from the sidebar, and a global search (Cmd/Ctrl-K or /) over holders, securities, classes, saved scenarios, and pages.
- Onboarding: guided company setup, or one tap to explore with sample data (wipeable at any time).
- Dark, light, and system themes (system is the default), fully responsive (desktop sidebar, mobile tab bar), keyboard- and screen-reader-friendly.
- Vanilla JavaScript (no frameworks), Vite for dev/build, Vitest for tests.
- Puter.js for auth and storage (KV). No other backend.
- Lucide icons.
npm install
npm run dev # http://localhost:5174
npm test # run the test suite
npm run build # production build to dist/The real app entry (index.html) loads the Puter SDK and requires signing in. For local development without a Puter account, open /mock.html, which stubs the SDK with an in-memory mock:
/mock.html- signed in, empty dataset (onboarding shows)/mock.html?signedout=1- start on the intro page/mock.html?env=app- simulate running inside Puter (no sign-out offered)
/docs/contains 44 workflow and reference articles covering the current app, including reports, lifecycle actions, forecasts, negotiated financing terms, refusals, recovery, and calculation limits./guides/contains 35 guides with worked examples covering ownership, employee equity, financing, exit planning, reporting concepts, and diligence.site/content.jsregisters the original articles and collection ordering.site/product-docs.jsandsite/equity-guides.jshold the extended library;site/workflow-docs.jsandsite/worked-guides.jscover detailed operations, reference fields, and worked examples;site/financing-docs.js,site/financing-guides.jsandsite/equity-reporting-guides.jscover dividends, pro rata and MFN terms, exit waterfalls, and valuation and expense concepts;site/content-helpers.jsprovides the section and table markup helpers. Articles have permanent slugs and section IDs.- Content coverage maps current user-facing features to instructions, concepts, and limitations. Update it alongside feature changes.
site/render.jsbuilds the library, article layouts, metadata, breadcrumbs, and sitemap. Header and footer links come from the landing page so navigation stays consistent.site/plugin.jsserves these routes during development and writes complete HTML documents todist/docs/anddist/guides/during a production build. The public pages have their own small stylesheet and script and do not load the Puter SDK or app data.site/analytics.htmlholds the Plausible snippet shared by the homepage and generated content pages.site/styles.cssandsite/client.jsprovide the reading layout, library search, and accessible navigation. Articles and links remain available without JavaScript.
Deploy the whole dist/ directory, including its nested index.html files. Serve directory URLs with their index documents, and use 404.html as a custom error document with HTTP status 404 if the host supports it. Do not rewrite missing documentation URLs to the app homepage. Every public page uses a self-referencing canonical on https://captable.puter.com/.
Documentation launch links currently return to /. The homepage keeps its existing Puter sign-in behavior; launches have not been redirected to the Puter app URL.
Collections are read by key (never a kv.list() scan): settings, company (with its equity plans, valuations and splits), share classes, stakeholders, securities, round and exit scenarios, the hiring plan, a capped activity log, and the restore points. Every collection is namespaced by company, with a registry naming the account's companies. Writes are optimistic with rollback on failure and run one at a time within a session. A stale session's save is refused, including when two tabs or devices save simultaneously.
src/lib/kv.js implements conditional publication using Puter's atomic list append. A writer uploads an immutable revision, then appends its pointer to the previous revision's successor list; only the first pointer wins. The collection key is a shortcut, and readers follow successor links, so a delayed shortcut update cannot replace a newer save. Superseded payloads are removed; small successor links and deletion tombstones remain to protect against delayed writers. This adds storage requests per save, but needs no expiring lock or active browser to recover a published write; a session remembers the revision it last saw at each key, so the usual read is one round trip. Existing plain JSON values are read directly and upgraded on their first write. The SDK must support kv.add; there is no unsafe fallback. Reload older open sessions after updating the app.
A commit spanning several collections still uses separate conditional publications. If one fails, memory is rolled back and its stored copies rewritten to match; a rewrite the connection refuses too is kept as owed, shown in the shell, and retried until it lands. Activity collisions merge their entries, and theme/settings choices retain their last-writer-wins behavior. A record whose holder is missing when a company loads is kept under a stand-in "Unknown holder" rather than dropped. A value over the platform's size limit is written across numbered part keys. See src/lib/store.js.
Cap table math (vesting, ownership, conversion, round modeling) is pure and lives in src/lib/captable.js; the test suite in tests/ encodes its conventions.
-
"Outstanding" counts issued share certificates only; "fully diluted" adds option grants, unsettled RSUs, warrants, and (optionally) the unallocated reserve of every open equity plan. Plan awards - option grants and RSUs - draw down the plan they name; an award outside every plan draws none, and warrants never do.
-
Vesting is reporting, not ownership: unvested shares are still outstanding shares and unvested options still occupy the diluted base.
-
Cancelled options leave both the diluted base and the pool draw. Exercised options stay drawn from the pool, and move out of the grant into the certificate only once one is actually issued for them. Both are the defaults of a plan's recycling rules; a plan may retire cancelled shares or pour them over into a successor plan instead.
-
SAFEs and notes are excluded from both bases until a priced round converts them.
-
Convertibles convert at
min(cap / cap basis, round price x (1 - discount), round price). The cap basis is the pre-round fully diluted count for notes and pre-money SAFEs, and the company capitalization (which includes every converting instrument's own shares) for post-money SAFEs, so a post-money cap fixes the holder's percentage rather than a price. -
At an exit the same conversion applies with the exit price standing in for a round price, except that the cap basis is the liquidity capitalization: every share, award and warrant on the table (plus every converting instrument's own shares for a post-money SAFE) with the unissued option pool left out, as both SAFE forms define it. A note is debt: principal plus simple interest, actual days over 365, to the closing date, repaid ahead of every share. A SAFE elects its money back or converting, whichever pays more, and its money back ranks where its form puts it. A post-money SAFE's ranks on par with the preferred stock as a whole: when the proceeds cannot cover every preference and every such cash-out, the SAFEs and the preferred share them pro rata by claim, and the preferred then divide their share by seniority. A pre-money SAFE's is due immediately prior to the event, so it is paid after the notes and ahead of every share, pro rata among pre-money SAFEs when short. Both rank ahead of common.
-
Round price solves
PPS = pre-money / (pre-round FD + conversion shares + anti-dilution shares + pool increase)by fixed-point iteration; the pool top-up is pre-money. -
Anti-dilution is per preferred class: none, broad-based weighted average (
CP2 = CP1 x (A + B) / (A + C)over the fully diluted count), or full ratchet. It triggers below the conversion price in force, and the shares it mints carry no invested capital - so the class's liquidation preference stays put while its as-converted count rises. -
Negotiated financing terms are structured, dated inputs, never read out of agreement prose, and a clause the app cannot calculate is refused rather than approximated (see
docs/financing-conventions.md). A pro-rata right names its ownership basis - a fixed percentage, the holder's pre-round fully diluted share (reserves included), the YC post-money side letter (the SAFE's conversion shares over the company capitalization, in its conversion round) or the original YC right (the financing after conversion) - and the elected check is part of the round, inside a fixed total or on top of it, solved together with the price, conversions, anti-dilution and pool top-up. An MFN election copies a later instrument's cap, discount or SAFE convention onto the original as a dated record beside its own terms; a scenario applies it only when it selects it. A participation cap is a multiple of invested capital, per holder, with the initial preference and accrued dividends counted or not as the charter says; once it binds, a class converts if that pays more, and every class's election is settled against the others'. Cumulative dividends accrue on the original investment at actual days over 365, simple or compound, segmented at every amendment and cash event so later amendments never reprice earlier accrual; non-cumulative dividends accrue only what is declared. A modeled close is held to its model: same table (by fingerprint), same date, same checks, conversions, adjustments and top-up, and a financing ID closes once. -
Stock-based compensation values an option with Black-Scholes at the 409A in force on the grant date (the strike stands in when there is none, and the row says so), no dividends, and an expected term by the simplified method (the midpoint of each vesting date and the contractual term, ten years when no expiration is recorded) unless one is set. An RSU is worth the 409A price. Cost is attributed from the grant date, straight-line over the award (floored at the value already vested) or graded by tranche; a cancellation forfeits every tranche still to vest and reverses its cost on that day, while vested options that lapse keep theirs. Modifications, performance conditions, and tax effects are not modeled.
-
Rule 701 counts options at strike on the grant date, RSUs at the 409A on the grant date, and stock sold to employees and advisors at its price; founder stock, investor rounds, exercises, conversions, and transfers are not sales under the rule. The outstanding class for the 15% test is measured at the last fiscal year end and includes warrants but not Rule 701 options or unpriced convertibles. Thresholds are in US dollars and are not converted.
-
Form 3921 is built from ISO exercise certificates: box 3 is the certificate's price, box 4 the 409A in force on its date, box 5 its issued size. An exercise recorded on the grant without a certificate has no date and is listed as such.
CapTable is a tool, not legal advice.
This repository, including all its contents, sub-projects, modules, and components, is licensed under MIT unless explicitly stated otherwise. Third-party libraries included in this repository may be subject to their own licenses.