Library / SDK
smithyhq/sqladmin avatar
smithyhq/sqladmin

sqladmin prints its demo credentials and ships an empty screenshots heading

SQLAlchemy Admin for FastAPI and Starlette

2,854 stars304 forksPythonBSD-3-Clause

At a glance

What is it?
SQLAdmin builds a database admin interface for FastAPI and Starlette applications from SQLAlchemy models, installed with one pip command and three optional extras. Two things sit oddly next to the code. The public demo's username and password are written into the file in plain text, and the quickstart that produces an /admin route never adds a login step even though the authentication extra exists.
Who is it for?
SQLAdmin fits a team that already has SQLAlchemy models and wants a usable interface over them in an ASGI app without hand writing CRUD screens, and the WTForms base means custom views stay close to what a Flask-Admin user already knows. Two things to settle before you deploy it.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 44 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • smithyhq/sqladmin2,854 ★ · +16
Star history
Repository2026-10-042026-11-14
smithyhq/sqladmin2.8k2.9k

16 Stars in the last 41 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The demo credentials are in the file in plain text

The links near the top include a live demo address with a login pair written next to it: the username `superadmin` and the password `superadmin`.

That is a demonstration instance, and a shared credential on a demo is a normal thing to publish. The reason it is worth naming is what it implies about the demo's data. Anyone who signs in with those two words has whatever access the demo's administrator role grants, which for an admin panel over a live database is record editing rather than read only browsing.

So a visitor can change rows in a shared sample database, and the file gives no indication of what is in it or how often it is reset. For anyone evaluating the interface, that is a fair trade. For anyone tempted to point the same panel at real data, the demo's login is a reminder that the authentication story lives in a separate extra and a separate documentation page, not in the panel itself.

The quickstart route has no login step in it

The quickstart is short. It defines a SQLAlchemy model against a SQLite file, creates an engine with the same thread check disabled, builds the application, constructs the admin with the app and the engine, declares a model view with a column list, and registers it.

The FastAPI and Starlette variants differ only in which application class is imported. Both end the same way, with a note that visiting `/admin` in a browser shows the interface.

Nowhere in that sequence is authentication configured, even though an authentication extra exists and the feature list advertises session-backed authentication. The install table lists three extras, and the fast one is what brings the session signing library in. So the panel described in the quickstart is one where the route exists and nothing is checking who calls it. Adding a login is a deliberate step the reader has to take, and the file does not show what that step looks like.

An empty screenshots heading and three named alternatives

There is a heading for screenshots and nothing under it. No image, no link, no caption. Given that the project describes itself as having a modern interface built on a third party UI kit, the section reads as a placeholder that was never filled in.

What the file does show instead is the smallest complete example, a SQLAlchemy model and an engine pointed at a SQLite file:

python
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base

Base = declarative_base()
engine = create_engine(
    "sqlite:///example.db",
    connect_args={"check_same_thread": False},
)

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String)

Base.metadata.create_all(engine)  # Create tables

The last section then names three projects and says what each is for. Flask-Admin is credited as the inspiration, with the statement that this project was inspired by it extensively and that most features and configurations are implemented the same. FastAPI-Admin is described as an admin interface for FastAPI working with a different ORM, and Dashboard as one for ASGI frameworks working with yet another ORM package.

So two of the three alternatives are not drop-in equivalents for a SQLAlchemy project. The one that is, Flask-Admin, is also the one whose behaviour SQLAdmin mirrors, which makes the choice between them narrower than the list suggests.

Two variables and two targets that do not line up

The build file captures extra command line arguments and filters them out of the target list, then adds a catch-all rule whose only job is to stop make from treating a stray word as a target. That part is careful.

The variable holding the Python paths is then defined twice. The first definition filters the arguments down to anything ending in a Python file. A few lines later the same variable is assigned again, this time falling back to the package and tests directories when no such arguments were given. Make takes the second, so the first is dead text.

The list of named actions has its own mismatch. It enumerates nine entries, two of which are `lint-check` and `lint-format`. The targets actually defined below are `lint` and `format`. So the summary at the top of the file promises four commands that the file does not implement, and the two that do exist are not in that list.

The docs are built with one tool and configured for another

The documentation targets invoke a command called `zensical`, once to build and once to serve on a development address bound to localhost.

The repository root, meanwhile, carries a `mkdocs.yml`. So a configuration file for one documentation generator sits beside targets that build with a different one, and nothing in the build file explains which of the two is authoritative or whether the configuration is still read.

