Cloud collaboration

The workspace is at https://omadesign.app/cloud. Cloud collaboration, included in 0.5.4, shares project files, assets and immutable flat exports. Clients review snapshots; designers continue authoring in the native Linux app.

Sign in and connect a desktop

Use a verified email address to sign in with Clerk. The native app's File → Sign in… opens your browser with a device code. Approve only the code displayed by the desktop. Desktop credentials expire after 30 days; revoke them immediately from /account or disconnect in the app. Your local identity file is written with owner-only permissions. A name or email alone never grants cloud access.

Share a project

Choose File → Push project + review export to upload a versioned .oma source and a PNG of the current document. Project font assets are included, and raster pixels remain embedded in the design file. Upload project asset… adds another file. Cloud projects… → Pull & open opens the latest source in a separate document and downloads shared assets into a new folder under the app's cloud-downloads directory.

Snapshot transfers are explicit. Local edits upload automatically only after starting or joining an opt-in live session. Every push adds files; cloud comments remain attached to the snapshot on which they were written. Save the local .oma after its first push to keep the cloud link with the document.

The web project accepts source, asset and snapshot uploads. Source and asset files are limited to 100 MB each; flat PNG/JPEG/WebP exports to 20 MB; each project supports 200 files. The initial service limit is 100 projects per account and 100 members per project. Archive a project from the web workspace to hide it from collaborators and unpublish its public work; its owner can restore it.

Team and client review

Owners invite verified email addresses as editors or reviewers. Invitations arrive through Resend and expire after seven days. Sign in with the invited email and accept from the workspace. Owners can change a member's role, remove access or cancel an invitation.

RoleAccess
OwnerProject files, uploads, review, team management, archive and publishing
EditorSource and asset downloads, uploads, all review tools, replies, resolving and deleting threads
ReviewerFlat exports, stamps, rectangles, highlighter, brush, comments and replies; can resolve or delete their own threads

Select an export version in the web project. The floating rail offers five stamp reactions (approve, problem, like, question and note), rectangles, a translucent highlighter, an opaque brush and comment pins. Choose a stamp then click to place it; drag to draw a stroke. Stamps and strokes save immediately and open a thread with an optional reply. Pins and rectangles ask for a comment before posting. Stroke color and width are adjustable. Press Escape to cancel a draft; keys 1–5 choose a stamp while the stamp tool is active.

Click a mark to select its thread. Reply, resolve or reopen it, and hide resolved marks when reviewing outstanding work. Authors and the project team can delete annotations and their replies. Coordinates and stroke widths scale with the image, including on mobile; long strokes are reduced to at most 512 points. Every mark stays on the original snapshot version when a new export is uploaded.

The desktop's Review annotations… window renders the same stamps, strokes, rectangles and pins over the selected export, with replies and resolve/reopen controls. Mark placement stays in the web review canvas.

Private downloads recheck membership on every request. Revoking a member or desktop blocks future requests. Previously downloaded files are still held by the recipient.

Public showcase and competitions

Publication is a separate owner action. Select a finished flat export, add its title and description, and choose Publish selected export in the desktop or web workspace. Source files, assets and private review threads are excluded. /showcase lists public works; /showcase/:id displays the complete flat image. Unpublishing removes it from the gallery, competition displays and image endpoint. Copies already saved by viewers cannot be recalled.

Use an owned public showcase work to enter an open competition. Entries are persisted, duplicate submissions are rejected, and closing dates are enforced by the server. /compete lists competitions, public entries and your withdrawal controls. Competitions remain unpublished until the operator supplies a real brief and opening/closing dates.

Service operations

Vercel hosts the web app. Clerk owns identity, Convex owns authorization, data and storage, and the Convex Resend component queues invitations with retries and delivery webhooks. There is no browser-local substitute for these services.

Production uses the Clerk issuer https://clerk.omadesign.app, Convex deployment healthy-buzzard-921, and Resend sender collab@mail.omadesign.app. Development uses separate Clerk and Convex instances. Secrets belong in service environment configuration and ignored local env files, never Git.

See site/.env.example for web variable names. Convex requires CLERK_JWT_ISSUER_DOMAIN, RESEND_API_KEY, RESEND_WEBHOOK_SECRET and the existing WAITLIST_SECRET. Clerk's convex JWT template must include audience convex, email, verified email and name claims. The production Resend webhook is /resend-webhook on the Convex HTTP domain.

From site/, use bunx convex dev --once for development and bunx convex deploy --yes for production. Use vercel pull --environment=production, vercel build --prod, and vercel deploy --prebuilt --prod for the site. Production and development keys must not be mixed.

Operators create or update competition briefs through the internal showcase:configureCompetition function, with title, description, millisecond opens/closes timestamps, and active. No public administrator endpoint exists. mail:deliveryProbe sends only to Resend's delivery test sink; mail:deliveryStatus inspects the returned queue id. Expired upload intents, device requests and rate counters are cleaned automatically. Invitations are capped at 20 per account per hour.

The desktop transport is /api/cloud. /project/:id redirects to its authenticated workspace. Historical cloud rollout evidence remains in rollout tracking. The accepted 0.5.0 binary and its human QA record remain preserved separately from newer builds.

Website entry and historical waitlist

Open /cloud to sign in and use project sharing and snapshot review. The optional homepage film at /#cloud introduces these features and links to the workspace and this guide. It does not open automatically on every visit, and it no longer asks people to wait for functionality already included in the release.

The earlier cloud waitlist records remain in Convex waitlistSignups, indexed by list and normalized email. Cloud and competition audiences stay separate. There is no public signup-list or lookup endpoint. Signup never sent emails; member invitations remain separate, explicit actions through Resend.

An authenticated operator can review or export retained records in the Convex dashboard, or remove an address on request from site/:

bunx convex run waitlist:removeSignup '{"email":"address@example.com","list":"cloud"}' --prod

The removal function is internal and cannot be invoked through the public API.

Scope

Cloud collaboration means project file and asset sharing with member access control; client review, comments and annotations on flat snapshots; publishing finished public work to the Omadesign showcase; and entering that work into open competitions. The browser is for sharing and review. Native live editing, presence, offline merge and author-owned undo are described in Live native editing. Browser authoring remains outside this scope.