Skip to main content

Ship hackathon products fast with secure-by-default auth, RBAC, PostgreSQL readiness, and built-in LLM tooling.

Project description

h4ckath0n

Ship hackathon products fast with a secure FastAPI bootstrap and passkey-first authentication.

What you get

  • FastAPI app factory with passkey routes mounted by default
  • Device signed ES256 JWT authentication and server-side RBAC (user, admin, scopes)
  • SQLAlchemy 2.x models with automatic table creation on startup
  • LLM wrapper around the OpenAI SDK with timeouts and retries
  • Optional password auth extra for email and password flows
  • Optional Redis extra that only adds the dependency, no integration is provided yet
  • Trace ID middleware and LangSmith environment wiring via init_observability
  • Full stack scaffold CLI that produces an API and web template

Installation

Recommended (uv)

uv add h4ckath0n

Optional extras:

uv add "h4ckath0n[password]"  # Argon2 based password auth
uv add "h4ckath0n[redis]"     # Redis dependency only

pip

pip install h4ckath0n

Scaffold a full stack project

npx h4ckath0n my-app

Quickstart

from h4ckath0n import create_app

app = create_app()

Run:

uv run uvicorn your_module:app --reload

OpenAPI docs

  • Interactive docs live at /docs when the app is running.
  • Public routes like passkey start and finish work without auth.
  • Protected routes require an Authorization: Bearer <device_jwt> header that the web template can mint after login.

Built-in routes

  • GET / — welcome message confirming the app is reachable.
  • GET /health — returns {"status": "healthy"} for load balancer and deployment checks.

Session

  • GET /auth/session — returns the current user session details.

Background Jobs

  • GET /jobs — list jobs.
  • POST /jobs — enqueue a background job.
  • GET /jobs/{job_id} — get the status and result of a job.

Uploads

  • GET /uploads — list uploaded files.
  • POST /uploads — upload a new file.
  • GET /uploads/{upload_id} — get metadata for a specific upload.
  • GET /uploads/{upload_id}/download — download the uploaded file.

LLM Chat

  • POST /llm/chat — send a message to the language model.
  • POST /llm/chat/stream — stream responses from the language model.

Auth model

Passkeys by default

The default authentication path uses passkeys (WebAuthn). The core flows are:

  1. POST /auth/passkey/register/start and POST /auth/passkey/register/finish
  2. POST /auth/passkey/login/start and POST /auth/passkey/login/finish
  3. POST /auth/passkey/add/start and POST /auth/passkey/add/finish for adding devices
  4. GET /auth/passkeys, POST /auth/passkeys/{key_id}/revoke, and PATCH /auth/passkeys/{key_id} for management

Device signed JWTs

After login or registration, the client binds a device key and mints short lived ES256 JWTs. The server uses the kid header to load the device public key and verifies the signature and aud claim. JWTs contain only identity and time claims, no roles or scopes.

ID scheme

  • User IDs are 32 characters and start with u
  • Passkey IDs are 32 characters and start with k
  • Device IDs are 32 characters and start with d
  • Password reset tokens use UUID hex, not the base32 scheme

Secure endpoint protection

from h4ckath0n import create_app
from h4ckath0n.auth import require_user

app = create_app()

@app.get("/me")
def me(user=require_user()):
    return {"id": user.id, "role": user.role}

Admin only endpoint:

from h4ckath0n.auth import require_admin

@app.get("/admin/dashboard")
def admin_dashboard(user=require_admin()):
    return {"ok": True}

Scoped permissions:

from h4ckath0n.auth import require_scopes

@app.post("/billing/refund")
def refund(user=require_scopes("billing:refund")):
    return {"status": "queued"}

Password auth (optional)

Password routes mount only when the password extra is installed and H4CKATH0N_PASSWORD_AUTH_ENABLED=true.

  • POST /auth/register
  • POST /auth/login
  • POST /auth/password-reset/request
  • POST /auth/password-reset/confirm

Password auth is only an identity bootstrap. It binds a device key but does not return access tokens, refresh tokens, or cookies.

Configuration

All settings use the H4CKATH0N_ prefix unless noted.

