Sure-Worker

Sure-Worker

Docker app from Yusseiin's Repository

Overview

Background worker (Sidekiq) for Sure, the self-hosted personal finance app. Install the main "Sure" template first. The worker runs bank syncs, CSV/PDF imports, daily market data, AI jobs and sends all emails (password resets, rule notifications). Without it, imports and syncs never complete. Use the SAME image tag, Secret Key Base, Active Record Encryption keys (Primary Key, Deterministic Key, Key Derivation Salt - if you set them), database settings, Redis URL and Storage path as the Sure container. Start it after Sure has finished its first boot (database migrations). This container is on the "sure-net" Docker network with postgres17_sure, redis_sure and Sure. Database Host and Redis URL are already set for them. Install order: postgres17_sure, redis_sure, Sure, Sure-Worker. Full step-by-step guide: https://github.com/Yusseiin/Unraid-templates/blob/main/docs/sure-setup.md SMTP settings only need to be set here: email is sent by the worker, not the web container. SMTP TLS Enabled must be exactly "true" for SMTPS (port 465); use "false" for STARTTLS on port 587.

Ask DeepWiki View performance data on Skylight Dosu Pipelock Security Scan

The Sure dashboard in two columns (cashflow, net worth, spending and outflows) beside the AI assistant answering a question about savings

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. Sure can be accessed from a browser, the macOS desktop app, the mobile app, API clients, and LLM agents. See Sure Clients for an overview.

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-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

Render expects each button target branch to have a render.yaml at the repository root. The branch-ready Blueprint files live in branches/<branch-name>/render.yaml in a separate repo and can be copied to each corresponding branch root.

Option What it deploys latest stable
Sure - No AI Sure web, Sidekiq worker, Render Postgres, and Render Key Value. AI tokens are intentionally blank. Deploy to Render Deploy to Render
Sure - Simple AI Sure with OpenAI-backed AI settings, pgvector-ready Postgres, Sidekiq, and Render Key Value. Render prompts for the OpenAI token. Deploy to Render Deploy to Render
Sure - External AI Sure with external assistant settings plus AlphaClaw, which manages the OpenClaw gateway on Render. Deploy to Render Deploy to Render

Run on PikaPods

Deploy on Hostim

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.

Requirements

The Docker network "sure-net", postgres17_sure, redis_sure and Sure.

Related apps

Details

Repository
ghcr.io/we-promise/sure:stable
Last Updated2026-11-11
First Seen2025-09-24

Runtime arguments

Network
sure-net
Shell
bash
Privileged
false

Template configuration

StoragePathrw

Must be the same path used by the Sure container.

Target
/rails/storage
Default
/mnt/user/appdata/sure/storage
Value
/mnt/user/appdata/sure/storage
Secret Key BaseVariable

Required. Must be identical to the value in the Sure container.

Target
SECRET_KEY_BASE
Encryption Primary KeyVariable

MUST be identical to the value in the Sure container. Set all three or none (leave blank only if blank there too).

Target
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY
Encryption Deterministic KeyVariable

MUST be identical to the value in the Sure container. Set all three or none (leave blank only if blank there too).

Target
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY
Encryption Key Derivation SaltVariable

MUST be identical to the value in the Sure container. Set all three or none (leave blank only if blank there too).

Target
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT
Database HostVariable

Same as the Sure container.

Target
DB_HOST
Default
postgres17_sure
Value
postgres17_sure
Database PortVariable

Same as the Sure container.

Target
DB_PORT
Default
5432
Value
5432
Database NameVariable

Same as the Sure container.

Target
POSTGRES_DB
Default
sure_production
Value
sure_production
Database UserVariable

Same as the Sure container.

Target
POSTGRES_USER
Default
sure_user
Value
sure_user
Database PasswordVariable

Same as the Sure container.

Target
POSTGRES_PASSWORD
Redis URLVariable

Same as the Sure container.

Target
REDIS_URL
Default
redis://redis_sure:6379/1
Value
redis://redis_sure:6379/1
App DomainVariable

Host name Sure is reached at (e.g. sure.example.com). Used to build links in emails.

Target
APP_DOMAIN
Self HostedVariable

Enables self-hosting features. Leave true.

Target
SELF_HOSTED
Default
true
Value
true
Assume SSLVariable

Same as the Sure container.

Target
RAILS_ASSUME_SSL
Default
false
Value
false
Force SSLVariable

Same as the Sure container.

Target
RAILS_FORCE_SSL
Default
false
Value
false
Email SenderVariable

Address emails are sent from (e.g. sure@example.com). Must be allowed by your SMTP server.

Target
EMAIL_SENDER
SMTP AddressVariable

SMTP server host name (e.g. smtp.example.com). Leave blank to disable email.

Target
SMTP_ADDRESS
SMTP PortVariable

465 for SMTPS (TLS Enabled = true) or 587 for STARTTLS (TLS Enabled = false).

Target
SMTP_PORT
Default
465
Value
465
SMTP UsernameVariable

SMTP login user name.

Target
SMTP_USERNAME
SMTP PasswordVariable

SMTP login password.

Target
SMTP_PASSWORD
SMTP TLS EnabledVariable

Exactly 'true' = TLS from the start (SMTPS, port 465). Anything else = STARTTLS when offered (port 587).

Target
SMTP_TLS_ENABLED
Default
true
Value
true
SMTP TLS Skip VerifyVariable

Exactly 'true' disables SMTP certificate verification. Last resort only.

Target
SMTP_TLS_SKIP_VERIFY
Default
false
Value
false
Exchange Rate ProviderVariable

Same as the Sure container.

