appAssembly
create_app(settings) is a lazy wrapper: FastAPI, middleware, lifespan and mounts arrive with keepup-http.
An admin framework over FastAPI
You give it settings; keepup gives you an application with a panel, a plugin runtime, users and roles, a database layer, an audit, metrics and coordination between replicas already wired.
pip install keepup-admin
pip install "keepup-admin[panel,postgres]"
Installed as keepup-admin, imported as keepup.
The base is the constructor: the kernel, the plugin catalogue, the service
registry, the lifecycle and the transport seam, with no library of anybody
else's, not even FastAPI. Capabilities arrive as extras; the full panel is
keepup-admin[panel,postgres].
import os
from keepup import KeepupSettings, create_app
PLUGINS = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plugins")
app = create_app(KeepupSettings(
title="Your product",
plugins_dir=PLUGINS,
static_mounts=(), # The application has no static files of its own: the panel shell ships with keepup-http.
))
$ SECRET_KEY=… uvicorn main:app → the panel at /selfcareWhat is inside
Eight parts usually assembled around FastAPI by hand — as a set of distributions, with one place to configure them. The base pulls in no library of anybody else's, not even FastAPI: every capability declares its own. The full panel is pip install "keepup-admin[panel,postgres]".
create_app(settings) is a lazy wrapper: FastAPI, middleware, lifespan and mounts arrive with keepup-http.
Features arrive as plugins; routes are data, not decorators.
The /selfcare shell and the sections are keepup-http, the themes keepup-ui, the section catalogue and its grants keepup-modules; eight sections out of the box.
Local accounts, roles, panel sessions, sign-in through an external OIDC provider.
keepup-db: SQLAlchemy with a pool; a table is declared once for PostgreSQL and SQLite, no migrations.
keepup-cluster: distributed locks, a message bus between processes, a cluster registry.
keepup-tasks: one scheduler per process; its jobs are visible in the panel and can be run from there.
keepup-audit, keepup-metrics, keepup-log-shipping: an audit of incoming requests, an event log, Prometheus metrics, log shipping.
How it is shaped
Anything it cannot know arrives in KeepupSettings: your name and version,
where your logs are shipped, which fields of a request are secret, what a password
must look like, which pages are closed, which origins may read your answers.
What is public is declared: the names in __all__ are the contract, and a
test holds the package to it. Everything else is internal and may change without notice.
from keepup.plugins.base import BasePlugin
class HelloPlugin(BasePlugin):
def __init__(self, config=None):
super().__init__("hello", "Hello", config or {})
async def initialize(self) -> bool:
return True
def get_handlers(self):
return {}
def get_api_routes(self):
return [{"path": "/api/hello", "methods": ["GET"],
"handler": self.hello}]
async def hello(self, current_user: dict, **kwargs):
return {"hello": current_user["username"]}
Closed by default
SECRET_KEY the application does not start — there is no signing key in the source./metrics needs credentials.Next
Getting started, settings, plugins, tables, replicas, the panel and security.
A plugin with routes, a table, a lock, events, a socket, sign-in through a provider.
The repository on GitHub: the code, the README, the test suite.
The keepup-admin distribution on PyPI: metadata and files.
What each version added, changed and removed.
Report something that does not work, or ask for something that is missing.