Back to blog
FinanceApril 17, 2026 17 min read

A Modern Finance + Algo-Trading Dashboard, at a Fraction of Last Year's Cost

Eighteen months of open-source maturation collapsed the stack. The before-and-after, the new line items, a worked cost model, and the honest places the cheap stack still breaks.

HJ
Hasan Javed
senior full-stack & ai engineer
STACK COMPRESSION · 2024 → 2026 · A FIELD GUIDE2024 · PAID MIDDLEWAREMarket data · Polygon Developer$199Warehouse · Snowflake / BigQuery$780Dashboard SaaS · Retool / Metabase$390Backtest compute · paid framework$520LLM research · frontier API$650Postgres + pgvector · RDS / Supabase Pro$240Hosting + observability$320SUBTOTAL$3,099 / mo≈ 40× cheaperDuckDB · R2 · NautilusTraderEvidence · Ollama · free tiers2026 · OSS + FREE TIERSMarket data · Alpaca free + Polygon PAYG$20Parquet lake · Cloudflare R2$11Query · DuckDB + Polars (OSS)$0Backtest · NautilusTrader (OSS)$0LLM research · Ollama + Haiku PAYG$24Dashboard · Evidence.dev (OSS)$0Hosting · Fly.io + Neon + Sentry free$11SUBTOTAL$66 / mo

A small quant shop asked me last week to price the same dashboard they paid about four thousand eight hundred dollars a month for in 2024. The new estimate came in under one hundred and forty, for the same data volumes, the same users, the same feature set. Most of that compression was not anyone’s cleverness. It was the patient substitution of paid middleware with open-source equivalents that were good-enough eighteen months ago and are production-grade now. The chart you can’t buy on a vendor slide is the chart of their own gross margins being quietly eaten by DuckDB, Parquet, NautilusTrader, and a handful of generous free tiers. What follows is the field guide I wrote for that team, with the numbers, the architecture, and — because nobody owes you a rosier picture than the truth — the honest places the cheap stack still breaks.

1 · Where $4,800 a month went in 2024

Before we celebrate the cheap new stack it is worth remembering what the expensive one looked like, because the muscle memory of a 2024 architecture is still in most of the tutorials on the internet. A typical finance-plus-algo-trading dashboard for a small shop — five strategies in research, twenty daily users, five hundred tickers tracked at one-minute resolution across about a year of history — had a stack that looked like this:

Market data (Polygon Developer + add-ons)$199 – $399
Managed cloud warehouse (Snowflake, BigQuery, or Timescale)$400 – $1,500
Hosted dashboard SaaS (Retool, Metabase Cloud, Hex)$200 – $500
Backtesting compute (burst CPU / a GPU hour or two)$300 – $800
LLM research calls for news, filings, memos$200 – $1,000
Managed Postgres + pgvector (RDS or Supabase Pro)$100 – $400
Hosting for app + workers (ECS + ALB)$150 – $300
Observability (Datadog, Sentry Team)$100 – $300
subtotal≈ $1,650 – $5,200 / mo
Representative 2024 monthly bill for a small quant dashboard, five strategies in research, twenty daily users.

The punchline of that table is not the total. The punchline is how many of those rows are middleware that the team did not specifically need — they paid for it because the paid path was the obvious path. Every one of those rows is now optional.

2 · What actually changed between mid-2024 and now

Five specific shifts made the compression possible. It is worth naming them because each one maps onto a row of the table above.

DuckDB grew up, and the lakehouse pattern came to the laptop

In 2023 DuckDB was a clever column store with a loyal following; by 2025 it was in-process SQL that outperformed most managed warehouses under one terabyte, read Parquet natively, streamed from S3-compatible object stores, and spoke Arrow to every analytics library in the modern Python stack. Combined with the Iceberg and Hudi table formats stabilising, you get a lakehouse on a laptop: ACID-ish writes, snapshot isolation, schema evolution, on your own cheap object store, for the price of a library dependency.

Cloudflare R2 and Backblaze B2 killed egress

