5 min read

AppFlowy: The Open-Source Notion Alternative You Can Self-Host (GitHub, Scanned)

Docs, wikis, databases and kanban boards in one workspace, open source and yours to self-host.

AppFlowy logo
✅
Scan: safe. Nothing malicious. The note is maintenance: the Rust core that ships in the app pins libraries with known advisories, and CI actions are not pinned. Scanned Oct 26, 2026; the full report is below.

AppFlowy is a workspace in the mould of Notion: pages with a block editor, nested wikis, databases you can view as a grid, a kanban board or a calendar, and AI writing and chat built in. It is a native app for macOS, Windows, Linux, iOS and Android, written in Flutter with a Rust core, so it feels quicker than a web wrapper and works offline.

The difference from Notion is control. You can use it on one device with local data, sync through AppFlowy Cloud, or self-host the cloud server so your team's notes never touch someone else's infrastructure. The AI features can also be pointed at local models. It is AGPL-3.0, with about 77,800 stars and 380 contributors, and releases arrive regularly.

Honest limits: it does not match Notion feature for feature, especially in integrations and the template ecosystem, and self-hosting the sync server is a separate project with its own setup.

  • Repository: github.com/AppFlowy-IO/AppFlowy
  • Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
  • Language: Dart. Stars: 77.8K. Forks: 6,092. Last push: Oct 26, 2026.
  • Scan: safe, Oct 26, 2026, commit 5cf3a36

Who it is for

Notion users who want their notes and project boards on their own devices or server, small teams that need a self-hosted wiki and task tracker, and anyone uneasy about a single company holding all their notes.

Getting started

1. Linux (Flathub); macOS and Windows installers are on the GitHub releases page

flatpak install flathub io.appflowy.AppFlowy

2. Linux (Snap)

sudo snap install appflowy

Phones get it from the App Store (iPhone) and Google Play (Android 10 or later). To keep sync on your own server, follow the self-hosting guide on appflowy.com.

Safety scan

We cloned AppFlowy-IO/AppFlowy at commit 5cf3a36 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no committed binaries and no bare-IP URLs. The 3 pattern hits are rustup's installer in a Dockerfile and in the Linux developer setup script, and a comment in install.sh explaining how it guards against a truncated curl | bash.
  • install.sh (403 lines) downloads a release tarball from GitHub and uses sudo to move it into /opt. The four install_dev_env scripts set up Flutter and Rust for contributors; the Linux one uses sudo for apt packages. Eleven Cargo build scripts generate code for the Rust core.
  • 94 known advisories, all in frontend/rust-lib/Cargo.lock, which is the Rust core bundled into the app: 2 critical in older versions of the zip crate, and high-rated ones in openssl, diesel, lopdf, lz4_flex and others. The scanner does not count Dart, so the Flutter UI is missing from the line count and its pub dependencies were not checked.
  • 11 workflows. ninja_i18n.yml uses pull_request_target to lint translations on pull requests; it checks out the base branch, not the pull request, but runs a third-party action from its main branch with permission to write pull request comments. None of the 35 third-party actions is pinned to a commit. Code of conduct and licence present; no security policy, Dependabot or CodeQL.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious code3 pattern hits found and read; every one is listed under the raw findings.
