{"current":"0.4.2","releases":[{"version":"0.4.2","bump":"patch","isCurrent":true,"releasedAt":"2026-08-12 01:34 UTC","releasedAtIso":"2026-08-12T01:34:49.000Z","entries":[]},{"version":"0.4.1","bump":"patch","isCurrent":false,"releasedAt":"2026-08-12 01:32 UTC","releasedAtIso":"2026-08-12T01:32:32.000Z","entries":[{"kind":"patch","label":"Fix","badgeClass":"","scope":"css","commit":"07cc8e65","summary":"use the .gate-confidential token class, not an inline hex"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"investor","commit":"73a8326b","summary":"stop the room footer floating above the feedback bar"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"css","commit":"e6ca006b","summary":"route hardcoded hex through tokens so dark skins stay legible"}]},{"version":"0.4.0","bump":"minor","isCurrent":false,"releasedAt":"2026-08-09 14:57 UTC","releasedAtIso":"2026-08-09T14:57:56.000Z","entries":[{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"app","commit":"b6d409f5","summary":"give blank screens a next action to link to"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"onboarding","commit":"71b98d7f","summary":"derive founder and co-founder checklist progress"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"users","commit":"b08822ee","summary":"select invited_by_user_id, the durable founder signal"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"db","commit":"e621a683","summary":"add a composite (startup_id, started_at) index on visits"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"dashboard","commit":"b8e778cf","summary":"name the document behind \"median document time\""},{"kind":"patch","label":"Fix","badgeClass":"","scope":"views","commit":"833ae458","summary":"stop counting deleted or private documents as shared"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"onboarding","commit":"92feb659","summary":"re-derive \"share the link\" from currently shareable views only"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"app","commit":"d1ae01fd","summary":"wire the founder dashboard to real tracking data"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"tracking","commit":"f6f14ae4","summary":"exclude bot visits from the document-open trail, add dashboard aggregates"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"seed","commit":"5c329444","summary":"tag the northwind fixture's co-founder as invited"}]},{"version":"0.3.2","bump":"patch","isCurrent":false,"releasedAt":"2026-08-08 21:38 UTC","releasedAtIso":"2026-08-08T21:38:56.000Z","entries":[]},{"version":"0.3.1","bump":"patch","isCurrent":false,"releasedAt":"2026-08-08 21:32 UTC","releasedAtIso":"2026-08-08T21:32:46.000Z","entries":[]},{"version":"0.3.0","bump":"minor","isCurrent":false,"releasedAt":"2026-08-08 21:24 UTC","releasedAtIso":"2026-08-08T21:24:14.000Z","entries":[{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"deploy","commit":"a88c5045","summary":"build a real SQL migration runner"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"deploy","commit":"e16b074e","summary":"add restore-check.sh to prove a backup actually restores"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"deploy","commit":"726b3fb9","summary":"schedule the nightly backup with a systemd timer and failure alerting"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"deploy","commit":"dbfea01d","summary":"rotate rp_backup alongside the app and DDL accounts"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"config","commit":"ed27fb8f","summary":"read Mailgun credentials, and refuse to boot with a real one off live"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"mail","commit":"dc51e998","summary":"add a Mailgun provider alongside Postmark"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"geo","commit":"d19c3058","summary":"name the city an investor opened your deck from, without a local database"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"tracking","commit":"ccafe218","summary":"resolve visitor geo from Cloudflare's headers instead of MaxMind"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"07d6e5ba","summary":"import a spreadsheet with a column mapper and a diff before writing"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"982763b6","summary":"compute round scenarios and render the saved default in investor rooms"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"money","commit":"9a2a58a6","summary":"add a shared minor-units-to-form-field formatter"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"a42fd1fc","summary":"tell founders when a confidential holder can't be hidden safely"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"69f7c128","summary":"see which version of the cap table an investor actually read"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"21ddfcef","summary":"let a founder turn cap table sharing on per view, and choose the detail level"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"8baeece7","summary":"show investors only the cap table numbers their room is allowed to see"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"5bc006c2","summary":"let a founder create the unallocated option pool"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"captable","commit":"9201fc25","summary":"add the founder-side cap table register"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"rooms","commit":"046bd179","summary":"apply the founder's brand colour on every investor surface"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"settings","commit":"6a0f0465","summary":"apply a room template, refused server-side when locked"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"room","commit":"b43f5c3e","summary":"render the paid skin investors actually see (SPEC §13.5)"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"raise","commit":"d4e5f6ad","summary":"add the public pricing page"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"billing","commit":"fa5f36f1","summary":"wire up GET/POST /app/billing"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"billing","commit":"ae592b24","summary":"add Checkout/Billing Portal orchestration and live pricing"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"billing","commit":"93309af5","summary":"add the signed, idempotent Stripe webhook"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"billing","commit":"d6ba1973","summary":"map Stripe subscription state to plan and module entitlements"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"billing","commit":"9ce93bc7","summary":"add the Stripe REST client with raw-body signature check"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"config","commit":"8fadbea3","summary":"add Stripe price-id config and the live-key safety rail"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"db","commit":"66324d3e","summary":"add Stripe billing tables and stripe_customer_id"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"mail","commit":"2f9aa181","summary":"actually send email on live via Postmark instead of throwing"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"auth","commit":"c8bd342d","summary":"reset a forgotten password, and confirm your email address"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"nginx","commit":"a03f0c46","summary":"put the platform console behind its own network allowlist"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ops","commit":"c34e9e20","summary":"the platform console — tenants, growth, health, one tenant"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ops","commit":"450fc0ea","summary":"the cross-tenant repository behind the platform console"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ops","commit":"8a97f36b","summary":"a suspended tenant gets a notice on sign-in and a closed room"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ops","commit":"db78a6ed","summary":"the operator session, its own trust domain"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ops","commit":"a3826f42","summary":"operator accounts repository and the ops-admin CLI"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"db","commit":"d75b2ab7","summary":"add platform_admins and an 'operator' audit actor type"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"guide","commit":"72a5ece1","summary":"A guide to using RaisePortal, in the menu when you sign in"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"assistant","commit":"99e562a4","summary":"Investors can ask questions in your data room, answered from the documents you choose"},{"kind":"security","label":"Security","badgeClass":"badge-danger","scope":"captable","commit":"eea72133","summary":"cap import size, rate-limit uploads, and bound conversion memory"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"deploy","commit":"66d9a9e7","summary":"call the real migration runner and stop leaking the backup password to ps"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"deploy","commit":"9047df6e","summary":"parameterise backup.sh for dev and live, and stop leaking the DB password to ps"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"nginx","commit":"db6fc3ff","summary":"only trust Cloudflare's visitor-location headers from Cloudflare"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"security","commit":"21cea467","summary":"keep visitors' precise coordinates and postal code out of logs"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"e2e86b42","summary":"label the import wizard's tables for mobile"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"562faa35","summary":"solve the SAFE discount price and the pool top-up together"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"30462569","summary":"let a convertible note accrue interest through the real form"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"736f5940","summary":"stop editing a holder from multiplying their Invested amount by 100"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"room","commit":"4130b87a","summary":"never 500 the whole investor room when the cap table aggregator throws"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"9231e468","summary":"stop a confidential group's label from lying about who is in it"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"90f6a8b4","summary":"stop a confidential holder's numbers from ever reaching a named row"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"a8d349dd","summary":"stop the confidential holder merge from crossing class boundaries"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"captable","commit":"e881e7e7","summary":"the SAFE total can no longer be subtracted to reveal a suppressed instrument"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"security","commit":"aafa7416","summary":"close the SPEC §14 CSP gap on style-src, font-src and frame-ancestors"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"e2e","commit":"a7d41942","summary":"clear rate-limit budgets so the suite is runnable repeatedly"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"e2e","commit":"b5d2ef14","summary":"verify fixture founders' email through the real /verify flow"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"e2e","commit":"9fea664f","summary":"make signup() prove the browser really lands on the dashboard"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"rooms","commit":"36ba2437","summary":"stop the founder's dark/light chrome from leaking onto investor pages"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"security","commit":"e60eaf21","summary":"scope the CSP form-action allowlist to this app's own subdomains and Stripe"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"rooms","commit":"8aa47c34","summary":"skin the investor-facing AI screen like the room it opened from"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"billing","commit":"790b15eb","summary":"bust the 60s tenant cache on every webhook entitlement change"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"ai","commit":"372160ff","summary":"hide the billing link from a member who can't open it"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"room","commit":"b9b42094","summary":"send Cache-Control: private, no-store on every investor-facing response"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"logs","commit":"015b0def","summary":"redact the investor-room password slug and access code from the log stream"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"logs","commit":"c971d3db","summary":"redact token-shaped values in header values, not just header keys"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"auth","commit":"990740dc","summary":"close three account-recovery gaps in one pass"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"mail","commit":"8b2fd846","summary":"make every failed email send loud instead of silently vanishing"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"logs","commit":"bdc4cbd9","summary":"stop reset/verify tokens and session cookies leaking into request logs"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"room","commit":"a37170ee","summary":"keep the helpful message when an investor's link arrives mangled"}]},{"version":"0.2.0","bump":"minor","isCurrent":false,"releasedAt":"2026-08-04 06:29 UTC","releasedAtIso":"2026-08-04T06:29:11.000Z","entries":[{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"alerts","commit":"c1d185e2","summary":"tell the founder someone opened the deck, and only then"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"views","commit":"8608d003","summary":"let a founder allow one document to be downloaded"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"tracking","commit":"3cdb1b7e","summary":"who read what, for how long, and how far they got"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"raise","commit":"7a29536d","summary":"track the goal, who owns what, and what has actually closed"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"room","commit":"0bf6c9f8","summary":"an investor can open a link and read the deck"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"team","commit":"144dde3a","summary":"invite a co-founder, and enforce what each role may do"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ui","commit":"6d59e4aa","summary":"one public nav everywhere, usable on a phone and legible in dark"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"signup","commit":"8719cbd0","summary":"ask for the round and target investors, and vet the address"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ui","commit":"c544be4c","summary":"apply the brand palette, and make the public nav usable on a phone"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"auth","commit":"076da660","summary":"sign in from the marketing site, not just a portal subdomain"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"documents","commit":"efd7dfdb","summary":"upload, categorise and version a data room's files"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"security","commit":"0544b8b5","summary":"add CSRF protection to signup, login and logout"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"nginx","commit":"49619751","summary":"IP-allowlist dev behind Cloudflare real-IP restoration"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"auth","commit":"ef4362d7","summary":"add tenant resolution, signup, login and the dashboard shell"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"marketing","commit":"4e72775b","summary":"wire the footer pages, the real changelog, and 404/500"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"ui","commit":"86146de9","summary":"add an app-wide dark/light mode, defaulting to dark"},{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"skeleton","commit":"b21e7083","summary":"render the landing page and signup form from Express"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"documents","commit":"6e9dfd7d","summary":"report a virus scan honestly, and preview Office files"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"db","commit":"47a68a2b","summary":"store timestamps in UTC"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"raise","commit":"c76a1400","summary":"stop formatting a calendar DATE in the viewer's timezone"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"ui","commit":"65edac95","summary":"make dark mode actually render, and drop the OS-preference fallback"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"tenant","commit":"faf2256a","summary":"bust the 60s tenant cache when a signup fills a subdomain"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"auth","commit":"2f02898b","summary":"stop /app's auth guard from swallowing unrelated 404s"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"raise","commit":"04bfe5ec","summary":"drop trailing .00 on whole-dollar amounts to match the mockups"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"auth","commit":"a5ce77a4","summary":"enforce the 30-day absolute session cap without touching anonymous traffic"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"marketing","commit":"66546c37","summary":"use a real definition list for the contact page's kv block"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"db","commit":"5eac0251","summary":"stop schema.sql hardcoding the live database name"},{"kind":"patch","label":"Fix","badgeClass":"","scope":"env","commit":"faf329ff","summary":"quote MAIL_FROM so .env can be sourced by a shell"}]},{"version":"0.1.0","bump":"minor","isCurrent":false,"releasedAt":"2026-08-02 00:00 UTC","releasedAtIso":"2026-08-02T00:00:00.000Z","entries":[{"kind":"minor","label":"New","badgeClass":"badge-info","scope":"portal","commit":"c8f1e1ee","summary":"Startups can claim a subdomain and open a free investor portal"}]}]}