Dcyde: Team Memory for Product Decisions
A SaaS product I took from idea to shipped, on my own. Decisions flowed in from Slack and Figma onto one wall and stayed searchable.
Connectors that met teams where they worked
Decisions happen in Slack, Figma, and design reviews. Rather than ask teams to change habits, I built for where they already were.
Slack: /pin from any channel
I put capture inside Slack as a /pin command: any member of a connected workspace could type it, the decision landed on the wall instantly, and @mentions triggered a DM. Nobody had to leave the conversation to record it.
Figma: pin without leaving the canvas
I built the plugin to attach file and page context automatically, so a call made in a review carried its artwork with it. Published on the Figma Community.
Decide together, without the anchoring
I made alignment votes anonymous until close: members voted without seeing the tally, and results stayed hidden until voting ended. No peeking, no anchoring bias.

Four ways in, one account
I shipped four ways in, all resolving to a single identity: Google, Microsoft, SAML SSO, and email magic link.
How it works
End to end: how a decision gets captured, aligned on, and found again months later.
Under the hood
I built three client surfaces (web, the Figma plugin, and Slack) onto one realtime core. A decision pinned in Slack was on every screen before the modal closed.
core · firestore + cloud functions
Why
No REST layer to babysit: one realtime hub means every surface reads and writes the same wall, live. Sync isn't a feature here; it's the product feeling.
How
Firestore governed by a heavily-audited security-rules file (the real API contract) plus 58 Cloud Functions v2 on Node 22 in europe-west1 for the privileged parts: webhooks, emails, billing, crons.
surface · web app
Why
The wall itself: where decisions get pinned, scoped, voted on, and found again months later.
How
React 19 + Vite + Tailwind 4, EN/FR i18n, dark OLED theme. Every component has a Storybook story (45 of them) with visual regression on top.
surface · figma plugin
Why
Design decisions die in comment threads. Capturing them on the canvas, in the moment, is the only way they survive.
How
The plugin sandbox talks to its UI via postMessage; sign-in uses single-use session codes; file, page and frame context is attached to every pin automatically.
surface · slack /pin
Why
Most decisions are made mid-conversation. /pin turns the conversation into the record without leaving it.
How
A slash command opens a modal; webhooks are HMAC-signed with timing-safe comparison and a five-minute replay window; installs work per room or org-wide.
scheduled · cron × 4
Why
A product needs a heartbeat when nobody's online: digests that retain, nudges that onboard, checks that keep the data honest.
How
Four scheduled functions: the Monday digest, day-7 onboarding nudges, action-request expiry, and a nightly data reconciliation as an integrity backstop.
service · resend
Why
Email is a product surface: it signs you in, brings you back, and speaks your language.
How
Magic links, welcome, digests and nudges, all localized EN/FR and sent through Resend, with RFC-8058 one-click unsubscribe, HMAC-verified.
service · stripe
Why
Pricing is a positioning decision: free for every team, enterprise pays for SSO and org administration.
How
One flat subscription per organisation; signature-verified webhooks; a self-serve billing portal minted by Cloud Functions.
service · workos
Why
Enterprises don't buy tools their IT can't govern. SSO is the ticket to that conversation.
How
SAML via WorkOS with CSRF-bound state on the callback, domain verification, and cross-provider identities auto-linked into one account.
service · slack api
Why
Notifications belong where the team already lives, not in another inbox.
How
Mentions, follows and vote updates arrive as DMs; scopes are minimal and post-only; tokens live server-side only, never in the client.