Inspiration

I'm a college student, and I noticed that I don't read the news. Not because I don't care, but because most business and market news is written for people who already know the jargon, sits behind paywalls, or arrives as a wall of alerts. Meanwhile the facts that actually touch my life (what the Fed did with interest rates, why prices rose, which product just got recalled, which companies are making or losing money) are sitting in free public records.

I wanted the feel of a swipe feed (short, one idea at a time) but for the news that matters to my money and my life, written in plain words, with the receipts attached. The rule I set from day one: informational only, never advice, and every card shows where it came from.

What it does

Element is a business and market news app for busy everyday people. It runs on the web and on phones from one codebase.

  • A swipe feed of 2-3 sentence cards with Trending, Latest and For you tabs. Swipe right to like and left to dislike, or use the buttons or the arrow keys.
  • Brief: a daily and weekly digest with an about-250-word summary, a Markets section, and deeper coverage of the most important topics.
  • Following: follow a topic, company or source and get the newest relevant stories, including updates and different angles on stories you already follow.
  • Search that understands similar words and typos and ranks by what is trending.
  • A Numbers strip (rates, inflation, jobs, oil) where green, red and gray arrows show whether a change is generally good, bad, or neither for households.
  • Everything works without an account. Your choices are saved on your device and merge into your account if you sign in.

Every card shows its source link, an "AI-generated summary" label when a model wrote it, and "Informational only ยท Not investment advice."

How I built it

  • App: Expo (React Native) with Expo Router, one codebase for web, iOS and Android. Hosted on Cloudflare Pages.
  • Back end: Supabase (Postgres). Private schemas hold raw items and cards; only a small api schema of read-only functions is exposed to the app.
  • News pipeline: a script pulls public records from nine sources: SEC filings, the Federal Reserve, BEA, FRED, the Federal Register, CPSC recalls, USGS, NASA and Wikipedia. A model writes each card, then a validator checks it before it can be published.
  • Free-tier AI: Gemini Flash-Lite writes, with Groq and a plain template as fallbacks, so the app never depends on one provider.
  • How I worked: I managed a small team of AI agents (Claude, Kiro, Codex and Gemini) with a written plan, an editorial "report card," and a running handoff log, so anything one model dropped another could pick up.

The math behind the feed

Freshness uses a half-life, so a story's weight halves every $h$ hours:

$$ w(t) = 2^{-t/h} $$

The Trending score combines importance $I$ and freshness; the Following feed ranks followed items above related ones, then by that decayed score. When you react to cards, the cards still waiting in your queue are re-ranked by your taste, and the queue depth grows with how confident we are about you:

$$ \text{ahead} = \operatorname{clamp}\bigl(3 + \operatorname{round}(4c),\; 3,\; 7\bigr), \qquad c \in [0, 1] $$

For search, each matched word gets a quality weight $q$ (exact word $1.0$, prefix or stem $0.8$, synonym $0.6$, typo $0.5$, source name only $0.25$), and weak matches are dropped before cards are ordered by trending score. On simulated readers, the For you ranking improved precision@10 from $0.457$ to $0.474$ and NDCG from $0.524$ to $0.542$.

Trust rules enforced in code

  • The AI only sees text that is licensed for summarizing.
  • Every number in a card must appear in its source text.
  • Advice words ("buy", "sell", "should") get a card rejected.
  • Copy limits: at most 10 consecutive words from filings.
  • No publisher images and no stock prices.
  • An editorial report card scores each card (topic fit, plain headline, no repeats, complete key points). Cards that don't fit are fixed or hidden, never deleted.

Challenges

  • Keeping it trustworthy while using AI. Models like to sound confident. The validator, the labels and the "every number must be in the source" rule were the hardest and most valuable part.
  • Rate limits and running out of credits. Free tiers have small limits (Groq allows about 8,000 tokens a minute), and one of my agent tools hit its monthly limit during the final stretch. Splitting work into small jobs on separate files, with a handoff log, let other models take over.
  • A blank-page deploy. Building from a different folder bundled two copies of React and also put the fonts in a folder that Cloudflare silently skips. I found it by testing on a preview address, fixed the build script, and made "build only from the main folder, test on a preview first" a rule.
  • Gesture bugs. Swipes were ending as taps and opening the detail sheet. I fixed it by ignoring taps that follow movement or a swipe, and cards that were swiped can no longer open it.
  • Honest limits. The news supply is limited by the calendar (no new filings on weekends), and I chose a smaller, cleaner feed over padding it with low-value items.

What I learned

  • Plain language is a feature: writing at an everyday reading level forced the facts to come first.
  • Guardrails you can test beat promises. Each trust rule is a test, so it can't quietly regress.
  • Managing AI agents is like managing a team: clear file ownership, small jobs, written handoffs, and a human checking the work.
  • Ship to a preview first, and keep a log. It saved the final hours.

What's next

  • Email briefs with one-click unsubscribe (built and tested offline; needs an email-service key to go live).
  • More market sources and a larger feed, with the editorial report card gating every card.
  • Saved stories, story-update alerts, and push notifications for the daily Brief.

Look at the Code: https://github.com/AndrewPatton27/element/

Built With

Share this project:

Updates