Logseq is a note-taking app built around an outliner. Every line is a block you can link, reference, tag and query, and each day opens on a journal page, so writing first and organising later comes naturally. Links work in both directions, a page shows everywhere it was mentioned, and a graph view shows how your notes connect. It runs on Windows, macOS, Linux, iOS and Android, with a plugin API and a large set of community plugins and themes.
It is privacy-first: your notes live on your own device and no account is needed. The design draws on Roam Research, Org mode, TiddlyWiki and Workflowy, and the project is AGPL-3.0 with 363 contributors and about 45,000 stars, at 2.0.2 when scanned.
The project is part-way through a big change. A new database version stores graphs in SQLite and adds real-time collaboration, and the README says it is in beta (with the new mobile app and collaboration in alpha) and that data loss is possible, so it recommends automated or regular backups. If your notes matter, keep backups whichever version you use.
- Repository: github.com/logseq/logseq
- Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
- Language: Clojure. Stars: 45.4K. Forks: 2,851. Last push: Oct 26, 2026.
- Scan: safe, Oct 26, 2026, commit a37eff1
Who it is for
Students, researchers and writers who keep daily notes and want them linked together, and people leaving Roam Research or Notion who want their notes in files on their own disk.
Getting started
1. Linux, per-user install with no root needed
curl -fsSL https://raw.githubusercontent.com/logseq/logseq/master/scripts/install-linux.sh | bash -s -- --user2. Linux, system-wide install (uses sudo)
curl -fsSL https://raw.githubusercontent.com/logseq/logseq/master/scripts/install-linux.sh | bashOn Windows and macOS, download the installer from the GitHub releases page; the web version is at app.logseq.com and the mobile apps are in the app stores. The Linux script is the same file the scan lists; the --user variant adds ~/.local/bin to your PATH in ~/.bashrc.
Safety scan
We cloned logseq/logseq at commit a37eff1 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 and no bare-IP URLs. The one pattern hit is the web app's Dockerfile installing Node.js with NodeSource's curl | bash setup script, a common way of building a container image that never runs on your machine.
- Installers: scripts/install-linux.sh (353 lines) downloads the release from GitHub, uses sudo for a system-wide install and, with --user, appends a PATH line to ~/.bashrc. deps/db-sync/start.sh is the sync server's development launcher, which points at AWS Cognito for sign-in. The postinstall hook in resources/package.json runs electron-builder's install-app-deps to rebuild native modules for Electron.
- 7 committed binaries: six builds of logseq-i18n-lint in bin/ (Linux, macOS and Windows, x86-64 and ARM), a translation checker used during development and built from Logseq's own logseq-i18n-lint Rust repository by the update-i18n-lint.yml workflow, plus the Android Gradle wrapper jar. None ships in the app.
- 386 known advisories across 13 pnpm lockfiles, 8 of them critical. Most sit in build and test tooling and in the sync server's dependencies (deps/db-sync). The critical one closest to users is Capacitor 8.3.1, the runtime of the mobile apps, with an advisory about remote content loading at the app's origin.
- 24 workflows. One uses pull_request_target (pr-labeler.yml); it runs actions/labeler on the branch name and does not check out the pull request. 1 of 92 third-party actions is pinned to a commit. Contributing guide and code of conduct present; no security policy or Dependabot. OpenSSF Scorecard 3.7 of 10.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | 1 pattern hit found and read; every one is listed under the raw findings. |
| Install-time code | 1 npm lifecycle script. 3 installer scripts (one edits your shell profile; one can call sudo) |
| Committed binaries | 7 executable or compiled objects committed; listed under the raw findings. |
| CI workflows | 24 workflows. 1 uses pull_request_target, none check out the pull request head. 91 of 92 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 36 distinct hosts referenced from source; most often github.com, tc39.es, esm.sh, api.logseq.io. No URLs to bare IP addresses. |
| Known vulnerabilities | 386 advisories across 1,878 pinned packages: 8 critical, 178 high, 163 moderate, 36 low, 1 unrated. cli/pnpm-lock.yaml: 104 packages, 11 advisories; deps/common/pnpm-lock.yaml: 2 packages, 0 advisories; deps/db-sync/pnpm-lock.yaml: 367 packages, 77 advisories; deps/db/pnpm-lock.yaml: 44 packages, 3 advisories; deps/graph-parser/pnpm-lock.yaml: 96 packages, 4 advisories; deps/outliner/pnpm-lock.yaml: 92 packages, 4 advisories; deps/publish/pnpm-lock.yaml: 69 packages, 3 advisories; deps/publishing/pnpm-lock.yaml: 96 packages, 4 advisories; libs/cljs-sdk/pnpm-lock.yaml: 15 packages, 19 advisories; libs/pnpm-lock.yaml: 310 packages, 73 advisories; pnpm-lock.yaml: 1,196 packages, 155 advisories; resources/pnpm-lock.yaml: 520 packages, 144 advisories; scripts/pnpm-lock.yaml: 96 packages, 4 advisories. |
| Project hygiene | Has licence file, contributing guide. Missing security policy, automated dependency updates, CodeQL. |
| OpenSSF Scorecard | 3.7 out of 10, as of Oct 19, 2026. |
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 (1)
| Where | Rule | Match |
|---|---|---|
| Dockerfile:20 | download-piped-to-shell | RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - && \ |
npm lifecycle scripts (1)
resources/package.jsonpostinstall:install-app-deps
Installer scripts (3)
- .agents/skills/logseq-repl/scripts/start-repl.sh, 6 lines
- deps/db-sync/start.sh, 18 lines; talks to cognito-idp.us-east-1.amazonaws.com
- scripts/install-linux.sh, 353 lines, uses sudo, edits your shell profile; talks to api.github.com, github.com
Committed binaries (7)
bin/logseq-i18n-lint-x86_64-linux: ELF, 3 MBbin/logseq-i18n-lint-x86_64-macos: Mach-O, 2 MBbin/logseq-i18n-lint-x86_64-windows.exe: PE (Windows executable), 2 MBbin/logseq-i18n-lint-aarch64-linux: ELF, 2 MBbin/logseq-i18n-lint-aarch64-macos: Mach-O, 2 MBbin/logseq-i18n-lint-aarch64-windows.exe: PE (Windows executable), 2 MBandroid/gradle/wrapper/gradle-wrapper.jar: JAR, 44 KB
Worst known vulnerabilities (24 of 386)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-jqcg-44mw-7w3h | critical | proxy-addr@2.0.7 | proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet |
| GHSA-rvm3-566m-v7fv | critical | @capacitor/android@8.3.1 | Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path |
| GHSA-rvm3-566m-v7fv | critical | @capacitor/ios@8.3.1 | Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path |
| GHSA-8r5x-fm3f-whwj | critical | handlebars@4.7.9 | Handlebars: JavaScript Injection via AST Type Confusion in compile (bypass of CVE-2026-33937) |
| GHSA-p8wg-vrv2-v86f | critical | handlebars@4.7.9 | Handlebars: JavaScript Injection via Own Property Check Bypass |
| GHSA-w7jw-789q-3m8p | critical | shell-quote@1.8.3 | shell-quote quote() does not escape newlines in object .op values |
| GHSA-23hp-3jrh-7fpw | critical | tar@6.2.1 | node-tar: Decompression/parse DoS via unlimited input |
| GHSA-23hp-3jrh-7fpw | critical | tar@7.5.13 | node-tar: Decompression/parse DoS via unlimited input |
| GHSA-28wg-ghj8-5hjv | high | nanoid@3.3.12 | nanoid: non-secure generators can loop indefinitely with negative size |
| GHSA-2v37-7h3g-55p8 | high | nanoid@3.3.12 | nanoid: custom generators can loop indefinitely when size is zero |
| GHSA-r28c-9q8g-f849 | high | postcss@8.5.15 | PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure |
| GHSA-68fv-2mgg-jv7q | high | source-map-js@1.2.1 | source-map-js allows event-loop denial of service through indexed source-map section offsets |
| GHSA-587h-7wmj-h5pm | high | vite@8.0.16 | launch-editor: `fs.existsSync()` existence check can be bypassed on Windows |
| GHSA-22jm-h49p-29qw | high | @modelcontextprotocol/sdk@1.29.0 | MCP TypeScript SDK: Experimental tasks were not tied to the session that created them |
| GHSA-46jr-4wx8-v453 | high | @modelcontextprotocol/sdk@1.29.0 | MCP TypeScript SDK: One HTTP request within the default size limit could exhaust server memory during validation |
| GHSA-6qxp-vccf-f47h | high | @modelcontextprotocol/sdk@1.29.0 | MCP TypeScript SDK: OAuth client could send credentials to an authorization server chosen by the MCP server |
| GHSA-27r3-jxmh-p828 | high | body-parser@2.3.0 | body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body |
| GHSA-3jxr-9vmj-r5cp | high | brace-expansion@5.0.4 | brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups |
| GHSA-6j4f-fj2g-mc7p | high | brace-expansion@5.0.4 | brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion |
| GHSA-mh99-v99m-4gvg | high | brace-expansion@5.0.4 | brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash |
| GHSA-qhr7-859c-m2p7 | high | brace-expansion@5.0.4 | brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion |
| GHSA-rgw5-rvv9-x895 | high | brace-expansion@5.0.4 | brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation |
| GHSA-5jgf-p345-68v8 | high | fast-uri@3.1.3 | fast-uri vulnerable to host confusion via skipped IDN canonicalization on scheme-relative references |
| GHSA-7p8r-x3mc-p8w7 | high | fast-uri@3.1.3 | fast-uri vulnerable to host confusion via backslash authority introducer |
Workflows worth a look
- .github/workflows/pr-labeler.yml: pull_request_target
By the numbers
| Stars | 45.4K |
|---|---|
| Forks | 2,851 |
| Contributors | 363 |
| Commits | 25.9K |
| Open issues | 815 |
| Open pull requests | 193 |
| Releases | 154 |
| Latest release | 2.0.2 |
| Licence | AGPL-3.0 |
| Main language | Clojure |
| Project age | 6 years |
| Last push | Oct 26, 2026 |
| Tracked files | 2,197 |
| Lines of code | 158.3K |
| Checkout size | 66 MB |
Lines by language: JSON 45.8K, JavaScript 37.2K, Markdown 23.5K, CSS 21.7K, TypeScript 7,466, Swift 5,972.
Questions
Is Logseq free?
Yes. Logseq is free and open source under AGPL-3.0, on desktop, web and mobile, with no account required. Development is supported by sponsors and backers on Open Collective.
Where does Logseq store my notes?
On your own device. The classic version keeps plain Markdown (or Org) files in a folder you choose. The new database version stores each graph in SQLite, and the README recommends turning on automated backups or making regular SQLite backups while it is in beta.
Logseq or Obsidian?
Both keep notes on your own disk and support two-way links. Logseq is open source and outliner-first, with every line a block and a daily journal at the centre. Obsidian is closed source and page-first, editing whole Markdown documents. Pick Logseq if you think in bullet points or want code you can read.
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.
