Open-source tools for European passive investors. Filter UCITS ETFs, run the numbers, and understand what you actually own.
Indexfolio is a free, open-source toolkit for navigating passive investing in Europe. An ETF screener that actually understands UCITS, accumulating vs distributing funds, TERs, domiciles, and all the other things that matter to EU retail investors. No account. No paywall. No upsell.
Built first for Portugal. Expanding to the rest of the EU as the project grows.
| Tool | Status | Description |
|---|---|---|
| ETF Screener | Live | Filter UCITS-compliant ETFs by TER, domicile, accumulating/distributing, fund size, asset class |
| Tax Calculator | Planned | After-tax projections using actual country tax rules, not generic estimates |
| Portfolio Overlap Analyser | Planned | See what you actually own when combining multiple ETFs |
| Knowledge Graph | Planned | An interactive map of how investing concepts connect |
graph LR
subgraph vercel["βοΈ Vercel"]
Web(["Next.js 16\nfrontend"])
end
subgraph railway["π Railway"]
API(["Fastify v5\nREST API"])
end
subgraph neon["ποΈ Neon"]
DB[("PostgreSQL\nPrisma 6")]
end
subgraph upstash["β‘ Upstash"]
Cache[("Redis\ncache")]
end
Web -- "REST" --> API
API -- "queries" --> DB
API -- "cache" --> Cache
| Layer | Tech |
|---|---|
| Frontend | Next.js 16, Tailwind CSS, shadcn/ui |
| API | Fastify v5, Zod, TypeScript strict |
| Database | PostgreSQL (Neon), Prisma 6 |
| Cache | Redis (Upstash) |
| Monorepo | Turborepo, pnpm workspaces |
| Infra | Vercel (web), Railway (API) |
| Testing | Vitest |
Prerequisites: Node.js 20+, pnpm, Docker
# 1. Clone and install dependencies
git clone https://github.com/aravindasiva/indexfolio.git
cd indexfolio
pnpm install
# 2. Set up the API environment
cp .env.example apps/api/.env
# 3. Start Postgres and Redis
pnpm docker:up
# 4. Run migrations and seed ETF data
pnpm --filter @indexfolio/api prisma:migrate
pnpm --filter @indexfolio/api prisma:seed
# 5. Start everything
pnpm dev| Service | URL |
|---|---|
| Web | http://localhost:3000 |
| API | http://localhost:3001 |
| API docs (Swagger) | http://localhost:3001/docs |
To stop: pnpm docker:down
PRs are welcome. Read CONTRIBUTING.md before opening one - it is short and covers everything you need.
The most valuable contribution right now is a country tax module. If you live in an EU country and can verify your country's ETF tax rules against official government sources, that is the thing that helps the most people. Check the open issues for the spec.
Got questions or ideas? Drop them in GitHub Discussions. Issues are for bugs and concrete feature requests only.
If this is useful to you, a star helps other investors find it.
Open your PR to dev (never main). Here is what happens next:
flowchart TD
PR(["π¬ Open PR β dev"]):::blue --> CI["π§ͺ CI Suite\nformat Β· lint Β· typecheck Β· test Β· build Β· SonarQube"]:::yellow
CI -- "β fails" --> Fix(["π§ fix it and push again"]):::red
Fix --> CI
CI -- "β
passes" --> Review(["π maintainer reviews"]):::blue
Review -- "approved" --> Merged(["merged to dev β
"]):::blue
Merged --> Bossman{{"π€ Bossman\ndetects what changed"}}:::gray
Bossman -- "API files changed" --> Staging(["π’ API β Railway staging"]):::green
Bossman -- "web files changed" --> Preview(["π web β Vercel preview"]):::green
Staging & Preview -- "stable" --> Main(["dev β main\nmaintainer's call"]):::blue
Main --> Prod(["π API β Railway prod + web β Vercel prod"]):::purple
classDef blue fill:#dbeafe,stroke:#3b82f6,color:#1e40af
classDef yellow fill:#fef9c3,stroke:#eab308,color:#713f12
classDef red fill:#fee2e2,stroke:#ef4444,color:#991b1b
classDef green fill:#dcfce7,stroke:#22c55e,color:#166534
classDef gray fill:#f3f4f6,stroke:#9ca3af,color:#374151
classDef purple fill:#f3e8ff,stroke:#a855f7,color:#6b21a8
Once your PR is green and approved, the rest is automatic. Deployments to staging happen on merge to dev, and production happens when dev gets merged to main.
- TypeScript strict is on. No
any, no bullshit workarounds. If you are fighting the types, rethink the approach. - New logic needs tests. Feature? Write tests. Bug fix? Write a regression test.
- The bar only goes up. A PR that adds something useful but weakens types or skips tests will not land. That is not gatekeeping, it is just how a solo-maintained project stays alive.
Full details in CONTRIBUTING.md.
Thanks go to these wonderful people (emoji key):
cxx π» π π€ π π§ π£ |
Indexfolio is free and always will be. Running costs come out of pocket (hosting, DB, Redis - roughly $10/month).
If it is useful to you and you want to help keep it running:
- GitHub Sponsors - recurring support via GitHub
- Ko-fi - one-time or recurring
All support goes to infrastructure. The project will never be monetised.
Educational information and calculations only. Nothing here is financial advice. Make your own decisions. Consult a qualified professional if you need one.
MIT - use it, modify it, build on it.