Variable Default Description
H4CKATH0N_ENV development development or production
H4CKATH0N_DATABASE_URL sqlite:///./h4ckath0n.db SQLAlchemy connection string
H4CKATH0N_AUTO_UPGRADE false Auto-run packaged DB migrations to head on startup
H4CKATH0N_RP_ID localhost in development WebAuthn relying party ID, required in production
H4CKATH0N_ORIGIN http://localhost:8000 in development WebAuthn origin, required in production
H4CKATH0N_WEBAUTHN_TTL_SECONDS 300 WebAuthn challenge TTL in seconds
H4CKATH0N_USER_VERIFICATION preferred WebAuthn user verification requirement
H4CKATH0N_ATTESTATION none WebAuthn attestation preference
H4CKATH0N_PASSWORD_AUTH_ENABLED false Enable password routes when the extra is installed
H4CKATH0N_PASSWORD_RESET_EXPIRE_MINUTES 30 Password reset token expiry in minutes
H4CKATH0N_BOOTSTRAP_ADMIN_EMAILS [] JSON list of emails that become admin on password signup
H4CKATH0N_FIRST_USER_IS_ADMIN false First password signup becomes admin
OPENAI_API_KEY empty OpenAI API key for the LLM wrapper
H4CKATH0N_OPENAI_API_KEY empty Alternate OpenAI API key for the LLM wrapper

In development, missing RP_ID and ORIGIN fall back to localhost defaults with warnings. In production, missing values raise a runtime error when passkey flows start.

Postgres readiness and migrations

Set a Postgres database URL to run against Postgres:

H4CKATH0N_DATABASE_URL=postgresql+psycopg://user:pass@host:5432/dbname

create_app() calls Base.metadata.create_all on startup.

h4ckath0n also ships an operator CLI and packaged Alembic migrations:

h4ckath0n db ping
h4ckath0n db migrate upgrade --to head --yes

If startup or db ping reports that the database schema is behind, run:

h4ckath0n db migrate upgrade --to head --yes

If startup or db ping reports that the database was initialized without Alembic versioning, run:

h4ckath0n db migrate stamp --to <baseline> --yes
h4ckath0n db migrate upgrade --to head --yes

For legacy create_all deployments in current releases, use <baseline>=head.

LLM usage

from h4ckath0n.llm import llm

client = llm()
resp = client.chat(
    system="You are a helpful assistant.",
    user="Summarize this in one sentence: ...",
)
print(resp.text)

The wrapper raises a RuntimeError if no API key is configured.

Observability

init_observability(app) adds an X-Trace-Id header to responses and can set LangSmith environment variables if ObservabilitySettings.langsmith_tracing is true. It does not instrument FastAPI, LangChain, or OpenAI calls by itself.

from h4ckath0n import create_app
from h4ckath0n.obs import ObservabilitySettings, init_observability

app = create_app()
init_observability(app, ObservabilitySettings(langsmith_tracing=True))

Compatibility and operational notes

  • Passkeys require HTTPS in production. localhost is allowed for development.
  • H4CKATH0N_RP_ID must match your production domain and H4CKATH0N_ORIGIN must include the scheme and host.
  • The last active passkey cannot be revoked. Add a second passkey first.

Development

git clone https://github.com/BTreeMap/h4ckath0n.git
cd h4ckath0n
uv sync --locked --all-extras

Quality gates:

uv run --locked ruff format --check .
uv run --locked ruff check .
uv run --locked mypy src
uv run --locked pytest -v

License

MIT. See LICENSE.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

h4ckath0n-0.1.10.dev20260412.tar.gz (407.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

h4ckath0n-0.1.10.dev20260412-py3-none-any.whl (72.1 kB view details)

Uploaded Python 3

File details

Details for the file h4ckath0n-0.1.10.dev20260412.tar.gz.

File metadata

  • Download URL: h4ckath0n-0.1.10.dev20260412.tar.gz
  • Upload date:
  • Size: 407.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for h4ckath0n-0.1.10.dev20260412.tar.gz
Algorithm Hash digest
SHA256 e378f112bea85cef92849aea20ebcb122c41e3034c38d38acd523aed21e7afb9
MD5 12bb5344422a7a8199ed5140231e1b5f
BLAKE2b-256 39f68f93e1f135ac6ed80dde00010d31ce707335092a2ac2373c803903bc8cc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for h4ckath0n-0.1.10.dev20260412.tar.gz:

Publisher: publish.yml on BTreeMap/h4ckath0n

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file h4ckath0n-0.1.10.dev20260412-py3-none-any.whl.

File metadata

File hashes

Hashes for h4ckath0n-0.1.10.dev20260412-py3-none-any.whl
Algorithm Hash digest
SHA256 0bd53b1860cc7bf2b34e5ea75b5d5f4c6d1b4d8a4eff881b17584e2ed6dab882
MD5 09a9678e30a67042403ad0f99f0d2f13
BLAKE2b-256 dc6e39d6cd6910e9602f5dac307e1eb23839d3b86d0a35848100b03cd17acacd

See more details on using hashes here.

Provenance

The following attestation bundles were made for h4ckath0n-0.1.10.dev20260412-py3-none-any.whl:

Publisher: publish.yml on BTreeMap/h4ckath0n

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page