Skip to content
STACK IT FAST

Maybe

Curated OSSAI-agentPersonal Finance2-5 people

Audited from github.com/maybe-finance/maybe

Maybe is an open-source personal finance app, archived with v0.6.0 as its final release, built as a Ruby on Rails monolith with Hotwire for interactivity and self-hostable via Docker under an AGPLv3 license.

Language
Ruby
Database
PostgreSQL
Hosting
Docker
License
AGPL-3.0
Running for
2 years
Team
2-5 people

Why this architecture

A Rails 7.2 monolith with Hotwire (Turbo and Stimulus) and ViewComponent avoids a separate frontend build, while PostgreSQL plus Redis-backed Sidekiq handle storage and background account-sync jobs; the project is now archived, reflecting its final v0.6.0 architecture.

Tech stack by layer

11 technologies · audited Sep 17, 2026
Frontend & UI
  • HotwireTurbo and Stimulus drive interactivity without a separate JavaScript framework.
  • ViewComponentUI is composed from Ruby-backed view_component classes in app/components.
  • Tailwind CSSStyles the app via the tailwindcss-rails gem.
Backend & APIs
  • Ruby on RailsRails 7.2 is the core web framework serving app/controllers and app/views.
  • PumaApplication server for both development and production.
  • SidekiqRuns background jobs such as account syncs, with scheduled jobs via sidekiq-cron.
Data & Persistence
  • PostgreSQLPrimary datastore, configured via database.yml and the pg gem driver.
  • RedisBacks Sidekiq queues and Action Cable.
Infrastructure & Deploy
  • DockerMulti-stage Dockerfile builds a production image with precompiled assets.
  • RenderA dedicated build script supports deploying the app to Render.com.

Maybe architecture diagram

Open SVG
Maybe architecture diagramWeb app → Rails app (Turbo); Web app → Action Cable (streams); Rails app → PostgreSQL (ActiveRecord); Rails app → Redis (enqueue); Redis → Sidekiq (jobs); Action Cable → Redis (pub/sub)CLIENTSSERVICESWORKERS & JOBSDATA & STORAGEWeb appHotwire · ViewComponentRails appRails 7.2 · PumaAction Cablelive updatesSidekiqsyncs · cron jobsPostgreSQLpgRedisqueues · cableTurbostreamsjobsActiveRecordenqueuepub/sub
How the main components of Maybe connect, drawn from the audited repository.
Diagram as text
  • Web app (Hotwire · ViewComponent) → Rails app (Rails 7.2 · Puma): Turbo
  • Web app (Hotwire · ViewComponent) → Action Cable (live updates): streams
  • Rails app (Rails 7.2 · Puma) → PostgreSQL (pg): ActiveRecord
  • Rails app (Rails 7.2 · Puma) → Redis (queues · cable): enqueue
  • Redis (queues · cable) → Sidekiq (syncs · cron jobs): jobs
  • Action Cable (live updates) → Redis (queues · cable): pub/sub

Key architectural decisions

5 decisions
  1. 01

    The project is archived; the final release is v0.6.0

    The README states this repository is no longer actively maintained and points to the v0.6.0 final release; the GitHub repo is also flagged archived, so this deep dive documents the last shipped architecture rather than an actively evolving one.

  2. 02

    Hotwire (Turbo and Stimulus) replaces a separate frontend SPA

    Gemfile depends on turbo-rails and stimulus-rails instead of a React or Vue build step, so most interactivity is server-rendered HTML enhanced by Turbo Frames and Streams, with app/javascript holding only Stimulus controllers.

  3. 03

    UI is built from ViewComponent classes, not only ERB partials

    Gemfile includes view_component and lookbook (pinned to 2.3.11 for a known compatibility issue), and app/components holds reusable Ruby-backed view objects instead of relying solely on template partials.

  4. 04

    Money and currency logic is hand-rolled rather than gem-based

    lib/money.rb and the lib/money directory implement currency handling directly in the codebase, backed by config/currencies.yml, rather than depending on an external money-rails style gem.

  5. 05

    Background processing runs on Sidekiq with cron-scheduled jobs

    Gemfile pairs sidekiq with sidekiq-cron, and config/schedule.yml plus config/sidekiq.yml configure recurring jobs such as account syncs, all run against the Redis-backed queue.

How Maybe is built

How Maybe is structured

