Skip to main content

posthole

Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. CI

[!WARNING] Pre-release / alpha. APIs and UI may break without notice. Not yet recommended for any production use.

Local mock server for social media platform APIs - auth, publishing, the lot.

posthole is a developer tool that stands in for real social media platform APIs so you can build and test integrations end-to-end on your laptop. Run it next to your app, point your code at 127.0.0.1:5176 instead of the real provider, and an inbox-style UI shows every post you've published alongside the complete HTTP transcript of each call. Instagram is the first platform supported; TikTok, Facebook, and others are on the roadmap.

posthole inbox UI with a captured post rendered in a device frame

It mocks the parts of these APIs you actually need while developing:

  • OAuth flows — authorize dialogs, token exchange, and token refresh.
  • Content publishing — images, videos, reels, stories, and carousels (including mixed-media), modeled on the real multi-step container → poll → publish lifecycle.
  • Accounts and permissions — switch between seeded test accounts and simulate revoked permissions.
  • Per-endpoint behavior toggles — flip any endpoint into a failure mode at runtime: rate-limited, validation error, media URL unreachable, reel duration too long, expired token, async-finished-with-error, slow response.
  • Scenarios — named bundles of behaviors (Validation, Quota, Auth, Async, Latency) so a single switch flips a whole class of failures on at once and you can watch how your code copes.

On the roadmap: replay (re-drive a captured request chain under a different scenario without re-running your app), inject (seed posts manually to reproduce specific UI states), more platforms (TikTok, Facebook, then YouTube and Threads), and richer device-preview frames.

Quick start

Docker (recommended):

docker run --rm -p 5176:5176 ghcr.io/socialpyre/posthole:latest
# → http://127.0.0.1:5176

As a uv tool (once published to PyPI):

uvx posthole
# → http://127.0.0.1:5176

Getting started

Prerequisites

  • Python 3.12+
  • uv ≥ 0.11 — curl -LsSf https://astral.sh/uv/install.sh | sh
  • Node 22 + pnpm 11 — nvm use (reads .nvmrc) then corepack enable
  • Docker (optional, only if you want to run the containerized image or test it locally)

Clone, install, run

git clone https://github.com/socialpyre/posthole
cd posthole
make install            # uv sync + pnpm install
make dev                # server + asset watchers + browser auto-reload

Then open http://127.0.0.1:5176.

Configurable knobs live in .env.schema; copy to .env.local to override locally. See CONTRIBUTING.md for the workflow.

Common make targets

Command What it does
make help Show available targets
make install Sync Python (uv sync) + Node (pnpm install) deps
make dev Run FastAPI server + esbuild + Tailwind watchers + browser auto-reload
make run Run the FastAPI server only (no watchers), with varlock-injected env
make assets One-shot rebuild of app.js + app.css
make test Run pytest + vitest
make lint ruff check + ruff format --check + prettier --check
make format ruff format + ruff check --fix + prettier --write
make typecheck ty check (Python) + tsc --noEmit (TypeScript)
make check Everything CI runs (lint + typecheck + test)
make build Build wheel + sdist into dist/
make docker Build the Docker image locally as posthole:dev
make docker-run Run the locally built image

Live reload

make dev runs the processes declared in Procfile.dev under honcho, so a single Ctrl-C tears them all down:

  • fastapi dev restarts the server on .py / .toml edits via watchfiles.
  • esbuild --watch rebuilds src/posthole/static/app.js on .ts edits.
  • tailwindcss --watch rebuilds src/posthole/static/app.css on template / CSS edits.
  • arel is mounted on /hot-reload (gated by POSTHOLE_DEV_RELOAD=1) and reloads the browser when watched files change.

See CONTRIBUTING.md for the full development workflow, commit conventions, and release process.

License

MIT — see LICENSE.

Metadata

Release files for posthole 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for posthole 0.6.0
File Size Uploaded
posthole-0.6.0.tar.gz 767.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for posthole 0.6.0
File Interpreter ABI Platform
posthole-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 937.5 kB

Release files / posthole-0.6.0.tar.gz

Download URL posthole-0.6.0.tar.gz
Size 767.5 kB
Tags Source
SHA-256 checksum
How to use checksums
4c2f55d425786290069ab4f82a720ab121c278a07bcf9c11eb143fcfc2829a5c
BLAKE2b-256 checksum
How to use checksums
d21583f85cea93fdb6672abc6aca9feb029fa33fa52320211452d5b8658dab5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 21, 2026.

Transparency log

Release files / posthole-0.6.0-py3-none-any.whl

Download URL posthole-0.6.0-py3-none-any.whl
Size 170.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ff9e04c2e7409ddd0659d042969d2ccba3e01dbb8cf4b9ff4574965240037629
BLAKE2b-256 checksum
How to use checksums
584fc04bb6db3867e4e2354c8e524fde12e566316cf1504b4f4fc2c612205cf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.2

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page