惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
T
ThreatConnect
SecWiki News
SecWiki News
F
Future of Privacy Forum
AWS News Blog
AWS News Blog
C
Cisco Blogs
A
Arctic Wolf
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
V2EX
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
NISL@THU
NISL@THU
Microsoft Azure Blog
Microsoft Azure Blog
量子位
The Hacker News
The Hacker News
Stack Overflow Blog
Stack Overflow Blog
Security Latest
Security Latest
M
Microsoft Research Blog - Microsoft Research
Google Online Security Blog
Google Online Security Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
InfoQ
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Troy Hunt's Blog
F
Fox-IT International blog
S
Security @ Cisco Blogs
博客园 - 司徒正美
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Comments on: Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 最新话题
GbyAI
GbyAI
Project Zero
Project Zero
腾讯CDC
T
Tailwind CSS Blog

Hacker News: Show HN

Show HN: StartPageHQ – turn the browser new tab into a dashboard Show HN: I made Pokémon but with real animals in the real world HypeCheck — Is Your Supplement Legit or Just Hype? GitHub - yamafaktory/hypergraph: Hypergraph is a data structure library to create a directed hypergraph in which a hyperedge can join any number of vertices. Show HN: YourMemory, persistent memory layer with temporal reasoning for agents CloudPostOffice — Simplest way to send and receive messages UUTA — A calm notebook for showing up AI API Pricing Calculator — Compare Costs Across Providers GitHub - scosman/cursed_browser: True AI-Native Browser — a VLM reads the HTML and hallucinates the page. Linear Chess Show HN: Browser-based Glider Sim Next Train GitHub - xfoa/Impatience: A library for instrumentation of event-to-event latency over a network GitHub - bitomule/musts: The validation loop that stops AI coding agents from claiming work is done before it actually is. Feynman - AI research assistant SynapCores — the AI-native database GitHub - erikshelley/complete-family-tree-viewer: A webpage for viewing all of a person's family tree at once GitHub - Noumenon-ai/AutoMaxFix: Controlled AI repair loop. Audit → Reproduce → Patch → Test → Report. Safety boundaries most AI agents skip. GitHub - JosephRedfern/plonk: Python interpreter at your fingertips Open Satchel — A free local-first PDF editor. Show HN: Hackobar – One feed for AI news GitHub - ghostchat-dev/widget: ~10KB chat widget. Zero cookies. Zero tracking. Fully open source. tiltbump X posts as clean Markdown for LLMs Symbol Combos — Cute Symbols, Kaomoji & Aesthetic Emojis to Copy GitHub - SellswordSoftware/justbookmarks: A simple desktop bookmark manager that uses the Netscape Bookmark HTML format so you can keep one browser-independent source of truth. SailWP. WordPress without the weight. Show HN: Widget Cast – Video Widgets for iOS PhoneDiffusion App - App Store Show HN: NanoApps: Run custom homebrew apps on iPod nano 7th generation Breadboard Knockout GitHub - elixir-volt/volt: Elixir-native frontend build tool — dev server, HMR, and production builds for JavaScript, TypeScript, Vue SFCs, and CSS. No Node.js required. Show HN: GuideOS – A radar-first, off-grid navigation kernel for edge robotics State lives on disk, not in chat Show HN: My biggest solo-project: Game engine with its own programming language MarketChacha | Stock Trading Community for Real Market Discussion GitHub - dmitryAQA/playwright-bdr-template Kubernetes, explained — interactive walkthroughs Show HN: Proj – organize your coding projects with categories and one-key CD Show HN: I made a compiler/VM for untrusted scripts Show HN: Stumpy – StumbleUpon Re-Created Show HN: Reward Is Not Reinforcement Until Admitted GitHub - dominikhei/cardamon: Cardamon is a cleanup tool for Prometheus that collects unused metrics from Grafana and Prometheus and generates drop statements for them. GitHub - NavodPeiris/grizzlars: High-performance DataFrame library written in C++ with Python bindings. Peakedin - LinkedIn's finest moments, curated weekly Planetensuche GitHub - cnemri/awesome-gemini-omni: A curated list of awesome Google Gemini Omni prompt guides, interactive platforms, and creative showcases. Show HN: An open-source, interactive AI engineering syllabus (1,100 papers) Show HN: I Built a Debugging Challenge for the AI Coding Age HTML Deployer: 1-Click AI Code To Website Publisher - Chrome 应用商店 GitHub - alkait/WhatsKept: Searchable, agent-queryable WhatsApp history from an iOS backup — a single Go binary. Geomatic | Tiny Volt Show HN: SenseCollect – Web data extraction made simple GitHub - feers77/iasql: A new implementation of SQL for IA purposes, using postgresSQL and Karpathy wiki-llm as inspiration. Kubernetes Study Path — From kubectl to a Production Cluster GitHub - octelium/cordium: Open-source sandbox platform with identity-based secretless infrastructure access for developers and AI agents on Kubernetes Play Doom with friends in your browser. You decide when you receive ForwardPass! (experimental) GitHub - jacksonsolid/Bytery fx.leftium.com GitHub - skorotkiewicz/cadence: $$hi Small marker tracking for source files. GitHub - nikitph/yieldos Show HN: Live AI music sequencing agent SaveNeighbor | Local help from people you trust drea: podcast ad blocker App - App Store JS Crossword GitHub - jake-stewart/tuie: A rich, performant TUI library for Rust. GitHub - AlexWasHeree/NoteCast: Local note engine that uses LLM to build and evolve a knowledge graph stocks.sjer.red — long PC parts RocketGraph — Never look at logs again Show HN: Replacing a 3.4MB video with 40kb of GSAP Show HN: Lightweight, OpenSource, zero-dependency App tour & user onboarding SDK Treasury — Personal Finance App | AI Insights & Budgeting Show HN: MailMark – Cold email tool where you own your domain and mailboxes Voxxy: Voice to Text for your Mac Menu Bar Show HN: I built a TikTok style video debate app GitHub - acatovic/ai-game-studio: AI generation of 2d game assets such as spritesheets Assemblr GitHub - AlexMason/worldnotes: Extensible inline-markdown editor with wiki-style navigation Show HN: Brew-browser – A native macOS GUI for Homebrew GitHub - aloth/cred-1: CRED-1: An Open Multi-Signal Domain Credibility Dataset (2,672 domains) Show HN: TalkTimer, a micro-SaaS run by an AI agent team Trickster's Table invest-like - AI value-investing: best-tier consensus beat S&P 500 by +72.7% GitHub - kimjune01/swebench-verified: Reproducible recon/craft/audit agent pipeline for SWE-bench Verified. Official-graded, codex-attested, GPL-3.0. Run it yourself. GitHub - mupt-ai/context-drop: cli tool to make sharing context between remote agents dead easy Multiple Real Desktops for Windows GitHub - lionello/han64: Handling Chinese text on the Commodore 64 Show HN: Strudel – Generate commit messages via Apple's on-device LLM Show HN: Audiomass – a free, open-source multitrack audio editor for the web move-reminder The Front Page HtmlUnit – Welcome to HtmlUnit GitHub - kouhxp/textsnap: Snap any image, screenshot, or webpage into plaintext. No GPU. No cloud. One command. Show HN: Pro Health Ledger – An open-source, net-neutral reputation system iPhone 版“Today” - App Store LLMRequirements.com — Hardware for Local LLMs Show HN: Hookwarden – npx tool to find and fix webhook HMAC bugs (JS/TS/Py/PHP) Frello — A small revolt against bloated software
GitHub - rjpruitt16/aquifer: API Aqueduct — self-hosted request queue for inbound and outbound rate control
rjpruitt16 · 2026-05-26 · via Hacker News: Show HN