Maybe is a standard Ruby on Rails monolith: app/ holds controllers, models, views, jobs, mailers, channels, helpers, services, and components in the conventional Rails layout, with app/javascript limited to Stimulus controllers rather than a full frontend build tree. config/ carries Rails configuration plus app-specific files like config/currencies.yml and config/schedule.yml for scheduled jobs. lib/money.rb and lib/money/ implement the application's currency and monetary-value logic directly rather than through an external gem. As of this audit the GitHub repository is flagged archived, and the README states it is "no longer actively maintained," with v0.6.0 documented as the final release.

Frontend

The frontend follows the Hotwire pattern: Gemfile depends on turbo-rails and stimulus-rails for SPA-like navigation and interactivity without a separate JavaScript framework build step, and hotwire-livereload speeds up development. UI components are built with view_component rather than relying solely on ERB partials, with app/components holding reusable, testable Ruby view objects; lookbook (pinned to 2.3.11 due to a known upstream issue noted in the Gemfile) provides a component preview/documentation tool during development. Styling uses tailwindcss-rails, and icons come from a fork of Lucide (lucide-rails, sourced from maybe-finance/lucide-rails on GitHub rather than the upstream gem).

Backend & APIs

Rails 7.2 (gem "rails", "~> 7.2.2") is the core framework, served by Puma (config/puma.rb) in both development and production. Authentication and API security use doorkeeper for OAuth provider functionality, jwt for token handling, and rack-attack for rate limiting. External integrations are extensive for a personal finance app: plaid for bank account linking, stripe for billing, intercom-rails for support, and ruby-openai for AI-assisted features. docs/api documents the public API surface. Background work — account syncing, imports, and scheduled maintenance — runs through Sidekiq (sidekiq, sidekiq-cron), configured via config/sidekiq.yml and config/schedule.yml.

Data & persistence

PostgreSQL is the primary datastore, connected through the pg gem and configured in config/database.yml; db/schema.rb and db/migrate track the Rails-managed schema, with db/seeds.rb and db/seeds/ providing seed data (including the demo login credentials documented in the README). Redis (redis gem, ~> 5.4) backs both the Sidekiq job queue and Action Cable for any real-time UI updates. File uploads are configured through config/storage.yml, and aws-sdk-s3 is included for S3-backed Active Storage in production, alongside image_processing for variant generation.

Build, test & deploy

Testing uses Rails' built-in Minitest framework (test/ mirrors the app/ structure with models, controllers, components, system, and integration subdirectories) plus Capybara and Selenium WebDriver for system tests, with VCR and WebMock for stubbing external HTTP calls (Plaid, Stripe, etc.) via recorded cassettes in test/vcr_cassettes. Code quality is enforced with rubocop-rails-omakase, erb_lint, and brakeman for static security analysis (config/brakeman.ignore lists accepted findings). GitHub Actions workflows (ci.yml, pr.yml, publish.yml) run this test and lint suite and publish artifacts. biome.json and the root package.json (a minimal Node manifest with only @biomejs/biome) lint the small amount of non-Rails JavaScript/JSON in the repo.

Self-hosting notes

The root Dockerfile builds a production image in stages: a build stage installs build-essential, libpq-dev, and other native gem dependencies, runs bundle install and bootsnap precompile, then precompiles Rails assets; the final stage copies only the built gems and application code into a slim ruby:3.4.4-slim image running as a non-root rails user on port 3000. compose.example.yml and .devcontainer/docker-compose.yml provide reference Docker Compose setups, and docs/hosting/docker.md (linked prominently from the README) is the documented self-hosting path. bin/render-build.sh additionally supports one-click deployment to Render.com. Because the project is archived, none of these paths receive further security updates from the original maintainers; the README explicitly tells forks to retain the AGPLv3 license and disclaim affiliation with Maybe Finance Inc.

Sources & repo audit

Audited
Sep 17, 2026
Commit
77b5469
License
AGPL-3.0

Independent analysis of repository at github.com/maybe-finance/maybe. Spotted an inaccuracy? Use the claim form to request a correction.