Most of what a managed warehouse was charging for in 2024 was not storage — storage is a commodity — it was egress and compute bundled together. R2’s free egress and B2’s zero-cost egress to partner CDNs broke that bundle. At the volumes a dashboard actually moves, a Parquet lake on R2 costs somewhere between five and fifteen dollars a month, inclusive of egress. This is the single biggest line-item collapse in the entire stack.

NautilusTrader got serious

The event-driven backtester with a Rust core, which in 2023 needed patience and a taste for beta software, shipped stable releases through 2024 and 2025, added clean adapters for the retail brokers most small shops actually use, and acquired the unglamorous features — proper pyproject packaging, reliable docs, predictable upgrades — that separate a side project from a foundation. Paid backtesters are no longer the default choice for a small team.

Serverless pricing floors collapsed

Fly.io, Cloudflare Workers, and the Vercel free tier now cover the steady-state compute of an entire small dashboard — and the bursts as well, if the burst is a backtest that finishes in under a few minutes. The right way to think about hosting in 2026 is that a dashboard is free until it is successful, and paid after. That is the correct shape for small-team cost structure.

Open-weight LLMs became good enough for research

A 2024 research pipeline that summarised filings and news through the paid frontier APIs cost two hundred to a thousand dollars a month depending on volume. In 2026, a consumer GPU running an open-weight model for the bulk work plus a pay-as-you-go frontier call for the small fraction of prompts that actually need it brings the same workload under forty dollars. The bulk of research prompts — “extract the numeric guidance from this 10-Q” — are well within the envelope of a local model.

3 · The 2026 stack — line by line

What follows is not a reference architecture to be followed slavishly. It is a shape, with specific pieces named, that a small team can assemble in a weekend and run for the price of a takeaway lunch per month.

Market data — Alpaca (free) + Polygon pay-as-you-go$10 – $30
Object storage — Cloudflare R2 (Parquet lake)$5 – $15
Query engine — DuckDB / Arrow / Polars (OSS, in-process)$0
Backtesting — NautilusTrader (OSS, Rust core)$0
Dashboard — Evidence.dev or Streamlit (OSS, self-hosted)$0
LLM research — local Ollama + Haiku / Gemini Flash PAYG$20 – $45
Metadata DB — Neon or Supabase free tier$0 – $19
Hosting — Fly.io / Cloudflare Pages free + modest overage$0 – $12
Observability — Sentry free + BetterStack free$0
Domain + TLS$1
subtotal≈ $36 – $140 / mo
Representative 2026 monthly bill for the same dashboard — same five strategies, same twenty daily users, same five hundred tickers.

Every zero in that table is a row where a paid vendor used to stand. The work the vendor was doing is not gone — it just moved inside a library on your own box. That is the quiet trade the open-source ecosystem has been making, patiently, for the past two years.

4 · The architecture, in one page

The shape is simpler than any diagram drawn in Confluence in 2024 because there are fewer nameable services to arrange:

  • Ingestion. A small Python or Go worker pulls bars from the broker’s free feed (Alpaca for equities, native exchange WebSockets for crypto), writes Parquet files partitioned by ticker and day to an R2 bucket. Idempotent, no database involved.
  • Query. DuckDB runs in-process inside the dashboard backend. It reads Parquet files directly from R2 over HTTP, caches hot partitions in memory, and answers ad-hoc SQL against a year of minute bars in under a second. No managed warehouse exists anywhere in the system.
  • Backtesting. NautilusTrader runs strategies against the same Parquet lake — the data contract is shared. Results land in a separate DuckDB file committed to a results repository, queryable by the dashboard as if it were live data.
  • Dashboard. Evidence.dev compiles Markdown and SQL into a fast static site, or Streamlit serves an interactive app if you need real input controls. Either way, the app is a process that holds DuckDB and talks to R2 — it is not a fleet of services.
  • Research & memos. Ollama on a cheap GPU handles routine summarisation and tagging; the genuinely hard prompts are routed to Claude Haiku or Gemini Flash on a per-call budget guard, with the whole conversation logged to Postgres for replay and cost control.
  • Execution (optional). For shops that want to trade from the dashboard, a small Rust or Go service behind the broker’s order API — same pattern as any number of production routers — is added as the tenth box on the diagram.
