From one-way link to shared contract space
MEMNO is becoming two-sided: freelancer and client meet on the project. Login stays optional, roles are per project — not global. This is what the vision looks like.
Today MEMNO works well one-sided: you create projects, send magic links, the client confirms without an account. What is missing is a place both sides can refer back to later — beyond emails and PDFs in an inbox.
Target state
MEMNO becomes a shared contract space. Both can say: “Check MEMNO, project X.” Login is never required — the magic-link flow stays.
Login optional, never blocking
Clients should still confirm without friction. Optionally they can sign up when accepting and get an overview of all projects they have confirmed. Without an account: the legal trail (confirmation + PDF) works fully. With an account: convenience (history, overview, notifications).
Roles per project — not per user
A common mistake in B2B SaaS: users are globally “freelancer” or “client”. MEMNO is different: you can be owner in project A and client in project B — one account, different roles per project.
| Project | Your role |
|---|---|
| Website for client A | owner (you are freelancing) |
| Design job with colleague B | client (you commissioned it) |
Linking on acceptance
The magic link `/a/[token]` already knows project, freelancer, and client email. On optional sign-up we only attach the client identity (Clerk userId) — no manual “add project”.
New in the data model: `projectParticipants` with `role: owner | client` and `linkedVia: create | accept_token`. On project creation: owner entry. On acceptance with account: client entry.
What we deliberately skip (v1)
No mandatory sign-up for clients. No separate client portal as a second app. No global user type “freelancer only” / “client only”.
Dashboard: one portal, two views
Tab “My projects” (owner) and later “As client” (read-only: baseline, change requests, status, PDFs). The acceptance page gets two equal paths: confirm without account (primary) and “Confirm with MEMNO account” (secondary).