DecisionsScope & Technical Decisions

Scope & Technical Decisions

This page documents intentional decisions made during development — what was built, what was left out, and why.

AI Chat excluded from v1

Elfa’s elfa.chat() requires their Grow plan ($290/month). During development this was discovered when the endpoint returned:

“The AI Chat (Ask Elfa) endpoint requires a Grow or Pay-as-you-go plan.”

Rather than shipping a feature I couldn’t test end-to-end, I scoped it to v2. The route is scaffolded — it just needs a plan upgrade to activate.

Cache TTL set to 30 minutes (not 5)

Initial TTL was 5 minutes. Usage logs from Elfa’s dev portal showed trending-tokens being called every 7–8 minutes — burning credits faster than needed. Raising TTL to 30 minutes drops estimated usage from ~29 credits/day to ~10–15, keeping the 1,000 monthly credits safe.

Upstash QStash instead of BullMQ

The job posting mentions BullMQ/RabbitMQ. Those require a long-running process to listen for jobs. Vercel serverless functions spin up per-request and shut down — incompatible with a persistent queue worker. Upstash QStash is the serverless-native equivalent: HTTP-based, no persistent connection needed.

lightweight-charts instead of TradingView Charting Library

TradingView’s advanced charting library requires a formal approval process (application, review, access grant). For a portfolio project with time constraints, lightweight-charts is the practical alternative — it’s open-source, published by the same team, and covers the core use case (candlestick chart + data overlay).

skills/ folder in api and app

Both repos contain a skills/ directory holding Elfa skill definition files. These are configuration artifacts that map API capability boundaries — not runtime business logic. They don’t affect deployment but are version-controlled alongside the code for traceability.

jsconfig.json in app (not TypeScript config)

The app repo uses jsconfig.json for path alias resolution rather than a strict tsconfig.json. This is a deliberate lightweight choice — the project uses JavaScript with JSDoc-style types where needed, keeping setup friction low while still getting IDE autocomplete and alias support.