appendix · stack.py — ingestion to query in 24 lines
# 1. Ingest: write Parquet partitioned by ticker and day to R2.
import polars as pl, s3fs, alpaca_trade_api as alp

fs = s3fs.S3FileSystem(
    endpoint_url="https://<acct>.r2.cloudflarestorage.com",
    key=R2_KEY, secret=R2_SECRET,
)

bars = alp.REST().get_bars("AAPL", "1Min", "2026-04-01", "2026-04-16").df
pl.from_pandas(bars).write_parquet(
    "r2://bars/ticker=AAPL/date=2026-04-16.parquet", use_pyarrow=True,
)

# 2. Query: DuckDB reads Parquet directly from R2, no warehouse.
import duckdb
con = duckdb.connect()
con.sql("INSTALL httpfs; LOAD httpfs;")
con.sql("SET s3_endpoint='<acct>.r2.cloudflarestorage.com';")

result = con.sql("""
    SELECT ticker, date_trunc('day', ts) AS d, AVG(close) AS avg_close
    FROM read_parquet('r2://bars/*/*.parquet')
    WHERE ts >= current_date - INTERVAL 30 DAY
    GROUP BY 1, 2
    ORDER BY 2 DESC
""").pl()   # Polars dataframe, ready to chart.
the entire data layer of a modern dashboard · no managed warehouse anywhere

5 · A worked cost model — 500 tickers, 20 DAU, one year

Abstract numbers are easier to believe when you multiply them out. The example throughout this essay is a representative small-shop workload:

  • Five hundred tickers tracked at one-minute resolution across US equity hours — roughly million rows per year.
  • Twenty daily active users running on average one hundred dashboard queries per day — ~ queries per month.
  • Five strategies in active research, each run as a full walk-forward sweep of roughly parameter combinations once a week.
  • A thousand LLM research calls per month, of which ninety percent are routine summarisation.

At those volumes, the 2026 bill works out as follows:

R2 · 1.2 TB Parquet, 40 GB/mo egress (free), ops ~6M≈ $11
Compute · Fly.io 1 shared-cpu 2GB VM + burst backtests≈ $9
Market data · Alpaca free tier + $20/mo Polygon top-up≈ $20
LLM research · 1,000 calls / mo (80% local, 20% Haiku/Flash)≈ $24
Metadata · Neon free tier (plenty for auth + user state)$0
Observability · Sentry + BetterStack free tiers$0
Misc · domain, TLS, status page≈ $2
subtotal≈ $66 / month
Worked cost model for the example workload. Most line items are at or near the free tier; the two that are not are data and LLM research.

That is roughly forty times cheaper than the 2024 baseline for the same dashboard. The variance in the number comes almost entirely from two rows: market data, which is a function of whether you need real-time and full-depth; and LLM research, which is a function of how much you lean on frontier models for the hard prompts.

6 · Where the cheap stack honestly breaks

A field guide that does not name its own limits is a sales brochure. Here is where the picture I have painted stops being true.

Real-time exchange-direct feeds

If the dashboard consumes Level 2 data, depth of book, or anything redistributed from SIP or a direct exchange feed, the data bill is governed by exchange licensing — not by your architecture. You will pay, and you will pay in thousands, not tens. No amount of DuckDB cleverness changes this. A dashboard for a retail-grade strategy or a research library on end-of-day, minute, or delayed tick data escapes this constraint entirely. A professional execution dashboard does not.

Sub-millisecond execution latency

The cheap stack is slow in one specific sense: it is built on consumer-internet primitives with variable latency. For any execution venue where the edge is measured in microseconds — HFT, market-making, latency arbitrage — the architecture described here is the wrong shape. Co-location, kernel bypass, FPGAs, and direct cross-connects have no cheap substitute.

