1. Getting Started
1.1. What Is Appcraft?
Appcraft is a code generator for Python projects: appcraft init scaffolds a new project already organized into Clean Architecture layers (domain, application, infrastructure, presentation, runners — see Layered Architecture), and from there you keep developing inside it like any other Python project. It is not a library your code imports at runtime, beyond a handful of small utilities the generated project ships with itself.
1.2. Why Use It
A consistent structure from the first commit. Business rules (domain/application) stay separate from frameworks and storage (infrastructure), so a project doesn’t accumulate ad hoc structure as it grows, and the same conventions apply whether you built it alone or picked it up from someone else.
Add only what the project needs. Functionality comes from composable templates —
flask_api,sqlalchemy,docker,git, and more (see Templates). Installing one drops its files and wires itself in automatically: a new Flask route or a new SQLAlchemy model is picked up without touching a central registration file.Swap infrastructure without rewriting business logic. Interchangeable templates sit behind the same contract (a
Port) —sqlalchemy/mongodbfor the database,selenium/playwright/httpx/curl_cffifor web scraping. Changing which one is installed, or which one a config file prefers, doesn’t change the use case that calls it.One command style for every feature. Every command, from the application’s own entry points to one-off maintenance tasks, runs through the same runner system: an interactive menu for a human, and
interactive=falsewithkey=valuearguments for a script or CI — see Developing Your Project.You own what gets generated. Every file Appcraft drops is plain, readable Python in your project. Templates only keep checking each other’s presence at runtime (
is_installed()) so they can adapt to what’s installed — Appcraft itself doesn’t need to run again once the project exists, except when you choose to add another template.
Use it when starting a new service or tool that’s worth keeping organized as it grows. For a quick throwaway script, the scaffolding is more than you need.
To get started with AppCraft, follow these steps:
1.3. Installation
This version of the documentation (1.0.0b1) is a pre-release. pip never installs a pre-release by default, so grab it explicitly with --pre:
pip install --pre appcraft
Plain pip install appcraft (no --pre) installs the latest stable release instead, which won’t include what’s described on this version of the docs — switch to that release’s own documentation via the version selection page if that’s what you’re running.
1.4. Starting a New Project
To start a new project, follow these steps:
- Create a new directory for your project:
mkdir project_name cd project_name
Initialize the project using one of the following commands:
- To initialize the project with the desired templates using the following command:
appcraft init <template_names>
- Where <template_names> should be replaced by the names of the templates you want to use, separated by spaces. For example:
appcraft init flask_ui flask_api sqlalchemy docker
This will initialize your project with the specified templates. Make sure to separate each template name with a space.
appcis a shorter alias forappcraft:appc init flask_uidoes the same thing. Inside a project,appc run <module> <method>andappc tools <module> <method>run the project’s ownrunandtoolslaunchers, the same aspython runandpython tools.
- Or, to list available templates
appcraft list_templatesFor more details on available templates, refer to the Templates Documentation.
1.5. Adding Templates to an Existing Project
Already have a project and want to add more templates to it? Run add_template from inside the project directory instead of init — init is only for starting a brand new project (and would overwrite what’s already there):
appcraft add_template <template_names>
For example, adding SQLAlchemy to a project that doesn’t have a database template yet:
appcraft add_template sqlalchemy
Requesting a template that’s exclusive with one you already have (e.g. a different package manager) swaps it in automatically, converting your existing configuration along the way — see Template Types.