This release is a pre-release and may not be stable for production use.
Sillo Start
Creates a Sillo application from a starter repository.
uvx sillo-start create-app myapp
cd myapp
uv sync
uv run sillo db:migrate
uv run sillo serve --reload
That is the whole tool. It fetches a real, working application, renames it to yours, gives it its own secrets, and gets out of the way.
Why a starter repository, not a generator
A generator renders templates. Templates are checked for rendering, which is not the same as working — a project can produce valid Python, import cleanly, render every page, and still fail on its first real request. Middleware registered in the wrong order, an auth backend reading the wrong claim, a missing static mount: all of them render perfectly.
sillohq/starter is a real application
with its own CI. Every push boots it and exercises every route, on three
Python versions. What you get has been run, not just written.
It also means the starter can be read, forked and improved on its own, and
that sillo-start never has to be released to fix a bug in what it produces.
Install
# Run it without installing
uvx sillo-start create-app myapp
# Or install it
uv tool install sillo-start
pipx install sillo-start
Python 3.11 or newer. The only dependencies are typer and rich.
Usage
sillo-start create-app myapp # the default starter
sillo-start create-app sillohq/starter myapp # named explicitly
sillo-start create-app sillohq/starter@v1.2 myapp # pinned to a tag
sillo-start create-app acme/our-template myapp # your own starter
Any public GitHub repository works. A full URL is accepted too, so pasting what is in your address bar does what you expect.
| Option | |
|---|---|
--ref <branch|tag> |
Which revision to take. Defaults to main |
-d, --directory <path> |
Where to create it. Defaults to ./<name> |
--install |
Install dependencies straight away |
--no-git |
Do not initialise a git repository |
--force |
Allow a directory that is not empty |
-v, --verbose |
Show tracebacks |
Dependencies are not installed by default, so creating a project takes a
second rather than a minute. uv sync in the new project installs them, and
the command prints the exact next steps for the manager it detected.
What it does to the project
The starter arrives as a tarball rather than a clone. That needs no git on
the machine, brings no history for you to delete before your first commit, and
pins to a tag as easily as to a branch.
Then three things happen:
It takes your name. The package name, the application title, the SQLite path. Rewriting is targeted rather than a blanket find-and-replace, so prose that happens to say "starter" — a README sentence, a comment — is left as written.
It gets its own secrets. .env is created from .env.example with a fresh
key for SECRET_KEY, JWT_SECRET and APP_KEY. A secret committed to a
starter is a placeholder by definition; no two projects should ever share a
signing key. An existing .env is never touched — it may hold real credentials.
It becomes a git repository, unless you pass --no-git.
What it deliberately does not do
Migrations, creating users, running the queue worker, starting the server — none of that is here.
Those belong to the project, behind its own sillo command:
uv run sillo db:migrate
uv run sillo user:create ada@example.com --admin
uv run sillo queue:work
uv run sillo serve --reload
The framework provides the operations as plain functions —
sillo.record.commands, sillo.users.commands, sillo.work.commands — and
the project decides how to expose them. Nothing in a created project depends on
sillo-start, so it cannot rot when this tool changes, and you can delete this
tool the moment your project exists.
Safety
An archive member whose path escapes the destination is refused rather than sanitised — that is how a malicious archive overwrites files elsewhere on your machine.
A directory that is not empty is refused unless you pass --force, and even
then existing files are left in place.
A project name that is not a usable Python identifier is refused before anything is fetched, since it becomes both a package name and a directory.
Development
See docs/contributing.md.
Licence
BSD-3-Clause.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sillo_start-1.0.0a1.tar.gz.
File metadata
- Download URL: sillo_start-1.0.0a1.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8e806d2cf5fb83186a1099e7eec6781c3a7cce2dd1a5dcec1745c485852dfa2
|
|
| MD5 |
8af7e4b77ae807a1407859315f9e9707
|
|
| BLAKE2b-256 |
d5c64bc9c07b18dbd810abdf73a4853d176c66a2bc4c09baf978cf36fb2dea14
|
File details
Details for the file sillo_start-1.0.0a1-py3-none-any.whl.
File metadata
- Download URL: sillo_start-1.0.0a1-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
474310af208fb578b289ccd8d79668dc31b3c31d9d59ec6de4ed7b38210af1fa
|
|
| MD5 |
0e6889a849e42dc1bbc77ceb4622a470
|
|
| BLAKE2b-256 |
16eed226e408a7ca5da85b5ded516ecf5a733ad648203d7b2988fb0b27e88100
|