Compliance and data residency

A dashboard that touches regulated flows — managing money for clients, handling KYC, producing auditable records for the SEC or FCA — is not primarily a cost-engineering problem, it is a compliance problem. The open-source substitutions above do not ship with SOC 2 reports, signed BAAs, or residency guarantees. In those environments the paid vendors are not expensive because they are slow; they are expensive because they take liability. Price the liability, not just the compute.

Support and shared responsibility

When DuckDB segfaults on a rare edge case — and it will — you are the support engineer. The same is true of every open-source row on the table. A small team with strong Python and SQL is fine. A team whose skill is elsewhere is paying a hidden bill every time the stack breaks. That bill can easily exceed what a managed vendor would have charged.

The “works on my laptop” failure mode

DuckDB is in-process. That is the source of its speed and its sharpest limit. When the dashboard grows past a single node of concurrent users, you will either shard the compute, move the heavy queries to a separate long-running process, or reach for a read replica of some sort. None of these are hard; all of them are work the managed vendor was quietly doing for you. Budget for it.

7 · The six-step recipe

If you are starting from scratch today, the ordering of the work matters more than the stack choices. A dashboard built in the wrong order will be expensive to re-cut later.

  • Start with Parquet on R2. Get ingestion writing partitioned Parquet to an object store on day one. This is the single decision that preserves every option you may want to exercise later — warehouses, lakehouses, OLAP engines — because they all read Parquet.
  • Use DuckDB + Polars for everything else. No managed warehouse. No pandas. Both decisions save an order-of-magnitude somewhere, and neither limits what you can express.
  • Backtest in NautilusTrader against the same lake. Sharing the data contract between research and live is the single biggest saving on research-to-production handover.
  • Ship the dashboard with Evidence.dev first. Markdown with SQL compiles to a static site, deployed for free, shareable by URL. Reach for Streamlit only when you genuinely need interactive controls.
  • Host on Fly.io or Cloudflare until it hurts. A single small VM covers tens of users. When a specific workload breaks the free tier, scale that specific workload — not the whole platform.
  • Route LLM calls by budget. Default to local for bulk work, frontier only where the prompt explicitly needs it, and log the cost per call to the same Parquet lake that holds everything else. Research cost is a dataset now, not a line item in Stripe.
A complex system that works is invariably found to have evolved from a simple system that worked.
John Gall, Systemantics, 1975

8 · What this actually means

Very little of this essay is invention. It is assembly. The compression happened because the open-source ecosystem quietly caught up in exactly the places the SaaS vendors had been printing money — columnar analytics, event-driven backtesting, static dashboards, object storage without egress tax, small language models that are good at the 80 percent of prompts you were paying frontier prices for. For a small quant shop or a solo operator, the 2026 stack is not just cheaper. It is also faster to change, because the substitutions are libraries in your repository and not contracts with someone else’s sales team. That is the real saving: the stack you can alter when your strategy alters.

The corollary is that the expensive stack is still correct for a specific kind of operator — regulated, high-frequency, multi-tenant at scale, needing shared-responsibility contracts on the critical path. If that is you, spend the money; you’re buying the right thing. If you are everyone else, the forty-times-cheaper number is not hype. It is the current price of the boring middle of the stack, and it is yours for the weekend of work it takes to assemble.

#devops#infrastructure#cost-engineering#duckdb#nautilustrader#parquet#python#trading#fintech
Subscribe

Get the next essay in your inbox.

Tuesday weekly. Mathematics, finance, and AI — written like an engineer, not a marketer.

Free. Weekly. One click to unsubscribe. Hosted on Buttondown.

Found this useful?
Share it — it helps the next person find this work.
XLinkedIn
the end · over to you

If this resonated, let's talk.

I help startups ship production-grade systems — fintech, AI, high-throughput APIs — from MVP to 100K users. If something here sparked an idea for your stack, I'd be glad to hear it.

Continue reading

All essays