AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Access Random News Articles with Our Free Public API - Stay Informed and Ahead of Trends!
Developer toolsTypeScript · JavaScriptGitHub @nickatnightOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Loading comments.
Checking sign-in status.
🚀 MaaS - Musk as a Service
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Musk as a Service: a catalog of free, satirical tools about our Lord and Savior. No key, no signup. /s
The tools: News roulette, the Jet tracker, the Hype meter and DOGE since SNL. Every endpoint is documented at elonmu.sh/docs, where each one has a Send button that calls it live and shows the response.
One random news article about Elon Musk: elonmu.sh/news. The page is rendered on the server, so it works without JavaScript, and "Another one" spins again. The articles come from NewsAPI.
The same data is available as JSON:
# Retrieve a random article
$ curl --request GET \
--url 'https://elonmu.sh/api/news' \
--header 'accept: application/json'
Example 200 response:
{
"source": "Business Insider",
"title": "Wizards, horses, flip phones and AI: Elon Musk's 10 most colorful quotes from Tesla's investor day",
"description": "Musk joked about charging mishaps, hailed the complexity of the human brain, and voiced his fears about the rise of artificial intelligence.",
"url": "https://markets.businessinsider.com/news/stocks/elon-musk-tesla-investor-day-ai-electric-vehicles-self-driving-2023-3",
"urlImage": "https://i.insider.com/64007dd7ce4a630019955630?width=1200&format=jpeg",
"publishDate": "2023-03-02T11:37:41Z"
}
Example 200 response when NewsAPI fails or is unreachable (the service itself is healthy, so it still returns 200):
{
"error": "There was an error with NewsAPI. Please try again later."
}
Any other failure returns a 500 with the same { "error": "..." } shape.
description and urlImage can be null. An article from NewsAPI without
a source name, title, URL or publish date is skipped, never served.{ "error": "There was an error with request. Please try again later." },
still with a 200./news sends Cache-Control: no-store, because each load picks a new
article. When NewsAPI is down it still answers 200, with a short note.Every private-jet flight this year, on a globe, with the fuel bill: elonmu.sh/jet. The flights come from the public posts of @elonjet.net by Jack Sweeney on Bluesky.
The same data is available as JSON:
$ curl --request GET \
--url 'https://elonmu.sh/api/jet/flights' \
--header 'accept: application/json'
The response has year, updatedAt, attribution, flights (newest first)
and totals. It is cached for 60 seconds. If the flight data is unavailable,
it returns a 200 with { "error": "..." }, like the News API.
Daily views of the English Wikipedia article "Elon Musk" for the last year, drawn as a seismograph with the biggest spikes named: elonmu.sh/hype. The views come from Wikimedia's pageview API (users only, known bots excluded).
The same data is available as JSON:
$ curl --request GET \
--url 'https://elonmu.sh/api/hype' \
--header 'accept: application/json'
Example 200 response (days shortened):
{
"article": "Elon Musk",
"from": "2025-10-27",
"to": "2026-10-26",
"updatedAt": "2026-10-27T09:12:44.000Z",
"attribution": {
"label": "Wikimedia pageviews (en.wikipedia, users only)",
"url": "https://pageviews.wmcloud.org/?project=en.wikipedia.org&pages=Elon_Musk"
},
"days": [{ "date": "2025-10-27", "views": 19194 }],
"stats": {
"total": 8678483,
"median": 20803,
"peak": { "date": "2026-06-12", "views": 194434 }
},
"spikes": [{ "date": "2026-06-12", "views": 194434, "timesMedian": 9.3 }]
}
days is oldest first, in chart order. The jet tracker's flights is
newest first.from and to are the first and last days
Wikimedia actually returned, so to can be the day before yesterday early in
the UTC day. Days Wikimedia has no data for are left out, not zero-filled.stats.median is the middle day's views, a whole number. With an even
number of days it is the mean of the two middle days, rounded.spikes is the five busiest days, highest first, each at least 7 days from
any busier one. timesMedian is that day's views over the median, to one
decimal.{ "error": "..." }, like the News API. After one
good load, a failure serves the last good series instead. After a failure,
the server waits a minute before asking Wikimedia again.Dogecoin's price now against the minute he went on air hosting Saturday Night Live, 8 May 2021: elonmu.sh/doge. The live price comes from CoinGecko (no key needed). The page also has a slider for how much DOGE you held at showtime, from 10 to 10 million. It runs in your browser, and the API has no amount parameter.
The same data is available as JSON:
$ curl --request GET \
--url 'https://elonmu.sh/api/doge' \
--header 'accept: application/json'
Example 200 response:
{
"coin": "Dogecoin",
"snl": {
"at": "2021-05-09T03:30:00.000Z",
"usd": 0.67343,
"source": {
"label": "Binance DOGE/USDT, 1-minute open at showtime",
"url": "https://data-api.binance.vision/api/v3/klines?symbol=DOGEUSDT&interval=1m&startTime=1620531000000&limit=1"
}
},
"now": { "at": "2026-10-28T04:30:56.000Z", "usd": 0.079484 },
"changePercent": -88.2,
"thousandDollarsNow": 118.03,
"attribution": {
"label": "Data provided by CoinGecko",
"url": "https://www.coingecko.com/en/coins/dogecoin"
}
}
changePercent is (now ÷ SNL − 1) × 100, rounded to one decimal.
thousandDollarsNow is what $1,000 of DOGE bought at showtime is worth now,
rounded to the cent. Both are computed from the unrounded prices.snl never changes. CoinGecko's free history only goes back 365 days, so
the SNL price is a constant: the open of Binance's DOGE/USDT 1-minute candle
at 11:30 pm EDT on 8 May 2021, when the show went on air. snl.source.url
returns that candle. USDT is taken as USD.now.at is when CoinGecko last updated its price, not when you asked.Cache-Control: public, max-age=300). If
CoinGecko is unavailable and nothing has loaded yet, it returns a 200 with
{ "error": "..." }, like the News API, and Cache-Control: no-store.
After one good load, a failure serves the last good price instead. After a
failure, the server waits a minute before asking CoinGecko again.Requires Bun 1.4.4+ and a free NewsAPI key.
$ bun install
$ cp .env.example .env # then set NEWS_API_KEY
$ bun run dev # http://localhost:8080, restarts on changes
$ bun test
$ bun test tests/jet/parse.test.ts # one file
$ bun test -t 'pairs a takeoff' # tests whose name matches
$ bun run format # apply Biome formatting
$ bun run check # format check, lint, typecheck, tests (what CI runs)
Two scripts are run by hand, offline:
$ bun scripts/geocode-places.ts # when the server logs "jet: unknown place"
$ bun scripts/render-teaser-earth.ts # after changing TEASER_VIEW or TEASER_SIZE (needs ffmpeg)
See ARCHITECTURE.md for how the code fits together.
The landing page at / is plain server-rendered HTML with no build step:
src/views/index.ejs, one stylesheet (src/public/static/css/main.css) and
three small vanilla scripts. src/public/static/js/main.js runs the scroll
reveal, src/public/static/js/hero.js (an ES module) plays the launch clip,
crossfades into the cruise loop and runs the pause toggle, and
src/public/static/js/legacy-anchors.js sends old /#get-api and /#errors
links on to /docs. The API docs at /docs load
src/public/static/js/console.js for their Send and Copy buttons. Static
files are cached for a year, so templates
reference them through asset('static/...'), which appends a hash of the file's
contents to the URL.
Production runs on Render as a Docker web service, built
from the Dockerfile in this repo. Merging to main deploys automatically once
CI passes, and Render health-checks /healthz (which never calls NewsAPI).
To run the production image locally:
$ docker build -t elonmush .
$ docker run --rm -p 8080:8080 -e PORT=8080 --env-file .env elonmush
$ curl localhost:8080/healthz
For fun 🤡...and to ramp up on TypeScript/Node/ExpressJS. This API is basically a thin wrapper around NewsAPI, and runs on Render.
Enjoy