Install-time code11 Cargo build scripts. 5 installer scripts (one fetches and runs a remote script; one can call sudo)
Committed binariesNone.
CI workflows11 workflows. 1 uses pull_request_target, none check out the pull request head. 35 of 35 third-party actions pinned to a tag rather than a commit.
Network hosts26 distinct hosts referenced from source; most often github.com, appflowy.io, docs.rs, www.appflowy.io. No URLs to bare IP addresses.
Known vulnerabilities94 advisories across 823 pinned packages: 2 critical, 17 high, 23 moderate, 13 low, 39 unrated. frontend/rust-lib/Cargo.lock: 823 packages, 94 advisories.
Project hygieneHas licence file. Missing security policy, automated dependency updates, CodeQL, contributing guide.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Pattern hits (3)
WhereRuleMatch
frontend/scripts/docker-buildfiles/Dockerfile:23download-piped-to-shellRUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
frontend/scripts/install_dev_env/install_linux.sh:30download-piped-to-shellcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
install.sh:35download-piped-to-shell# if a curl|bash cuts off the end of the script due to
Installer scripts (5)
Worst known vulnerabilities (24 of 94)
AdvisorySeverityPackageSummary
GHSA-4684-h2q9-2vcpcriticalzip@0.6.6ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe…
GHSA-4684-h2q9-2vcpcriticalzip@2.2.0ZipStreamReader::extract() and ZipArchive::extract() apply Unix permissions through symlinks without confining the targe…
GHSA-h5x4-m2qf-r4f2highdiesel@2.2.10Diesel's SQLite backend has possible UTF-8 corruption
GHSA-6fj4-rcr3-r7rrhighlopdf@0.36.0lopdf has a stack overflow via deeply nested PDF objects
GHSA-vvp9-7p8x-rfvvhighlz4_flex@0.11.2lz4_flex's decompression can leak information from uninitialized memory or reused output buffer
GHSA-r8w9-5wcg-vfj7highmio@0.8.9Mio's tokens for named pipes may be delivered after deregistration
GHSA-rvr2-r3pv-5m4phighoneshot@0.1.11oneshot has potential Use After Free when used asynchronously
GHSA-8c75-8mhr-p7r9highopenssl@0.10.62rust-openssl has incorrect bounds assertion in aes key wrap
GHSA-ghm9-cr32-g9qjhighopenssl@0.10.62rust-openssl: rustMdCtxRef::digest_final() writes past caller buffer with no length check
GHSA-hppc-g8h3-xhp3highopenssl@0.10.62rust-openssl: Unchecked callback length in PSK/cookie trampolines leaks adjacent memory to peer
GHSA-pqf5-4pqq-29f5highopenssl@0.10.62rust-openssl: Deriver::derive and PkeyCtxRef::derive can overflow short buffers on OpenSSL 1.1.1
GHSA-xp3w-r5p5-63rrhighopenssl@0.10.62rust-openssl has undefined behavior in X509Ref::ocsp_responders for certificates with non-UTF-8 OCSP URLs
GHSA-4w2j-m93h-cj5jhighquinn-proto@0.11.9Quinn: Remote memory exhaustion in quinn-proto from unbounded out-of-order stream reassembly
GHSA-6xvm-j4wr-6v98highquinn-proto@0.11.9Quinn affected by unauthenticated remote DoS via panic in QUIC transport parameter parsing
GHSA-3g6h-r5qx-f6hqhighquinn-proto@0.11.9Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled
GHSA-82j2-j2ch-gfr8highrustls-webpki@0.102.8rustls-webpki: Denial of service via panic on malformed CRL BIT STRING
GHSA-vv5m-jxxh-4627highzip@0.6.6Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation
GHSA-94vh-gphv-8pm8highzip@2.2.0zip Incorrectly Canonicalizes Paths during Archive Extraction Leading to Arbitrary File Write
GHSA-vv5m-jxxh-4627highzip@2.2.0Insecure Preservation of SUID/SGID Bits during ZIP Extraction Leading to Potential Privilege Escalation
GHSA-423w-p2w9-r7vqmoderateaes-gcm@0.10.2AEADs/aes-gcm: Plaintext exposed in decrypt_in_place_detached even on tag verification failure
GHSA-434x-w66g-qw3rmoderatebytes@1.9.0bytes has integer overflow in BytesMut::reserve
GHSA-ggxf-9f6j-w742moderatediesel@2.2.10Diesel has possible use after free when deserializing a SQLite database via `SqliteConnection::deserialize_readonly_data…
GHSA-m9p2-fxp5-v3fpmoderatediesel@2.2.10Diesel: Command injection in Diesel's implementation of `COPY FROM`/`COPY TO`
GHSA-q8x8-jrhj-fh9pmoderatediesel@2.2.10Diesel: Possible unaligned data access for implementations of `SqliteAggregate`
Workflows worth a look

By the numbers

Stars77.8K
Forks6,092
Contributors381
Commits7,210
Open issues939
Open pull requests120
Releases153
Latest release0.14.11
LicenceAGPL-3.0
Main languageDart
Project age5 years
Last pushOct 26, 2026
Tracked files4,597
Lines of code202.4K
Checkout size40 MB

Lines by language: Rust 106.7K, JSON 79.3K, TOML 3,266, YAML 3,126, Markdown 2,639, C++ 2,450.

Questions

Is AppFlowy free?

Yes. The app is free and open source under AGPL-3.0, and you can use it locally or self-host the sync server at no cost. AppFlowy also sells paid plans for its hosted cloud.

Can I self-host AppFlowy?

Yes. The desktop and mobile apps can sync to an AppFlowy Cloud server you run yourself, so your workspace data stays on your own infrastructure. The server is a separate project with its own step-by-step self-hosting guide on appflowy.com.

Does AppFlowy work offline?

Yes. It is a native app that keeps your data on the device and syncs when it can reach AppFlowy Cloud or your self-hosted server. Used without a cloud account, it stays entirely local.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.