* fix(generators): stop provider:family emitting a broken migration and invalid enum
Two bugs in the per-family provider generator, both of which stop the generated code
from running at all.
1. Duplicate migration columns. The items table already defines institution_id,
institution_name, status and others, but any matching field passed on the command
line was emitted a second time in the provider-specific block, so db:migrate aborted
with "you can't define an already defined column". Reserved names are now filtered
out of that block, with a notice, since the standard column serves the same purpose.
2. Invalid Ruby in the source enums. The patcher appended the new entry directly before
the closing brace. In a multi-line hash the previous entry is followed by a newline,
so the inserted text landed on its own line after Ruby had already ended the
expression, producing:
redbark: "redbark"
, gocardless: "gocardless"}
data_enrichment.rb then failed to parse, surfacing later as a confusing eager-load
error rather than anything pointing at the generator. The comma is now attached to
the final entry and the new entry indented to match its siblings. The single-line
form used by provider_merchant.rb is preserved.
Found while adding a GoCardless provider; both reproduce with any invocation of
rails g provider:family.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(generators): add the syncable scope the family syncer requires
The generated item model includes Syncable, so Family::Syncer's reflective discovery
picks up the new `*_items` association and calls `syncable` on it. The template never
defined that scope, so a freshly generated provider raises
NoMethodError: undefined method 'syncable' for an instance of
ActiveRecord::Associations::CollectionProxy
app/models/family/syncer.rb:38
and takes down the ENTIRE nightly family sync, not just the new provider. Every other
item model in the app defines `scope :syncable, -> { active }`; the template now does
the same.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(generators): emit valid i18n interpolation in the locale template
The locale template wrote %%{count} where I18n expects %{count}. Rails generator ERB
does not collapse %% (percent trim mode only applies to lines starting with %), so the
doubled percent reached the generated file verbatim and I18n rendered it as a literal
percent sign followed by the placeholder.
Every generated provider therefore displayed strings like
%{count} accounts synced
instead of the count. 40 occurrences across sync status, institution summary, account
setup and error messages. Every hand-written locale in the app uses the single-percent
form.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(generators): reject reserved field names instead of silently dropping them
Addresses review feedback on the duplicate-column fix.
Filtering reserved names out of the migration alone was inconsistent: parsed_fields
also feeds the item model (validations, encryption), the settings panel (form inputs),
the controller params, the locale strings, the adapter and the SDK. A declared
institution_id:integer would therefore render a numeric form input and a presence
validation over the built-in string column. Declaring a reserved name is now a
Thor::Error naming the field and telling the user to drop it, which keeps the generated
code self-consistent and fails at generate time rather than at db:migrate.
Also removes 'family' from the reserved list. The migration writes
t.references :family, which creates family_id, so a field named family is not a
collision; family_id remains reserved.
Verified: institution_id is rejected with a useful message, family:string generates
cleanly, and an ordinary invocation is unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(generators): do not double the comma when the source enum has a trailing one
Addresses review feedback. When the enum hash is written with a trailing comma, the
captured body already ends with a separator, so appending another produced
redbark: "redbark",,
gocardless: "gocardless"
which is the same class of syntax error the surrounding fix exists to prevent. The
separator is now chosen from whether the body already ends with a comma.
Extracts the transformation to Provider::FamilyGenerator.append_source_enum_entry, a
pure string operation, and adds regression tests covering single-line and multiline
enums with and without trailing commas. Each case asserts the result actually parses:
the failure mode here is a SyntaxError surfacing in an unrelated file with nothing
pointing back at the generator, so asserting on shape alone would be too weak.
Verified the tests fail without the fix (2 failures, both trailing-comma cases).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(generators): do not emit a leading comma into an empty source enum
Addresses review feedback. When the target has `enum :source, {}` the captured body is
empty, so the separator produced `enum :source, {, gocardless: "gocardless"}` and the
generated model failed to parse.
No separator is emitted when the body is empty. Adds regression tests for the empty
single-line and multiline forms, both asserting the result parses.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Deutsch | Español | Français | 日本語 | 한국어 | Português | Русский | 中文
Sure: The personal finance app for everyone
Get involved: Discord • Website • Issues
Important
This repository is a community fork of the now-abandoned Maybe Finance project.
Learn more in their final release doc.
Backstory
The Maybe Finance (archived/abandoned repo) team spent most of 2021–2022 building a full-featured personal finance and wealth management app. It even included an “Ask an Advisor” feature that connected users with a real CFP/CFA — all included with your subscription.
The business end of things didn't work out, and so they stopped developing the app in mid-2023.
After spending nearly $1 million on development (employees, contractors, data providers, infra, etc.), the team open-sourced the app. Their goal was to let users self-host it for free — and eventually launch a hosted version for a small fee.
They actually did launch that hosted version … briefly.
That also didn’t work out — at least not as a sustainable B2C business — so now here we are: hosting a community-maintained fork to keep the codebase alive and see where this can go next.
Join us!
Hosting Sure
Sure is a fully working personal finance app that can be self hosted with Docker.
Forking and Attribution
This repo is a community fork of the archived Maybe Finance repo. You’re free to fork it under the AGPLv3 license — but we’d love it if you stuck around and contributed here instead.
To stay compliant and avoid trademark issues:
- Be sure to include the original AGPLv3 license and clearly state in your README that your fork is based on Maybe Finance but is not affiliated with or endorsed by Maybe Finance Inc.
- "Maybe" is a trademark of Maybe Finance Inc. and therefore, use of it is NOT allowed in forked repositories (or the logo)
Performance Issues
With data-heavy apps, inevitably, there are performance issues. We've set up a public dashboard showing the problematic requests seen on the demo site, along with the stacktraces to help debug them.
https://www.skylight.io/app/applications/s6PEZSKwcklL/recent/6h/endpoints
Any contributions that help improve performance are very much welcome.
Local Development Setup
If you are trying to self-host the app, read this guide to get started.
The instructions below are for developers to get started with contributing to the app.
Requirements
- See
.ruby-versionfile for required Ruby version - PostgreSQL >9.3 (latest stable version recommended)
- Redis > 5.4 (latest stable version recommended)
Getting Started
cd sure
cp .env.local.example .env.local
bin/setup
bin/dev
# Optionally, load demo data
rake demo_data:default
Visit http://localhost:3000 to view the app.
If you loaded the optional demo data, log in with these credentials:
- Email:
user@example.com - Password:
Password1!
For further instructions, see guides below.
Setup Guides
- Mac dev setup
- Linux dev setup
- Windows dev setup
- Dev containers - visit this guide
One-click Install
Managed OpenClaw for Sure Finances
License and Trademarks
Maybe and Sure are both distributed under an AGPLv3 license.
- "Maybe" is a trademark of Maybe Finance, Inc.
- "Sure" is not, and refers to this community fork.
