Firefly III — retired for daily banking¶
Do not use Firefly III as the household ledger. Patelco does not sync through SimpleFIN, and Budgeteer is the product: Budgeteer setup.
These charts remain in GitOps only until Budgeteer has an in-cluster Patelco sync. Then remove fireflyiii/ks.yaml and firefly-importer/ks.yaml.
The rest of this page is leftover installer notes.
URLs¶
| Service | Host | Ingress |
|---|---|---|
| Firefly III | https://firefly.${DOMAIN_0} |
external (Cloudflare Tunnel) |
| Data Importer | https://firefly-import.${DOMAIN_0} |
internal (LAN) |
Manifests¶
| Path | Role |
|---|---|
finance/fireflyiii/ |
TrueCharts fireflyiii chart (CNPG + Valkey + cron). Image overridden to fireflyiii/core:version-6.6.6 because the chart is still on 6.2.21 and Data Importer 2.3.x requires >= 6.6.0. |
finance/firefly-importer/ |
app-template + docker.io/fireflyiii/data-importer:version-2.3.4 |
TrueCharts does not ship the importer (installation notes).
APP_KEY and STATIC_CRON_TOKEN are generated and remembered by the Firefly chart.
| Variable | Purpose |
|---|---|
FIREFLY_III_ACCESS_TOKEN |
Firefly PAT for the Data Importer (Options → Profile → OAuth) |
After adding or rotating it: clustertool encrypt and clustertool cluster genconfig, then commit. Do not put the token in the importer HelmRelease as plaintext.
Cloudflare Tunnel¶
After Flux creates the Firefly Ingress:
- Zero Trust → tunnel → Public Hostname
- Hostname:
firefly.${DOMAIN_0} - Service: same HTTPS target as other external apps (nginx-external)
- Confirm DNS CNAME for
fireflyon theDOMAIN_0zone → tunnel
The importer stays on internal ingress. Do not put SimpleFIN tokens on a public hostname.
Bootstrap¶
- Open
https://firefly.${DOMAIN_0}and create the first user (you). - Options → Remote access and tokens → Personal Access Tokens — create a token named
data-importer(direct URL:https://firefly.${DOMAIN_0}/profile/oauth). Copy it once. Do not use the command-line token. Firefly 6.6.0+ invalidates older PATs and moved this off the Profile OAuth tab. - Open
https://firefly-import.${DOMAIN_0}on LAN. - Paste the token when the importer asks (or set
FIREFLY_III_ACCESS_TOKENinclusterenv.yamllater, thenclustertool encrypt+clustertool cluster genconfig). - Importer should already know
FIREFLY_III_URL(http://fireflyiii.finance.svc.cluster.local:10082) andVANITY_URL(https://firefly.${DOMAIN_0}).
SimpleFIN (US bank sync)¶
The importer's US live path is SimpleFIN Bridge ($1.50/mo or $15/yr). Search institutions first: supported institutions.
| Institution | Role | Expectation |
|---|---|---|
| Patelco | Daily banking | Best shot at full transactions. Link this first. |
| Fidelity | Old 401k + 529s | Often balance-only. NetBenefits vs brokerage may be two connections. |
| Empower | Current 401k | Same as Fidelity. |
| Chase | Mortgage | Liability if MX exposes it; importer liability mapping has been flaky. |
| HealthEquity | HSA | Plan on CSV from the portal. Aggregators often fail here. |
Setup:
- Create a SimpleFIN Bridge account and connect Patelco.
- Confirm transactions appear in the SimpleFIN dashboard.
- Create an app connection / claim URL and finish the import in the Data Importer (SimpleFIN tutorial).
- Save the importer config JSON if you want scheduled re-imports.
- Then try Fidelity, Empower, and Chase. HealthEquity: export CSV from the HSA portal and import that file.
Optional later: put SIMPLEFIN_TOKEN in clusterenv.yaml so the importer does not ask every time.
Lunch Flow is the paid backup if SimpleFIN misses Fidelity/Empower (Fidelity listing).
HealthEquity CSV¶
- Log into HealthEquity → export cash / investment activity as CSV.
- Data Importer → file import → map date, amount, description.
- Use a stable
external_id(or Firefly's duplicate detection) so re-uploads do not double-post.
Observe reconcile¶
flux get kustomization fireflyiii firefly-importer -n flux-system
flux get helmrelease fireflyiii firefly-importer -n finance
kubectl get cluster,pods,ingress -n finance
kubectl describe helmrelease fireflyiii -n finance
Never kubectl apply these resources — GitOps only.