The rest of the file is a modern Python setup. Dependencies are synced through uv with all groups enabled, the test target runs coverage with concurrency support for threads and greenlets, which is what an asynchronous SQLAlchemy engine needs, and linting is split across a checker, a formatter check and a type checker. A separate security target runs a static security scanner over the package directory.

Starlette is a dependency, FastAPI is not

The runtime dependency list is short and specific: Starlette with a floor and a ceiling, WTForms inside a narrow band, Jinja2, a multipart parser, and SQLAlchemy from 2.0 onwards.

FastAPI is not in it. The FastAPI integration works because FastAPI is built on Starlette, so the dependency list reflects the actual coupling, which is the honest arrangement for a library that also supports plain Starlette and SQLModel.

Two details in that list are worth copying carefully if you maintain something similar. The Starlette bound stops before the 2.0 release, and the WTForms bound is narrow at both ends, which matters because the form layer is where a framework upgrade tends to break a generated admin. The same file writes three of those five entries with spaces around the version operators and two without, so a diff touching that block will show noise that has nothing to do with the change.

Version 0.32.0 shipped twenty seconds before the last push

The packaging declares the version directly, `0.32.0`, rather than deriving it from tags, and the newest release carries the same number. The two preceding releases are 0.31.1 and 0.31.0, so the project is on a plain incrementing scheme with no epoch and no pre-release suffix anywhere in the recent list.

The timestamps are tight. The 0.32.0 release is recorded at 23:17:43 on 2026-09-20 and the last push to the default branch at 23:18:03 the same evening, twenty seconds later. That is the shape of a tagged release followed by a housekeeping commit, and it means the commit on the branch tip is very likely not the one in the published artifact.

Everything else about the packaging is small and explicit. A build lock file is committed, the project requires Python 3.10 or newer, its classifiers run from 3.10 through 3.14, and it is marked as a beta in both the classifier and the changelog cadence.

Editorial conclusion

SQLAdmin fits a team that already has SQLAlchemy models and wants a usable interface over them in an ASGI app without hand writing CRUD screens, and the WTForms base means custom views stay close to what a Flask-Admin user already knows. Two things to settle before you deploy it. The quickstart does not authenticate anything, so decide how your /admin route is protected before it is reachable, and remember the demo credentials in the file are shared by every visitor. And read the build file before trusting the documented targets, because the action list names two lint targets that the file does not define, and the documentation is built by one tool while the tree still carries a configuration for another.

Frequently asked questions

Is there an admin panel available for FastAPI?

Yes, and this repository is one. SQLAdmin attaches an admin interface to a FastAPI or Starlette application from SQLAlchemy models, with form building through WTForms, a user interface built on Tabler, and support for synchronous and asynchronous SQLAlchemy engines and for SQLModel. Install it with `pip install sqladmin` and mount it at `/admin`.

sqladmin alternative

Three projects are named. Flask-Admin is the direct comparison, an admin interface for Flask across backends and ORMs, and the file says SQLAdmin was inspired by it extensively with most features and configurations implemented the same. FastAPI-Admin and Dashboard both work with other ORM packages rather than SQLAlchemy.

what is sql admin

The phrase usually means a database administrator rather than software. In this repository SQLAdmin is a library that builds an admin interface for SQLAlchemy models inside FastAPI and Starlette applications, published on PyPI and licensed BSD-3-Clause. It says nothing about the administrative role.

How do I add authentication to sqladmin?

Through an optional extra. The install table lists `auth`, which brings in the session signing library and enables session-backed authentication, `i18n`, which brings in Babel, and `full`, which is both. The quickstart itself configures no authentication and shows the interface at `/admin` with no login step.

Does sqladmin work with SQLModel?

Support for SQLModel is listed among the main features, alongside synchronous and asynchronous SQLAlchemy engines, the Starlette and FastAPI integrations, form building through WTForms, and a user interface built on Tabler. The runtime dependencies are Starlette, WTForms, Jinja2, a multipart parser and SQLAlchemy itself.

Official sources

  1. License: BSD-3-Clause
  2. Project website
  3. README
  4. Releases
  5. smithyhq/sqladmin on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/smithyhq-sqladmin.svg)](https://hysenlabs.com/projects/smithyhq-sqladmin)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/smithyhq-sqladmin.svg)](https://hysenlabs.com/projects/smithyhq-sqladmin)

Was this useful?