buzzromainandClaude Opus 5 0d0003b032 fix(onchain-wallets): show linked wallets on the accounts page, and drop the tracking row on unlink (#3136)
Two gaps in #3081 after it merged, both raised there by @jjmata's review of
#2191 — credit to that PR for identifying them.

**Linked wallets were invisible on /accounts.** The feature creates real Sure
accounts and they count towards net worth, but the accounts page never showed
them: `Account.manual` excludes anything carrying a provider link, and unlike
the twenty other providers there was no on-chain section to claim them. A
family whose only connection was a wallet saw the empty state on the one page
meant to list their accounts. The controller now loads the items, the view
renders them, and the empty-state condition counts them.

The card is rendered by name rather than as a collection, because the model's
default partial slot is already the provider settings row; renaming it would be
the tidier convention but costs eight locale files of churn for a follow-up fix.

**A generic unlink left the tracking row behind.** The dedicated disconnect
flow is careful, but `AccountsController#unlink` destroys the AccountProvider
directly, and an OnchainWalletAccount holds that link rather than being held by
it. Orphaned, it stops syncing — the syncer only reads linked rows — while its
partial unique index still holds the (item, chain, address, asset) slot, so
linking that same asset again would collide with a row nothing displays. It is
destroyed with its link now, following the CoinStats precedent in the same
model, with a guard against the recursion that precedent lacks. The regression
test is the one asked for explicitly: the Sure account and its holdings survive
as manual while the tracking row and the provider link go.

**The card only renders accounts the viewer may see.** Found in review of this
branch. An item is surfaced as soon as ONE of its accounts is accessible, so
rendering them all showed a member given access to one wallet account the names
and balances of the others. Reproduced before fixing, with two real addresses
under one item and a member shared into only one: the unshared account's name
appeared on /accounts. Non-admins now get the accessible subset and the address
count derives from it; admins keep the whole item, which is the rule
visible_provider_items already applies.

That pattern is not specific to this card — six existing providers pass
`item.accounts` unfiltered to the same partial, which filters nothing. In the
same reproduction the unshared name appeared twice, once from a CoinStats card
over the same accounts. Raised separately for the maintainers; only this card
is changed here.

Both figures are computed on the item off the preloaded associations and
prepared per card by the controller, the way `_coinstats_sync_stats_map`
already is: a first attempt did it in the template with a `linked` scope, which
opened a fresh relation and cost a query per row. Measured on /accounts with 1
then 5 wallet items: 52->79 queries became 50->69, so 6.75 per extra item
became 4.75.

Verified beyond the suite: a real Bitcoin address linked, then both flows
driven over real HTTP — `GET /accounts` renders the card, and
`DELETE /accounts/:id/unlink` leaves the account behind reporting `manual:
true`. Integration parity was checked rather than assumed: on-chain now appears
everywhere CoinStats does, the nightly family sync picks it up through its own
reflection over `*_items` associations, and it is already exposed to the mobile
client via /api/v1/accounts and to /api/v1/provider_connections.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:39:51 +02:00
2024-02-02 09:05:04 -06:00
2024-02-02 09:05:04 -06:00
2024-02-02 09:05:04 -06:00
2025-05-20 13:31:05 -05:00
2024-02-02 09:05:04 -06:00
2024-08-23 10:06:24 -04:00
2026-06-15 23:29:36 +02:00
2024-02-02 09:05:04 -06:00
2026-06-15 23:29:36 +02:00
2024-02-02 09:05:04 -06:00
2025-09-24 00:19:51 +02:00
2026-04-13 13:44:37 +02:00
2024-02-02 09:05:04 -06:00
2026-08-12 02:49:41 +02:00
2026-06-05 15:16:41 +02:00

Ask DeepWiki View performance data on Skylight Dosu Pipelock Security Scan

sure_shot

Deutsch | Español | Français | 日本語 | 한국어 | Português | Русский | 中文

Sure: The personal finance app for everyone

Get involved: DiscordWebsiteIssues

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 20212022 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 didnt 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. Youre free to fork it under the AGPLv3 license — but wed 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-version file 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

One-click Install

Run on PikaPods

Deploy on Railway

Managed OpenClaw for Sure Finances

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.

Alt

S
Description
No description provided
Readme AGPL-3.0
149 MiB
Languages
Ruby 77.5%
HTML 12.9%
Dart 5.7%
JavaScript 3.1%
Rust 0.3%
Other 0.2%