6 min read

Logseq: Private, Open-Source Outliner for Notes and Knowledge (GitHub, Scanned)

A privacy-first outliner for notes, journals and linked knowledge, stored on your own device.

Logseq logo
✅
Scan: safe. Nothing malicious. The notes: the new database version is beta and the project warns that data loss is possible, and the Linux installer is a curl | bash script that uses sudo unless you choose the per-user install. Scanned Oct 26, 2026; the full report is below.

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 -- --user

2. Linux, system-wide install (uses sudo)

curl -fsSL https://raw.githubusercontent.com/logseq/logseq/master/scripts/install-linux.sh | bash

On 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

CheckResult
SecretsNone found.
Suspicious code1 pattern hit found and read; every one is listed under the raw findings.
Install-time code1 npm lifecycle script. 3 installer scripts (one edits your shell profile; one can call sudo)
Committed binaries7 executable or compiled objects committed; listed under the raw findings.
CI workflows24 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 hosts36 distinct hosts referenced from source; most often github.com, tc39.es, esm.sh, api.logseq.io. No URLs to bare IP addresses.
Known vulnerabilities386 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 hygieneHas licence file, contributing guide. Missing security policy, automated dependency updates, CodeQL.
OpenSSF Scorecard3.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)
WhereRuleMatch
Dockerfile:20download-piped-to-shellRUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - && \
npm lifecycle scripts (1)
  • resources/package.json postinstall: install-app-deps
Installer scripts (3)
Committed binaries (7)
  • bin/logseq-i18n-lint-x86_64-linux: ELF, 3 MB
  • bin/logseq-i18n-lint-x86_64-macos: Mach-O, 2 MB
  • bin/logseq-i18n-lint-x86_64-windows.exe: PE (Windows executable), 2 MB
  • bin/logseq-i18n-lint-aarch64-linux: ELF, 2 MB
  • bin/logseq-i18n-lint-aarch64-macos: Mach-O, 2 MB
  • bin/logseq-i18n-lint-aarch64-windows.exe: PE (Windows executable), 2 MB
  • android/gradle/wrapper/gradle-wrapper.jar: JAR, 44 KB
Worst known vulnerabilities (24 of 386)
AdvisorySeverityPackageSummary
GHSA-jqcg-44mw-7w3hcriticalproxy-addr@2.0.7proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet
GHSA-rvm3-566m-v7fvcritical@capacitor/android@8.3.1Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path
GHSA-rvm3-566m-v7fvcritical@capacitor/ios@8.3.1Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path
GHSA-8r5x-fm3f-whwjcriticalhandlebars@4.7.9Handlebars: JavaScript Injection via AST Type Confusion in compile (bypass of CVE-2026-33937)
GHSA-p8wg-vrv2-v86fcriticalhandlebars@4.7.9Handlebars: JavaScript Injection via Own Property Check Bypass
GHSA-w7jw-789q-3m8pcriticalshell-quote@1.8.3shell-quote quote() does not escape newlines in object .op values
GHSA-23hp-3jrh-7fpwcriticaltar@6.2.1node-tar: Decompression/parse DoS via unlimited input
GHSA-23hp-3jrh-7fpwcriticaltar@7.5.13node-tar: Decompression/parse DoS via unlimited input
GHSA-28wg-ghj8-5hjvhighnanoid@3.3.12nanoid: non-secure generators can loop indefinitely with negative size
GHSA-2v37-7h3g-55p8highnanoid@3.3.12nanoid: custom generators can loop indefinitely when size is zero
GHSA-r28c-9q8g-f849highpostcss@8.5.15PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure
GHSA-68fv-2mgg-jv7qhighsource-map-js@1.2.1source-map-js allows event-loop denial of service through indexed source-map section offsets
GHSA-587h-7wmj-h5pmhighvite@8.0.16launch-editor: `fs.existsSync()` existence check can be bypassed on Windows
GHSA-22jm-h49p-29qwhigh@modelcontextprotocol/sdk@1.29.0MCP TypeScript SDK: Experimental tasks were not tied to the session that created them
GHSA-46jr-4wx8-v453high@modelcontextprotocol/sdk@1.29.0MCP TypeScript SDK: One HTTP request within the default size limit could exhaust server memory during validation
GHSA-6qxp-vccf-f47hhigh@modelcontextprotocol/sdk@1.29.0MCP TypeScript SDK: OAuth client could send credentials to an authorization server chosen by the MCP server
GHSA-27r3-jxmh-p828highbody-parser@2.3.0body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body
GHSA-3jxr-9vmj-r5cphighbrace-expansion@5.0.4brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups
GHSA-6j4f-fj2g-mc7phighbrace-expansion@5.0.4brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion
GHSA-mh99-v99m-4gvghighbrace-expansion@5.0.4brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash
GHSA-qhr7-859c-m2p7highbrace-expansion@5.0.4brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion
GHSA-rgw5-rvv9-x895highbrace-expansion@5.0.4brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation
GHSA-5jgf-p345-68v8highfast-uri@3.1.3fast-uri vulnerable to host confusion via skipped IDN canonicalization on scheme-relative references
GHSA-7p8r-x3mc-p8w7highfast-uri@3.1.3fast-uri vulnerable to host confusion via backslash authority introducer
Workflows worth a look

By the numbers

Stars45.4K
Forks2,851
Contributors363
Commits25.9K
Open issues815
Open pull requests193
Releases154
Latest release2.0.2
LicenceAGPL-3.0
Main languageClojure
Project age6 years
Last pushOct 26, 2026
Tracked files2,197
Lines of code158.3K
Checkout size66 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.