Target
EXCHANGE_RATE_PROVIDER
Default
yahoo_finance
Value
yahoo_finance
Securities ProviderVariable

Same as the Sure container.

Target
SECURITIES_PROVIDER
Default
yahoo_finance
Value
yahoo_finance
Twelve Data API KeyVariable

Same as the Sure container.

Target
TWELVE_DATA_API_KEY
Market Data Sync TimezoneVariable

IANA timezone for the daily price import (e.g. Europe/Rome). Unknown names fall back to UTC. Use the same value in Sure and Sure-Worker. Values saved in Settings &gt; Self-Hosting take precedence.

Target
MARKET_DATA_SYNC_TIMEZONE
Default
UTC
Value
UTC
Market Data Sync TimeVariable

HH:MM (24h, in the Market Data Sync Timezone) for the daily price import, Monday to Friday. Use the same value in Sure and Sure-Worker.

Target
MARKET_DATA_SYNC_TIME
Default
22:00
Value
22:00
Market Data Sync EnabledVariable

1 = import security prices daily (Monday to Friday), 0 = off. Do not leave blank (blank means off). Values saved in Settings &gt; Self-Hosting take precedence. Use the same value in Sure and Sure-Worker.

Target
MARKET_DATA_SYNC_ENABLED
Default
1|0
Value
1
Assistant TypeVariable

Forces the AI assistant type for the whole instance. Blank = each family chooses in Settings &gt; Self-Hosting. builtin = in-app chat using the OpenAI fields. external = your own agent (also needs EXTERNAL_ASSISTANT_URL / EXTERNAL_ASSISTANT_TOKEN). mcp_only = no in-app chat at all (sidebar, toggle and mobile tab hidden), MCP stays available for your own agent; background categorization keeps working. Use the same value in Sure and Sure-Worker.

Target
ASSISTANT_TYPE
Default
|builtin|external|mcp_only
OpenAI Access TokenVariable

Same as the Sure container (AI jobs run in the worker).

Target
OPENAI_ACCESS_TOKEN
OpenAI ModelVariable

Same as the Sure container.

Target
OPENAI_MODEL
OpenAI URI BaseVariable

Same as the Sure container.

Target
OPENAI_URI_BASE
External Assistant URLVariable

Only for Assistant Type external: your agent's OpenAI-compatible chat endpoint, e.g. https://your-agent/v1/chat/completions. Use the same value in Sure and Sure-Worker.

Target
EXTERNAL_ASSISTANT_URL
External Assistant TokenVariable

Only for Assistant Type external: API token for your agent. Use the same value in Sure and Sure-Worker.

Target
EXTERNAL_ASSISTANT_TOKEN
External Assistant ModelVariable

Only for Assistant Type external: model name. Blank = openclaw/main. Use the same value in Sure and Sure-Worker.

Target
EXTERNAL_ASSISTANT_MODEL
LLM ProviderVariable

AI provider for chat and background AI jobs: openai (OpenAI or any OpenAI-compatible API such as Ollama) or anthropic (native Anthropic API, needs Anthropic API Key). Setting it here locks the choice on the Settings page. Use the same value in Sure and Sure-Worker.

Target
LLM_PROVIDER
Default
openai|anthropic
Value
openai
Anthropic API KeyVariable

Only for LLM Provider anthropic. Use the same value in Sure and Sure-Worker.

Target
ANTHROPIC_API_KEY
Anthropic ModelVariable

Only for LLM Provider anthropic. Blank = Sure's default Claude model. Use the same value in Sure and Sure-Worker.

Target
ANTHROPIC_MODEL
LLM Context WindowVariable

Token budget for OpenAI-compatible models. Blank = Settings page value or 2048. Raise it for larger local models (e.g. 8192). Use the same value in Sure and Sure-Worker.

Target
LLM_CONTEXT_WINDOW
OpenAI Request TimeoutVariable

Seconds per LLM request. Blank = Settings page value or 60. Raise for slow local models (e.g. 300 for Ollama on CPU). Use the same value in Sure and Sure-Worker.

Target
OPENAI_REQUEST_TIMEOUT
AI Response TimeoutVariable

Seconds the chat waits for a full answer before showing no response. Blank = Settings page value or 90 (minimum 30). Raise for slow local models. Use the same value in Sure and Sure-Worker.

Target
AI_RESPONSE_TIMEOUT
Vector Store ProviderVariable

AI document search. Blank = hosted OpenAI when an OpenAI token is set. pgvector = store embeddings in postgres17_sure (needs an embeddings endpoint below). Best set before the first start of Sure, as its table is created by a database migration. Use the same value in Sure and Sure-Worker.

Target
VECTOR_STORE_PROVIDER
Default
|pgvector|openai
Embedding URI BaseVariable

OpenAI-compatible embeddings endpoint for pgvector, e.g. http://ollama:11434/v1. Blank = OpenAI URI Base, then OpenAI. Use the same value in Sure and Sure-Worker.

Target
EMBEDDING_URI_BASE
Embedding ModelVariable

Embedding model name. Do not leave blank. Use the same value in Sure and Sure-Worker.

Target
EMBEDDING_MODEL
Default
mxbai-embed-large
Value
mxbai-embed-large
Embedding DimensionsVariable

Must match the embedding model (1024 for mxbai-embed-large). Do not leave blank or change after pgvector data exists. Use the same value in Sure and Sure-Worker.

Target
EMBEDDING_DIMENSIONS
Default
1024
Value
1024
Brandfetch Client IDVariable

Optional. Client ID from brandfetch.com for bank and merchant logos. Set it here rather than on the Settings page (a blank value here can clear a key saved there). Use the same value in Sure and Sure-Worker.

Target
BRAND_FETCH_CLIENT_ID