Auf Deutsch
Auf Deutsch is an open source, local-first German learning app focused on self-study. It packages a FastAPI app, curated A1/A2 learning content, spaced repetition, stories, listening practice, and review tracking into a project people can install and run on their own machines.
What It Includes
- guided daily learning sessions
- spaced repetition review
- phrase packs, dialogues, grammar, stories, and listening exercises
- local SQLite progress tracking
- optional audio generation with
gTTS - a CLI entry point:
auf-deutsch
Quick Start
Install from GitHub
pip install "git+https://github.com/jrootn/auf-deutsch.git"
auf-deutsch
Install from a local checkout
git clone https://github.com/jrootn/auf-deutsch.git
cd auf-deutsch
pip install .
auf-deutsch
Contributor setup
git clone https://github.com/jrootn/auf-deutsch.git
cd auf-deutsch
python -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txt
pytest
auf-deutsch --skip-audio
The default app URL is http://127.0.0.1:8000.
CLI
auf-deutsch --help
auf-deutsch --no-browser
auf-deutsch --skip-audio
auf-deutsch --port 8010
auf-deutsch-validate
Data Storage
The app stores user data outside the repo:
- Linux:
~/.local/share/auf-deutsch - macOS:
~/Library/Application Support/auf-deutsch - Windows:
%LOCALAPPDATA%\auf-deutsch
Useful overrides:
AUF_DATA_DIR=/custom/pathAUF_DB_PATH=/custom/path/progress.dbAUF_SKIP_STARTUP_AUDIO=1
Dependencies
pip install . installs the runtime dependencies declared by the package:
fastapiuvicornjinja2gttsitsdangerouspython-multipart
The app works best online if you want generated pronunciation audio, because gTTS uses Google text-to-speech. The rest of the learning flow still works with --skip-audio.
Troubleshooting
If first run fails or the app starts in a restricted environment:
- try
auf-deutsch --skip-audio - set
AUF_DATA_DIR=/some/writable/path - set
AUF_DB_PATH=/some/writable/path/progress.dbif you want the database somewhere specific
The package includes a compatibility wrapper for current FastAPI/Starlette template rendering, so fresh installs should not depend on older TemplateResponse behavior.
Project Layout
src/auf_deutsch/ Python package
src/auf_deutsch/content/ Bundled learning materials
src/auf_deutsch/templates/ Server-rendered UI
src/auf_deutsch/static/ Static assets
tests/ Smoke tests
.github/workflows/ CI and PyPI release automation
GitHub Release Readiness
This repo is set up for GitHub use with:
- a standalone package layout under
src/ - a contributor install path
- CI workflow for tests and build checks
- a PyPI publish workflow using GitHub Actions trusted publishing
GitHub repository: https://github.com/jrootn/auf-deutsch
PyPI Release Readiness
The package can be built and checked locally with:
python -m build
python -m twine check dist/*
The included publish workflow expects:
- a real GitHub repository
- a PyPI project named
auf-deutsch - PyPI trusted publishing configured for that repository
Detailed release steps are in RELEASING.md.
License
MIT
Metadata
Release files for auf-deutsch 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| auf_deutsch-0.1.1.tar.gz | 257.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| auf_deutsch-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 593.7 kB
Release files / auf_deutsch-0.1.1.tar.gz
| Download URL | auf_deutsch-0.1.1.tar.gz |
|---|---|
| Size | 257.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b6b7dad947d87c79490fd9782e5c220058a44e38d71226273be7f57b9c67b5b0
|
|
BLAKE2b-256 checksum How to use checksums |
ad20e027472ac6847259f4aaa36bb4ad0fd3f6817661f6fedb89fdd737ebde70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 9, 2026.
Transparency logRelease files / auf_deutsch-0.1.1-py3-none-any.whl
| Download URL | auf_deutsch-0.1.1-py3-none-any.whl |
|---|---|
| Size | 336.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
40cce489e545180041c4aed11315f95bb229cf456af2c0c5ef294938f452382b
|
|
BLAKE2b-256 checksum How to use checksums |
ead1bbf4699e157015d0f2983ff93c4a9659e90e1e855caf115d895679c49aa0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 9, 2026.
Transparency logSecurity for auf-deutsch 0.1.1
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for auf_deutsch-0.1.1.tar.gz
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 Apr 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.