Self-hosted API request queue. Controls the pace of inbound and outbound traffic so partial outages don't cascade.


The problem

APIs get hit in bursts — by agents, schedulers, or high-volume clients. Your backend gets overwhelmed on inbound. Your app gets 429s on outbound. One slow dependency takes everything else down with it.

Aquifer absorbs the burst, queues requests durably to SQLite, and releases them at the rate you configure. Your backend decides the pace. The upstream decides the pace. Whoever needs to slow things down — wins.


Two ways to use it

Inbound — protect your API

agents / clients  →  POST /jobs to Aquifer  →  your backend (at controlled RPS)

Agents hammering your API? Aquifer queues their requests and drains them to your backend at a pace it can handle. Your backend returns X-Aquifer-Rps headers to signal how fast it wants traffic in real time.

Outbound — respect external APIs

your app  →  POST /jobs to Aquifer  →  OpenAI / Stripe / any API (at controlled RPS)

Calling a rate-limited upstream? Aquifer queues the calls and dispatches them at your configured rate. If the upstream signals a slowdown via headers, Aquifer backs off automatically.

In both cases — the upstream response headers are the final say on pace. Your config sets the ceiling. Headers can only reduce below it, never exceed it. When pressure clears, the rate recovers gradually back to your ceiling.


How it works

  1. Client POSTs a job (target URL, method, headers, body, webhook URL) and moves on
  2. Aquifer persists it to SQLite — survives crashes, re-dispatches on restart
  3. A per-upstream worker dispatches at your configured RPS with jitter
  4. On completion Aquifer POSTs your webhook with the response body and status
  5. The upstream can adjust the rate live via X-Aquifer-* response headers

