Skip to content

aravindasiva/indexfolio

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

59 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Indexfolio

Open-source tools for European passive investors. Filter UCITS ETFs, run the numbers, and understand what you actually own.

CI Quality Gate TypeScript License: MIT PRs Welcome GitHub Stars

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.


πŸ—‚οΈ What's here

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

πŸ—οΈ Architecture

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
Loading

πŸ› οΈ Stack

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

πŸš€ Run it locally

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


🀝 Contributing

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.

How a contribution flows

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
Loading

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.

What we care about

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


✨ Contributors

Thanks go to these wonderful people (emoji key):

cxx
cxx

πŸ’» πŸš‡ πŸ€” πŸ“– 🚧 πŸ”£

πŸ’™ Support

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:

All support goes to infrastructure. The project will never be monetised.


⚠️ Disclaimer

Educational information and calculations only. Nothing here is financial advice. Make your own decisions. Consult a qualified professional if you need one.


πŸ“„ License

MIT - use it, modify it, build on it.

About

Free, open-source toolkit for EU passive investors. ETF screener, tax calculators, portfolio tools. Not financial advice.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

  •  

Contributors