An open files and open source alternative to Notion and AppFlowy for tasks and pages viewing and management.
Project description
Fern
Offline-first desktop app for vaults, databases, and pages — an open-source alternative to Notion/AppFlowy. Native PySide6 UI; data lives as markdown + frontmatter in local folders.
- Vaults → folder with a
Databases/subfolder; each database is a subfolder of markdown pages. - Pages → one
.mdfile per page (YAML frontmatter for id, properties; body = content). - Properties → schema in
schema.jsonper database; boolean/string (and more) with table + editor UI.
Install
pip install fern
# or
uv add fern
Run
fern
Open a folder as a vault; create and edit pages and properties from the UI.
Technical
| Item | Detail |
|---|---|
| Python | 3.13+ |
| GUI | PySide6 |
| Data | Markdown + YAML frontmatter, schema.json per database |
| Build | Hatchling (pyproject.toml) |
| Dev / test | uv, pytest, pytest-cov |
Architecture (clean / hexagonal):
- Domain — entities (Vault, Database, Page, Property, PropertyType), repository ports (abstract).
- Application — use cases only (open vault, list DBs/pages, CRUD page, add/remove/update property, update property order, update page property).
- Interface adapters — repository implementations: filesystem vault, vault DB (markdown + schema.json), in-memory/markdown page repos.
- Infrastructure — PySide6 views and components, controller, factory wiring adapters into use cases.
Layout: src/fern/ → application/, domain/, interface_adapters/, infrastructure/.
Development:
uv sync --all-groups
uv run pytest tests/unit_tests/ --cov
uv build
Unit tests target application, domain, and interface_adapters (100% coverage enforced). Coverage scope: .coveragerc → fern.application, fern.domain, fern.interface_adapters.
CI/CD (GitLab):
- Merge requests: version must differ from target branch;
CHANGELOG.mdmust have## [x.y.z]for that version; unit tests (uv + pytest + cov); package build. - Push to default branch: build → publish to GitLab Package Registry and PyPI (twine); create release and tag
v<x.y.z>via Releases API; build and deploy documentation to GitLab Pages. PyPI requires CI variablePYPI_API_TOKEN.
Documentation: Architecture and developer guide built with MkDocs + Material, hosted on GitLab Pages. Run locally with uv run mkdocs serve.
Versioning: Semantic Versioning; changelog format Keep a Changelog. Bump version in pyproject.toml and add a changelog section for each release.
Project details
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 fern_app-0.7.0.tar.gz.
File metadata
- Download URL: fern_app-0.7.0.tar.gz
- Upload date:
- Size: 175.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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 |
483673c80fbf8488ef1ccc71f77ae69777229fcb7abe0e31ee1b3faff1481f0e
|
|
| MD5 |
a03ae493cc4ed113e2bea14e05b65d17
|
|
| BLAKE2b-256 |
dc0f43b1fcccfe12f0fa2acfdd58f07ceeff07a1e07381a4263f62c1ddcac0e8
|
File details
Details for the file fern_app-0.7.0-py3-none-any.whl.
File metadata
- Download URL: fern_app-0.7.0-py3-none-any.whl
- Upload date:
- Size: 132.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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 |
87c0f25c5e3857152f9daf3b4a7c216f9d831a7ddfc99bf2df52714cc6f6eff0
|
|
| MD5 |
f83b2792e5122f78bc5c121fe8aed48f
|
|
| BLAKE2b-256 |
0658f69fe16066023417cbdaad4a41ce3fdf74af66fa0736318932b3cad18479
|