Building a business management platform that runs seamlessly on web, desktop, and mobile is no small feat. Midday tackles this by combining a TypeScript monorepo with a carefully chosen stack: Next.js for the web frontend, Tauri for desktop, and Expo for mobile. All three clients connect to a single Supabase backend, which handles database, authentication, storage, and realtime updates. This repo is a practical example of how to structure a multi-platform SaaS product for freelancers or small teams without fragmenting code or infrastructure.
multi-platform business management platform built with a unified backend
Midday is an open-source platform aimed at freelancers who need a consolidated tool for managing their business. The platform covers a wide range of functionality, including bank connections (via Plaid, GoCardless, Teller), financial operations, and an AI assistant layer providing financial insights powered by Gemini and OpenAI.
Under the hood, the repo is a TypeScript monorepo that shares code and types across multiple runtimes and clients. The frontend for web is built with Next.js and React, taking advantage of server-side rendering and static generation where appropriate. For desktop apps, Midday uses Tauri, which bundles a Rust backend with a webview frontend to create lightweight native apps with a smaller footprint than Electron. Mobile apps are built with Expo, a React Native framework that streamlines cross-platform mobile development.
The backend services rely on Supabase, an open-source alternative to Firebase, which handles the database (PostgreSQL), authentication, storage, and realtime subscriptions. This choice keeps the backend relatively simple and scalable without building custom APIs. Background jobs and workflows are managed via Trigger.dev, enabling integration with external services and scheduled tasks.
The repo also integrates with financial services through Plaid, GoCardless, and Teller, enabling bank connections and payments. On top of this, an AI assistant layer uses Gemini (Google’s AI model) and OpenAI APIs to provide financial advice and insights.
The entire stack runs on Bun, a modern JavaScript runtime that combines a bundler, transpiler, and runtime, aiming to improve developer experience and performance.
The project is licensed under AGPL-3.0 for non-commercial use, with commercial licenses available separately.
multi-platform monorepo architecture and tradeoffs
What distinguishes Midday is its multi-platform architecture using a shared TypeScript monorepo. This approach allows unified business logic and types to be reused across web, desktop, and mobile clients, reducing duplication and improving consistency.
Maintaining a single monorepo with Next.js, Tauri, and Expo clients is not trivial. Each runtime has its own quirks and build pipelines. For example, Tauri involves Rust bindings and native code compilation, while Expo manages native mobile builds and bundling.
Sharing types and business logic across these platforms requires careful structuring, typically by extracting shared modules or packages that can be imported by all clients. This reduces bugs from inconsistent data models and improves developer experience.
Using Supabase as a backend simplifies backend complexity but comes with tradeoffs: you rely on a third-party service for critical infrastructure and may have less control over complex backend workflows. However, Trigger.dev is used to fill in gaps for background jobs and integrations.
The choice of Bun as the runtime is interesting. Bun promises faster startup and bundling times compared to Node.js, but it is still relatively new and may lack some ecosystem maturity. This could impact developer onboarding or compatibility with some npm packages.
The AI assistant integration is a nice touch for a business management tool, but it adds complexity around API usage, latency, and cost.
The code quality is reportedly clean and organized, reflecting a professional approach to monorepos and cross-platform development. The licensing choice (AGPL-3.0 for non-commercial use) is also a consideration for anyone looking to build commercial products on top.
explore the project and documentation
The Midday repo does not provide explicit local development or quickstart commands in the README. Instead, it hosts its documentation externally, which is the main resource for understanding setup and usage.
To explore the project, start by cloning the repo and reviewing the root-level README and the apps directory, which likely contains the Next.js web app, Tauri desktop app, and Expo mobile app subfolders. Look for shared packages or libs directories containing reusable code and types.
The documentation site linked in the repo provides guidance on environment setup, configuring Supabase, obtaining API keys for Plaid and other integrations, and running the different clients.
Understanding the monorepo structure will help you trace how business logic flows from the shared code to the individual clients and backend services.
verdict: a solid example of multi-platform SaaS with shared backend for freelancers
Midday is a well-architected platform that illustrates a practical pattern for building a multi-platform SaaS product using a TypeScript monorepo. The combination of Next.js web, Tauri desktop, and Expo mobile clients sharing a single Supabase backend is a compelling approach for freelancers or small teams wanting a unified experience without splitting codebases.
The repo’s tradeoffs are clear: managing diverse runtimes under one monorepo adds complexity, and relying on Supabase plus Trigger.dev means some backend control is outsourced. Bun as a runtime choice is interesting but not without risks given its relative novelty.
The AI financial assistant integration adds real value but also complexity around external API dependencies.
If you’re building a SaaS product targeting multiple platforms with shared business logic, Midday is worth studying for its architectural approach and stack choices. The lack of local setup commands means you’ll need to dig into the documentation and repo structure to get started, but the codebase itself is a solid example of cross-platform TypeScript engineering.
Related Articles
- Jan: a local-first desktop app for large language models with Tauri and Rust — Jan is an open-source desktop app that runs large language models locally using Tauri, Node.js, and Rust. It offers priv
- elizaOS: a TypeScript monorepo for building and deploying AI agents — Explore elizaOS, a TypeScript monorepo for AI agents with CLI and web UI. Build and deploy agents fast or extend with pl
- Thunderbolt: a cross-platform, model-agnostic AI client built with TypeScript and Tauri — Thunderbolt is a cross-platform AI client that abstracts multiple AI providers with a TypeScript codebase using Tauri, s
- Flowise: visual low-code AI agent builder with a modular TypeScript monorepo — Flowise offers a visual drag-and-drop low-code platform to build AI agents and LLM apps, with a Node.js backend and Reac
- CopilotKit: Building dynamic agentic UIs with the AG-UI protocol — CopilotKit introduces the AG-UI Protocol, enabling AI agents to dynamically render and update UI components in React app
→ GitHub Repo: midday-ai/midday ⭐ 14,207 · TypeScript