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.