Solo build · Shipped end to end

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.

The decision wall: every call captured in seconds, searchable months later.

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.

Dcyde login page with Continue with Google, Microsoft, email, and Sign in with SSO

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.

Dcyde system architectureThree client surfaces (the React web app, the Figma plugin, and the Slack slash-pin command) all talk in real time to one core: Firestore plus 58 Cloud Functions in europe-west1. The core drives four server-side services: Resend for transactional email in English and French, Stripe for enterprise billing, WorkOS for SAML single sign-on, and the Slack API for DMs and modals, plus four scheduled cron jobs. Each node is a button that shows why-and-how details below the diagram.

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.