Quick start

Binary

go install github.com/rjpruitt16/aquifer@latest
aquifer

Docker

docker run -p 8080:8080 -v $(pwd)/data:/data \
  -e DB_PATH=/data/aquifer.db \
  ghcr.io/rjpruitt16/aquifer

Fly.io

git clone https://github.com/rjpruitt16/aquifer
cd aquifer
flyctl launch --name my-aquifer --no-deploy
flyctl volumes create aquifer_data --size 1 --region iad
flyctl deploy

Configuration

Set CONFIG_PATH to a YAML file to configure rate limits per upstream hostname:

# aquifer.yml — copy from aquifer.example.yml
defaults:
  rps: 2
  max_concurrent: 1

upstreams:
  api.openai.com:
    rps: 10
    max_concurrent: 3
  api.stripe.com:
    rps: 20
    max_concurrent: 5
  your-backend.internal:
    rps: 50
    max_concurrent: 10
Env var Default Description
PORT 8080 HTTP listen port
DB_PATH aquifer.db SQLite database path
CONFIG_PATH (none) Path to rate limit config YAML

API

POST /jobs

{
  "user_id":        "user-123",
  "idempotent_key": "invoice-42-notify",
  "url":            "https://api.openai.com/v1/chat/completions",
  "method":         "POST",
  "headers":        { "Authorization": "Bearer sk-..." },
  "body":           "{\"model\":\"gpt-4o\",\"messages\":[...]}",
  "webhook_url":    "https://yourapp.com/webhooks/aquifer"
}

Idempotent — duplicate idempotent_key per user_id returns the existing job.

201 new job queued · 200 + "duplicate": true already exists

GET /jobs/:id

{
  "job_id":     "a3f9...",
  "status":     "queued | in_flight | completed | failed",
  "url":        "https://api.openai.com/v1/chat/completions",
  "method":     "POST",
  "created_at": 1715000000000
}

GET /jobs/:id/stream

Server-Sent Events stream for live job updates.

event: queued
data: {"job_id":"a3f9...","status":"queued"}

event: dispatching
data: {"job_id":"a3f9..."}

event: completed
data: {"job_id":"a3f9...","response_status":200,"body":"..."}

Or event: failed with {"job_id":"...","reason":"..."}.

Position updates — while the job waits in queue, a position event is broadcast every 2 seconds:

event: position
data: {"job_id":"a3f9...","position":4}
curl -N http://localhost:8080/jobs/<id>/stream

Connecting late is safe — you'll receive synthetic queued and dispatching catchup events for states you missed.

The Aqueduct Protocol — SSE is the live view. Webhook is the guaranteed delivery. Both always fire regardless of whether the stream was open. Think of it like a phone call with voicemail: stay on the line (SSE) for real-time updates, or hang up and the result goes to voicemail (webhook). You never lose the result.

GET /health

{ "status": "ok" }

Webhook payload

Completed

{
  "job_id":          "a3f9...",
  "status":          "completed",
  "response_status": 200,
  "body":            "..."
}

Failed (after 4 retries with exponential backoff)

{
  "job_id": "a3f9...",
  "status": "failed",
  "reason": "connection refused"
}

Webhook delivery retries 4 times: 1 s · 2 s · 4 s · 8 s.