Show this stack on your README or website
Tech stack of Maybe
[![Tech stack of Maybe on STACK IT FAST](https://stackitfast.com/badge/maybe.svg)](https://stackitfast.com/project/maybe)

Paste it into your README. It shows your current stack and links to this page.

Use this stack

Scaffold it with your agent

Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with Maybe's architecture.

  1. 1Copy the promptThe full markdown spec, with every layer and decision.
  2. 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
  3. 3Paste and scaffoldUse it as the first instruction; review before you ship.
use-this-stack.md · 59 lines · 6.3 KB
# MISSION: Scaffold "Maybe" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **Maybe**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: Maybe
- **What It Does**: Maybe is an open-source personal finance app, archived with v0.6.0 as its final release, built as a Ruby on Rails monolith with Hotwire for interactivity and self-hostable via Docker under an AGPLv3 license.
- **Domain & Category**: Personal Finance
- **Production Scale**: 2-5 people
- **Development Mode**: AI-AGENT
- **Architectural Rationale**: A Rails 7.2 monolith with Hotwire (Turbo and Stimulus) and ViewComponent avoids a separate frontend build, while PostgreSQL plus Redis-backed Sidekiq handle storage and background account-sync jobs; the project is now archived, reflecting its final v0.6.0 architecture.
- **Live Website Reference**: https://maybe.co
- **Source Repository**: https://github.com/maybe-finance/maybe
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: Ruby, Rails, PostgreSQL, Redis, Sidekiq, Hotwire, Tailwind CSS, Docker, Render, Puma, ViewComponent
- **Primary Language(s)**: Ruby, HTML
- **License of the reference repo**: AGPL-3.0
- **Frontend**: Hotwire — Turbo and Stimulus drive interactivity without a separate JavaScript framework.; ViewComponent — UI is composed from Ruby-backed view_component classes in app/components.; Tailwind CSS — Styles the app via the tailwindcss-rails gem.
- **Backend & APIs**: Ruby on Rails — Rails 7.2 is the core web framework serving app/controllers and app/views.; Puma — Application server for both development and production.; Sidekiq — Runs background jobs such as account syncs, with scheduled jobs via sidekiq-cron.
- **Data & persistence**: PostgreSQL — Primary datastore, configured via database.yml and the pg gem driver.; Redis — Backs Sidekiq queues and Action Cable.
- **Infrastructure & deploy**: Docker — Multi-stage Dockerfile builds a production image with precompiled assets.; Render — A dedicated build script supports deploying the app to Render.com.
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/maybe-finance/maybe @ 77b5469)
1. **The project is archived; the final release is v0.6.0**: The README states this repository is no longer actively maintained and points to the v0.6.0 final release; the GitHub repo is also flagged archived, so this deep dive documents the last shipped architecture rather than an actively evolving one.
2. **Hotwire (Turbo and Stimulus) replaces a separate frontend SPA**: Gemfile depends on turbo-rails and stimulus-rails instead of a React or Vue build step, so most interactivity is server-rendered HTML enhanced by Turbo Frames and Streams, with app/javascript holding only Stimulus controllers.
3. **UI is built from ViewComponent classes, not only ERB partials**: Gemfile includes view_component and lookbook (pinned to 2.3.11 for a known compatibility issue), and app/components holds reusable Ruby-backed view objects instead of relying solely on template partials.
4. **Money and currency logic is hand-rolled rather than gem-based**: lib/money.rb and the lib/money directory implement currency handling directly in the codebase, backed by config/currencies.yml, rather than depending on an external money-rails style gem.
5. **Background processing runs on Sidekiq with cron-scheduled jobs**: Gemfile pairs sidekiq with sidekiq-cron, and config/schedule.yml plus config/sidekiq.yml configure recurring jobs such as account syncs, all run against the Redis-backed queue.
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
   - Structure as a Turborepo monorepo with strict package boundaries:
     - `apps/web`: Application UI, routing, layouts, and server endpoints.
     - `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
     - `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
     - `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
   - Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
   - Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
   - Isolate interactive UI state to leaf components. Keep core pages lightweight and performant.
4. **Design System & Aesthetics**:
   - Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
   - Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
   - Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
   - Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer (PostgreSQL, Redis): client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.
Scaffolded something with this prompt?
Would you pick this stack for a personal finance project?

Frequently asked about Maybe

What is Maybe (the personal finance app) built with?

Maybe is a Ruby on Rails 7.2 app using Hotwire (Turbo and Stimulus) for interactivity, ViewComponent for UI, PostgreSQL for storage, and Sidekiq with Redis for background jobs.

Is the Maybe Finance repository still maintained?

No. The README states the repository is no longer actively maintained, with v0.6.0 marked as the final release, and the GitHub repo is also flagged archived.

Can I self-host Maybe?

Yes, the repository documents Docker-based self-hosting in docs/hosting/docker.md and ships a root Dockerfile plus a compose.example.yml for running your own instance.

Does Maybe use a JavaScript framework like React?

No. Maybe uses Hotwire (Turbo and Stimulus, via the turbo-rails and stimulus-rails gems) for frontend interactivity instead of a separate React or Vue build.

One email a month: new deep dives and stack trends

New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.

use-this-stack.md