A self-hosted productivity suite for your team - and the platform you build the next app on top of. Standard protocols, own your data, free forever.
No signup. Sandboxed. Resets nightly.
Two doors into the same project. One leads to a working productivity suite for your team in fifteen minutes. The other leads to a platform you can build the next app on top of.
1export default {
2 name: 'CRM',
3 slug: 'crm',
4 routes: { directory: 'screens' },
5 collections: { register: 'collections' },
6 nav: { label: 'CRM', icon: 'users' },
7}| Six tightly integrated apps that cover daily productivity. Each one speaks native protocols - use the web UI, mobile app, or your favorite desktop client.
Full email with threaded conversations, labels, attachments, and delivery tracking. Connect with any IMAP or SMTP client.
Shared calendars with recurring events, guest management, RSVP, reminders, and color-coded categories.
Shared contact directory with favorites, notes, and org-wide sharing. Syncs with any CardDAV client.
Cloud file storage with versioning, share links, role-based permissions, thumbnails, and trash.
A real document editor — not a textarea in a tab. Rich formatting, tables, comments, and live collaboration via CRDTs, with full-fidelity .docx and Markdown round-trips. Mobile-native: format and edit from your phone without fighting the keyboard.
Feature complete · Lightly battle-tested
Spreadsheets that hold up on a phone. Formulas, named ranges, workbook snapshots, and real-time co-editing on top of Drive. CSV and .xlsx import/export with formatting preserved, so it actually plays nicely with whatever your team already uses.
Feature complete · Lightly battle-tested
The official TinyCld iOS app is here. Connect to your server, sign in, and your mail, calendar, contacts, and drive show up where you actually use them. No middlemen. No analytics. No re-hosting your data.
Export your Google data. Drag the ZIP onto TinyCld.
We parse .mbox, .ics, and .vcf in a
web worker, dedupe contacts by vCard UID, merge calendars
by ICAL_UID, and drop your files back into their original folders.
.zip into TinyCld - no unpacking Parsing happens in a web worker, so the UI stays snappy even at 20 GB. ICAL_UID, calendars reuse by name. Not a wrapper around other services. A ground-up implementation that's fast, lean, and respects your team's freedom.
No per-seat pricing, no premium tiers, no surprises. TinyCld is open source under a permissive license. Self-host it on a $5/month VPS or use our hosted option.
Your emails, files, and contacts live on your server. No data mining, no ads, no lock-in. Export anything, anytime.
A single Docker image runs on a $5 VPS, your homelab, or a Dokku one-liner. Healthchecks and Let's Encrypt are baked in - no ops team required.
Self-host on your own server and TinyCld never phones home - no analytics, no crash pings, no metered usage reports. External email images are proxied through your server with a scoped token, so senders can't see your IP, read receipts, or user agent. Big tech sees nothing, because nothing is sent.
IMAP, SMTP, CalDAV, CardDAV, WebDAV - use Apple Mail, Thunderbird, any CalDAV client, or mount your drive as a network folder.
Users can belong to multiple organizations with different roles. Shared calendars, contacts, mailboxes, and files within org boundaries.
One app for web, iOS, and Android - plus standard protocols so Apple Mail, Thunderbird, and Finder just work alongside.
Live updates across all apps via server-sent events. No polling, no manual refresh - changes from other users and devices appear instantly.
Every app speaks its native protocol. Use our web UI, your favorite desktop client, or both. Your choice, always.
:993 :465 :443 :443 :443 Host TinyCld yourself on a small Linux VM. One Docker container, one compose file, working email and HTTPS in about fifteen minutes.
# on any Linux VM with Docker
$ mkdir tinycld && cd tinycld
$ curl -O https://raw.githubusercontent.com/tinycld/tinycld/main/docker-compose.yml
$ docker compose up -d
✓ ready · https://mail.example.org
Every package starts with a working app shell that already does
the hard parts. Drop in a manifest.ts, get all of this
for free, and ship the parts that actually matter to you.
Sessions, signup, login, and OAuth-ready user records.
const { user } = useAuth() Users in many orgs with per-org roles. Routes are org-scoped.
const { orgId, orgSlug } = useOrgInfo() Reactive queries with TanStack DB. Updates push automatically.
useOrgLiveQuery((q, { orgId }) => …) Optimistic updates with rollback. Generator-based for sequencing.
const m = useMutation({ mutationFn: …}) Send transactional + IMAP/SMTP serving for end users. One config.
mailer.Send(ctx, msg) Upload, version, share. Thumbnails, mime detection, role-scoped.
drive.insert({ file, parent, owner }) In-app drawer + toasts. One feed for every package event.
notify({ title, body, data }) Native iOS + Android push out of the box. Per-user device tokens.
push.SendToUser(ctx, userId, msg) Append-only record of every change. UI to browse and export.
audit.Record(ctx, "contact.created", …) Hook Form + Zod, typed end-to-end. Inputs styled to match.
useForm({ resolver: zodResolver(schema) }) Light + dark, semantic tokens, user-pickable color palettes.
useThemeColor('foreground') One codebase. Expo Router routes work in both.
<Link href={orgHref('crm/[id]', …)} /> Plus everything PocketBase gives you (admin UI, file storage, real-time, OAuth providers) and everything Expo gives you (Expo Router on web + iOS + Android, EAS builds, OTA updates). The stack you don't have to build.
A package is a folder with a manifest.ts. The manifest
points at directories that already exist in your repo - and the
generator wires them all into the running app at build time.
1export default {
2 slug: 'crm',
3 routes: { directory: 'screens' },
4 collections: { register: 'collections' },
5 settings: [{ component: 'settings/admin' }],
6 migrations: { directory: 'pb-migrations' },
7 server: { module: 'tinycld.org/packages/crm' },
8} screens/ Org-scoped routes collections.ts Typed pbtsdb wiring settings/ Settings panels pb-hooks/ PocketBase JS hooks pb-migrations/ DB migrations server/ (Go) First-class Go ext public-screens/ Top-level routes tests/ Vitest + Playwright npm run packages:link drops a symlink in the app shell. Each package is its own git repository with its own history, issues, and PRs. Pick the one that matches your skills - JavaScript, Go, both - and ship a fix this weekend.
IMAP + SMTP, threaded UI, image proxy.
CalDAV server, recurring events, RSVP.
CardDAV server, deduped directory.
WebDAV file storage, thumbnails, share links.
Collaborative documents, stored as Drive items.
Collaborative spreadsheets with snapshots.
The scaffolding CLI sets up a sibling repo with a working manifest,
an example screen, and the symlink wired into a running app shell.
From npm create to a live route in your browser.
# in your code/ directory
$ npx @tinycld/create-package
? What's the package name? crm
? Include a Go server? y
✓ Created ./crm
✓ Linked into ../tinycld/packages/@tinycld/crm
✓ Generated routes, types, migrations
→ open http://localhost:7100/a/<org>/crm