Solutions for common issues when running Finima. If your problem is
not listed here, check the backend logs with make docker-infra-logs for
error messages.
Symptoms: You enter your email on the sign-in page, see the "Magic link sent" confirmation, but never receive the email.
Possible causes and fixes:
-
APP__RESEND__API_KEYis not set. Finima sends real emails only when this key is configured. If you left it blank in your.envfile, the magic-link URL is printed in the backend terminal output instead. Look for a[DEV]log line containing/auth/verify?token=. Copy the full URL and paste it into your browser. -
Email is in your spam folder. Check your spam or junk folder for an email from "Finima" or the address configured in
config/auth.yamlunderauth.from_email. -
Rate limit reached. Finima limits magic-link requests to 5 per minute per IP address. Wait a minute and try again.
-
Invalid API key. Verify that the
APP__RESEND__API_KEYin your.envfile is correct. Log in to your Resend dashboard to confirm the key is active. The backend logs will show a Resend API error if the key is rejected. -
Domain not verified (403 Forbidden). If the backend logs show
"The ... domain is not verified", the sender domain inAPP__AUTH__FROM_EMAILhas not been verified in Resend. Either verify the domain at https://resend.com/domains, or useAPP__AUTH__FROM_EMAIL=Finima <onboarding@resend.dev>for local testing (delivers only to your Resend account email). -
Magic link opens a blank page or 404. The link URL is built from
APP__AUTH__PUBLIC_URL. If this is set to the wrong host (e.g.0.0.0.0or a backend address), the link will not reach the frontend. Set it to the frontend origin, e.g.APP__AUTH__PUBLIC_URL=http://localhost:5173for local dev orAPP__AUTH__PUBLIC_URL=https://finima.appfor production.
Symptoms: You import transactions but the category column is empty or shows generic values.
Possible causes and fixes:
-
Ollama is not running. Check with
make docker-infra-ps. If thefinima-ollamacontainer is not listed or is unhealthy, restart services withmake docker-infra-restart. -
No model has been pulled. Ollama needs a model downloaded before it can categorize anything. Run:
make download-model LLM=ollama
This downloads the default Gemma 4 model (several gigabytes).
-
Wrong Ollama URL. The backend expects Ollama at
http://localhost:11434. If you changed the port, updateconfig/llm.yamlunderllm.ollama.url. -
Check the LLM tab in Settings. Go to Settings > LLM and verify the connection status shows "Connected". If it shows "Disconnected", the backend cannot reach Ollama.
-
Re-categorize existing transactions. AI categorization runs at import time. Transactions imported before Ollama was available will not be retroactively categorized. Re-import the same file to pick up uncategorized transactions.
If the LLM provider is set to none, or neither the ollama nor
candle compile-time feature flag is enabled, no LLM is loaded. In
this mode:
- Tiers 0-2 (merchant lookup, pattern engine, semantic search) still categorize transactions normally, handling 80-95% of common transactions.
- Transactions that do not match any tier remain uncategorized (category = NULL).
- Recurring payment enrichment and insight generation are unavailable.
- Feed article summarization is unavailable.
This is graceful degradation by design -- the application remains fully functional for importing, viewing, and manually categorizing transactions.
How to detect no-LLM mode:
- In the UI, go to Settings > LLM. If the provider shows "None" and the connection status shows "Disabled", no LLM is configured.
Re-categorizing after enabling an LLM:
Transactions that remained uncategorized can be re-processed once a
real LLM is configured. Use the Categorize Uncategorized button
on the Transactions page, or call POST /api/transactions/categorize
programmatically.
Symptoms: You try to upload a bank statement and see an error message.
Possible causes and fixes:
-
File too large. The maximum upload size is 50 MB. If your statement is larger, split it into smaller date ranges.
-
Unsupported format. Finima supports CSV, TSV, OFX, QFX, QBO, QIF, XLS, and XLSX. Other formats (PDF, images, etc.) are not supported. Export a CSV from your bank's website instead.
-
MinIO is not running. File uploads are stored in MinIO before being processed. Check with
make docker-infra-psthat thefinima-miniocontainer is running and healthy. If not:make minio
-
MinIO credentials mismatch. If you changed
MINIO_ROOT_USERorMINIO_ROOT_PASSWORDin.env, make sure the matching values are inconfig/storage.yamlunders3.access_key_idands3.secret_access_key.
Symptoms: The dashboard loads but widgets show "No data yet" messages or zero values.
Possible causes and fixes:
-
No transactions imported yet. Dashboard data comes from your transaction history. Import at least one bank statement to see data populate.
-
Wrong date range. Some widgets show data for the current month. If all your transactions are from a different month, the current month will appear empty. Use the Transactions page to verify your data, then check the Budget or Flows pages which have month navigation.
-
No budgets set. The "Budget vs Actual" widget requires at least one budget entry. Go to the Budget page and create one or use Auto-Suggest.
-
No primary income account. The Upcoming Bills widget and some Flow calculations require at least one account to be marked as a primary income source.
Symptoms: You get signed out and redirected to the sign-in page frequently.
This is expected behavior. Access tokens expire after 15 minutes for security. The frontend automatically refreshes your session using a refresh token without requiring you to sign in again.
If you are being signed out completely (not just briefly), check:
-
Browser privacy settings. Some browsers or extensions block cookies or local storage, which prevents the refresh token from being stored.
-
Clock skew. If your system clock is significantly wrong, token validation may fail. Make sure your computer's time is synced.
Symptoms: Running make docker-infra fails, or containers
immediately exit.
Possible causes and fixes:
-
Port conflicts. Finima uses ports 3000 (backend), 5173 (frontend), 5432 (PostgreSQL), 9000/9001 (MinIO), and 11434 (Ollama). If another application is using one of these ports, the container will fail to start. Stop the conflicting application or change the port mapping in
docker-compose.yml.To find what is using a port:
lsof -i :5432
-
Not enough memory. Ollama in particular can require significant memory. Open Docker Desktop and increase the memory limit to at least 8 GB under Settings > Resources.
-
Check container logs. Run
make docker-infra-logsto see error output from all containers. For a specific container:docker compose logs postgres docker compose logs ollama docker compose logs minio
-
GPU driver issues (Ollama). The
docker-compose.ymlfile requests GPU access for Ollama. If you do not have an NVIDIA GPU, Ollama still works on CPU but you may need to remove thedeploysection from the Ollama service indocker-compose.yml.
Symptoms: The backend logs show errors about connecting to PostgreSQL, or pages fail to load with server errors.
Possible causes and fixes:
-
PostgreSQL container is not running. Check with
make docker-infra-ps. If it is not healthy, restart withmake docker-infra-restart. -
Password mismatch. The database password is set by the
POSTGRES_PASSWORDenvironment variable in.env(default:finima_dev). The backend readsdatabase.passwordfromconfig/database.yaml(overridable viaAPP__DATABASE__PASSWORD). Make sure the password in both places matches. -
Migrations have not been run. If you see errors about missing tables, run:
make migrate
-
Database volume is corrupted. As a last resort, run
make docker-infra-down && docker volume rm finima_pgdatathenmake docker-infra && make migrate. This deletes all data.
Symptoms: Pages take a long time to load, or AI categorization is very slow.
Possible causes and fixes:
-
Ollama model loading. The first request after starting Ollama takes longer because the model needs to load into memory. After the first request, subsequent categorizations are faster.
-
Increase Docker resources. Open Docker Desktop and allocate more CPU and memory under Settings > Resources.
-
Too many database connections. The default connection pool is 10 connections. If you see connection pool timeout errors in the backend logs, increase
database.max_connectionsinconfig/database.yaml. -
Large import files. Very large statement files (tens of thousands of transactions) take longer to process. Consider importing smaller date ranges.
Symptoms: Amounts show the wrong currency symbol or dates are in an unexpected order.
Possible causes and fixes:
-
Check Settings. Go to Settings > General and verify the currency and date format are set correctly. Select Save Preferences after making changes.
-
Clear browser cache. Preferences are cached locally. If your settings seem to revert, clear your browser's local storage for the Finima site and reload the page.
-
Per-account currency. Each account has its own currency setting. If a specific account shows the wrong currency, check the account's configuration on the Accounts page.
If you want to wipe all data and start over:
make clean-allThis command:
- Cleans all build artifacts.
- Stops all Docker containers.
- Deletes all Docker volumes, including the database and uploaded files.
After running this, start again from step 3 of the Quick Start guide.
To reset only the database without removing other data:
make docker-infra-down
docker volume rm finima_pgdata
make docker-infra
make migrateTo load sample data for testing:
make db-seedThis loads test seed data into the database. It only works in development and test environments (not production).
- Backend logs:
make docker-infra-logs - Container status:
make docker-infra-psormake docker-infra-health - Check configuration: Review the
config/*.yamlfiles for all server-side settings. - Quick Start guide: quick-start.md
- User Guide: user-guide.md