L8 Protocol — trustless webhook delivery

Traditional webhook security requires sharing a secret between sender and receiver and storing it in a database on both sides. Aquifer implements L8 v0.1, a lightweight challenge-response protocol that eliminates shared secrets entirely.

The attack surface problem L8 solves: A shared HMAC secret is something that can be stolen, accidentally logged, forgotten to rotate, or compromised on either side. A stolen secret lets anyone forge webhook deliveries forever. L8 replaces that shared secret with public key cryptography — there is no secret to steal from a database.

How it works:

  1. The receiver publishes a public key at GET /.well-known/l8
  2. Before the first delivery, Aquifer challenges the receiver to prove ownership of the corresponding private key — a one-time handshake
  3. Trust is cached to disk as l8-trust/{domain}.json — the handshake never runs again for that domain
  4. Every webhook delivery carries X-L8-Signature headers the receiver verifies locally with no database lookup and no round-trip to any authority

Why this keeps things fast: Verification is a single local Ed25519 verify() call against a cached public key. No database query, no HTTP call, no shared state. Microseconds.

Key management:

Set L8_PRIVATE_KEY (base64 Ed25519 private key) for a stable identity across restarts. Without it, Aquifer auto-generates a key and saves it to .l8-key on first start.

To revoke trust with a domain: delete l8-trust/{domain}.json. The handshake re-runs on next delivery.

Aquifer exposes:

Endpoint Purpose
GET /.well-known/l8 Aquifer's public key and capabilities — receivers discover Aquifer here
POST /l8/challenge Handles incoming challenges from receivers verifying Aquifer's identity
GET /l8-spec The full L8 protocol spec — served on any running Aquifer instance

Protocol version: 0.1. The version is advertised in /.well-known/l8 and GET /health so agents can detect what capabilities are available. Future versions will add payload encryption (0.2) and formalized key rotation (0.3).

The full protocol spec and verification examples are in L8-SPEC.md, also browsable at GET /l8-spec on any running instance. The spec documents the receiver-side endpoints any service needs to implement to receive signed webhooks.

See tests/l8_receiver.py for a complete reference implementation of the receiver side, and tests/test_l8.py for end-to-end tests that verify the handshake, signed delivery, and cryptographic signature validation.


Dynamic rate control

The upstream controls pace at runtime via response headers:

Header Effect
X-Aquifer-Rps Reduce dispatch rate to this value
X-Aquifer-Max-Concurrent Reduce max in-flight requests
X-Aquifer-Account-Queue enabled — isolate each tenant's queue

With X-Aquifer-Account-Queue: enabled, each (user_id, api_key) pair gets its own independently paced queue. One tenant's burst can't slow down another.


Autoscaling

Aquifer sends machine load data as headers on every outgoing request to your service:

Header Value
X-Aquifer-Total-Jobs Total jobs on this machine right now
X-Aquifer-Queue-Depth Jobs waiting to be dispatched
X-Aquifer-Flow-Rate Current dispatch rate (RPS) for this queue

Your service reads these headers and calls your autoscaler when the queue is growing:

total_jobs = int(request.headers.get("X-Aquifer-Total-Jobs", 0))

if total_jobs > 500:
    scale_up()  # call Fly.io, AWS ASG, k8s HPA, etc.

This keeps the autoscaling decision in your hands — Aquifer exposes the signal, your service acts on it however fits your infrastructure.


Reliability

  • Durable queue — jobs persist to SQLite on every write
  • Crash recovery — queued jobs re-dispatched automatically on restart
  • In-flight tracking — jobs marked in_flight before dispatch; recovered immediately on panic without waiting for full restart
  • Stale job safety net — in-flight jobs older than 5 min automatically reset to queued
  • Per-job panic isolation — a panic in one job marks it failed and delivers the webhook; the worker keeps running

Job TTLs

Status TTL
queued 24 h
completed 30 min
failed 2 h

Deployment model

Aquifer is designed as a sidecar on a single machine. One instance per app server, SQLite on a local persistent volume — no external database, no coordination overhead.

Running multiple instances against the same upstream without partitioning will multiply your request rate. If you scale horizontally, partition by upstream domain or tenant so each instance owns a distinct key space.


License

MIT