{"repo":"puneetsl/lotion","free":true,"listed":false,"github":"https://github.com/puneetsl/lotion","clone":"git clone https://github.com/puneetsl/lotion.git","description":"Unofficial Notion.so app for Linux","language":"JavaScript","stars":2210,"topics":["desktop","electron","electron-app","linux","linux-app","linux-notion","node","nodejs","notion"],"license":"MIT","category":"desktop_client","readme_excerpt":"<p align=\"center\">\n  <img width=\"35%\" height=\"35%\" src=\"./assets/Banner.png\" alt=\"Lotion — Unofficial Notion.so desktop app for Linux\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/sponsors/puneetsl\"><img src=\"https://img.shields.io/badge/Sponsor-%E2%9D%A4-pink?style=flat-square\" alt=\"Sponsor\"></a>\n  <img src=\"https://img.shields.io/badge/version-1.6.0-blue.svg\" alt=\"Version\">\n  <img src=\"https://img.shields.io/badge/platform-linux-lightgrey.svg\" alt=\"Platform\">\n  <img src=\"https://img.shields.io/badge/electron-41.7.0-9feaf9.svg\" alt=\"Electron\">\n  <img src=\"https://img.shields.io/badge/license-MIT-green.svg\" alt=\"License\">\n</p>\n\n---\n\n<div align=\"center\">\n<table><tr><td>\n<strong>💖 Like Lotion?</strong> &nbsp;Consider <a href=\"https://github.com/sponsors/puneetsl\">sponsoring on GitHub</a> to keep this and other Linux tools alive.\n</td></tr></table>\n</div>\n\n## What is Lotion?\n\nLotion is an unofficial, Electron-based desktop client for [Notion.so](https://www.notion.so), focused on Linux. Notion has historically not prioritized native Linux support:\n\n> *\"Hey we don't want to release on platforms that we cannot ensure the quality – the team is still small and we don't use Linux ourselves\"*\n> — Notion ([@NotionHQ](https://twitter.com/NotionHQ))\n\nLotion fills that gap with a modern multi-tab UI, theming, spell check, and the kind of desktop integration you'd expect from a native app.\n\n<p align=\"center\">\n  <img src=\"./assets/screenshot.png\" alt=\"Lotion screenshot\" width=\"90%\">\n</p>\n\n> **New to Notion?** Sign up [here](https://www.notion.so/?r=55d4c384b54a457490f6cc1799bedc76) and try it out.\n\n---\n\n## Features\n\n### Window & tabs\n- **Frameless window** with custom 32px title bar and integrated tab bar\n- **Multi-tab** with click-to-switch, drag-and-drop reordering, pinning, dynamic titles, and favicon support\n- **Tab overflow**: tabs shrink Chrome-style; once shrunk, mouse-wheel scrolls horizontally with subtle fade indicators showing hidden tabs\n- **Navigation controls** (back, forward, refresh) integrated into the tab bar\n- **Session restore** *(opt-in)* — quitting with tabs open restores them on next launch\n- **Native window decorations** *(opt-in)* — swap the custom frameless tab bar for your DE's window chrome + standard menu bar (single tab per window in this mode)\n\n### Theming\n- **10 built-in themes**: Default, Dracula, Nord, Gruvbox Dark, Monokai, Noir, Catppuccin Mocha / Macchiato / Frappe / Latte, Sakura\n- **System-theme sync**: picking a light theme (Sakura, Latte) auto-flips Notion's \"use system setting\" appearance to light; dark themes flip it back to dark\n- **Unified theming** — the tab bar matches whatever theme you pick\n- **Custom CSS** support — drop your own theme into `~/.config/Lotion/themes/<name>.css`\n\n### Other\n- **Spell check** — right-click misspelled words for suggestions; multi-language support (toggle from logo menu)\n- **External links** open in your default browser\n- **Zoom**: `Ctrl + +` / `Ctrl + =` / `Ctrl + -` / `Ctrl + 0` work across keyboard layouts (Spanish, German, etc.) — not just US\n\n---\n\n## Themes\n\nClick the Lotion logo (top-left) → **Theme** to pick one. Light/dark mode flips automatically to match the theme intent.\n\n<p align=\"center\">\n  <img src=\"./assets/theme.png\" alt=\"Catppuccin Mocha theme\" width=\"90%\">\n  <br><em>Catppuccin Mocha — tab bar and page content share the palette</em>\n</p>\n\n| Dark | Light |\n|---|---|\n| Dracula | Catppuccin Latte |\n| Nord | Sakura |\n| Gruvbox Dark | |\n| Monokai | |\n| Noir | |\n| Catppuccin Mocha | |\n| Catppuccin Macchiato | |\n| Catppuccin Frappe | |\n\n### Custom themes\n\nDrop a CSS file at `~/.config/Lotion/themes/<name>.css`. To target Notion's content, override its `--c-*` custom properties on the right selectors:\n\n```css\n/* Example: a teal-accented dark override.\n   Notion declares --c-* on .notion-dark-theme (on <body>), so the\n   override has to land on that selector (not just :root) — and\n   !important wins over Notion's own redeclarations. */\n:root,\n:root.dark,\n:root.light,\nbody,\nbody.notion-body,\n.notion-dark-theme,\n.notion-light-theme,\n.notion-app-inner {\n  --c-bacPri: #0f1419 !important;          /* page background */\n  --c-bacSec: #0a0f14 !important;          /* sidebar / cards */\n  --c-bacTer: #1c252e !important;          /* hover / elevated */\n  --c-icoPri: #e8e8e8 !important;          /* primary text + icons */\n  --c-icoSec: #45ada8 !important;          /* accent text + icons */\n  --c-palUiBlu600: #45ada8 !important;     /* Notion's primary blue → your accent */\n}\n```\n\nThen pick your theme from the logo menu, or pick **Reload Custom CSS** to re-inject after edits. Look at any file in [`assets/themes/`](./assets/themes/) for a complete template.\n\n---\n\n## Installation\n\n### Arch Linux\n\n> **Status:** the `lotion-bin` package isn't on the AUR yet. Build it locally from the PKGBUILD shipped in this repo — it downloads the official `.deb` artifact, so you get the same binary that ships in our GitHub release without running `npm install`.\n\n```bash\ngit clone https://github.com/puneetsl/lotion.git\ncd lotion\nmakepkg -si\n```\n\nThe `lotion` command is installed to `/usr/bin/lotion`, and a desktop entry shows up in your launcher.\n\nSee [`PKGBUILD.md`](./PKGBUILD.md) for how the packaging works, or [`knol/AUR_SUBMISSION.md`](./knol/AUR_SUBMISSION.md) if you want to maintain it on the AUR.\n\n### Debian / Ubuntu (`.deb`)\n\nGrab the `.deb` from [the latest release](https://github.com/puneetsl/lotion/releases/latest) and install:\n\n```bash\nsudo apt install ./lotion_1.6.0_amd64.deb\n# (apt handles missing dependencies automatically)\n```\n\n### Fedora / RHEL (`.rpm`)\n\n```bash\nsudo dnf install ./lotion-1.6.0-1.x86_64.rpm\n```\n\n### Portable / other distros (`.zip`)\n\nDownload `Lotion-linux-x64-1.6.0.zip` (or `arm64`) from [the latest release](https://github.com/puneetsl/lotion/releases/latest), extract, and run the `lotion` binary inside.\n\n### macOS\n\nThe release ships `Lotion-darwin-x64-1.6.0.zip` (Intel) and `Lotion-darwin-arm64-1.6.0.zip` (Apple Silicon).\n\n**macOS will complain about the app being damaged or from an unidentified developer.** This is because Lotion isn't signed with an Apple Developer ID certificate (the program costs $99/year — if you'd like to help, [sponsor on GitHub](https://github.com/sponsors/puneetsl)). The app is fine; macOS just adds a quarantine flag to anything downloaded via a browser, and Gatekeeper refuses to validate the unsigned signature. Two ways past it:\n\n```bash\n# A) Strip the quarantine attribute from the .zip before extracting:\nxattr -cr ~/Downloads/Lotion-darwin-arm64-1.6.0.zip\n# Then extract and double-click as normal.\n\n# B) Or, after extracting, strip it from the .app:\nxattr -cr /Applications/Lotion.app\n```\n\nAlternatively, **right-click → Open** (not double-click) the first time to bypass Gatekeeper interactively. After that first launch macOS remembers your decision.\n\n### Windows\n\nThe release ships `Lotion-1.6.0.Setup.exe` and `Lotion-win32-x64-1.6.0.zip` (also an ia32 build). Windows SmartScreen may flag the installer as \"Unrecognized\" for the same reason (no code-signing certificate); click **More info → Run anyway**. Primary target is Linux — Windows is best-effort.\n\n### From source (development)\n\n```bash\ngit clone git@github.com:puneetsl/lotion.git\ncd lotion\nnpm install\nnpm start            # runs in dev mode\nnpm run make:linux   # builds .deb / .rpm / .zip into out/\n```\n\n---\n\n## Keyboard shortcuts\n\n| Action | Shortcut |\n|---|---|\n| Zoom in | `Ctrl + =` or `Ctrl + +` |\n| Zoom out | `Ctrl + -` |\n| Reset zoom | `Ctrl + 0` |\n| Back | `Alt + Left` |\n| Forward | `Alt + Right` |\n| Refresh | `Ctrl + R` |\n| Home (open notion.so root) | `Ctrl + H` |\n| Preferences | `Ctrl + ,` |\n| Quit | `Ctrl + Q` |\n| Toggle DevTools (dev mode) | `Ctrl + Shift + I` / `F12` |\n\nThe zoom shortcuts use the `=` key rather than the `+` symbol, so they work consistently across keyboard layouts.\n\n---\n\n## Configuration\n\nUser data and preferences live in:\n\n- **App config**: `~/.config/Lotion/config.json`\n- **Themes (user overrides)**: `~/.config/Lotion/themes/<name>.css`\n- **Custom CSS injection**: `~/.config/Lotion/custom.css`\n- **Logs**: `~/.config/Lotion/logs/main.log`\n- **Cache**: `~/.cache/Lotion/`\n\nMost preferences are toggled from the logo popup menu (top-left), including theme selection, spell check, \"Restore Tabs on Startup\", and \"Use Native Window Decorations\".\n\n---\n\n## Development\n\n```\nlotion/\n├── src/\n│   ├── main/                       # Electron main process\n│   │   ├── controllers/            # AppController, WindowController, TabController\n│   │   ├── managers/TabManager.js\n│   │   ├── store/                  # Redux store + slices (tabs, windows, app)\n│   │   ├── index.js                # Main entry: menus, IPC, app lifecycle\n│   │   └── spellCheckMenu.js\n│   └── renderer/\n│       ├── preload.js              # Main preload (context bridge)\n│       └── tab-bar/                # Custom tab bar (vanilla JS)\n│           ├── index.html\n│           ├── renderer.js\n│           └── preload.js\n├── assets/\n│   ├── themes/                     # Bundled theme CSS (Dracula, Nord, ...)\n│   ├── icons/                      # Multi-size app icons\n│   └── lotion.desktop              # Linux .desktop entry\n├── config/config.json              # Build-time config (Notion base URL)\n├── i18n/                           # Locale strings\n└── PKGBUILD                        # Arch lotion-bin package\n```\n\n**Stack**: Electron 41 + Electron Forge 7 (build/packaging), Redux Toolkit (state in the main process), vanilla JS for the tab bar (no React in the renderer), React 18 available for future UI work.\n\n**Tab architecture**: each tab is a `WebContentsView` parented to a single `BrowserWindow`. The tab bar lives in a separate `WebContentsView` at the top of the window. Redux state in the main process is the source of truth; the renderer subscribes via IPC events.\n\n### Useful scripts\n\n```bash\nnpm start             # dev mode\nnpm run package       # build app bundle","default_branch":"master","files":94,"tree":[".github/FUNDING.yml",".github/agents/aur-debugger-builder.md",".github/workflows/build-and-release.yml",".github/workflows/release.yml",".github/workflows/test-arch-install.yml",".github/workflows/test.yml",".gitignore","CHANGELOG.md","LICENSE","PKGBUILD","PKGBUILD.md","README.md","assets/Banner.png","assets/icon.icns","assets/icon.ico","assets/icon.png","assets/icons/128x128.png","assets/icons/16x16.png","assets/icons/256x256.png","assets/icons/32x32.png","assets/icons/48x48.png","assets/icons/512x512.png","assets/icons/64x64.png","assets/lotion.desktop","assets/screenshot.png","assets/theme.png","assets/themes/catppuccin-frappe.css","assets/themes/catppuccin-latte.css","assets/themes/catppuccin-macchiato.css","assets/themes/catppuccin-mocha.css","assets/themes/dracula.css","assets/themes/gruvbox-dark.css","assets/themes/monokai.css","assets/themes/noir.css","assets/themes/nord.css","assets/themes/sakura.css","build.js","config/config.js","config/config.json","forgeInterfaces.js","i18n/da_DK/messages.json","i18n/de_DE/messages.json","i18n/default/messages.json","i18n/es_ES/messages.json","i18n/es_LA/messages.json","i18n/fi_FI/messages.json","i18n/fr_FR/messages.json","i18n/ja_JP/messages.json","i18n/ko_KR/messages.json","i18n/messageKeyToFileMapping.json","i18n/nb_NO/messages.json","i18n/nl_NL/messages.json","i18n/pseudo/ko/messages.json","i18n/pseudo/messages.json","i18n/pt_BR/messages.json","i18n/sv_SE/messages.json","i18n/zh_CN/messages.json","i18n/zh_TW/messages.json","knol/ARCHITECTURE_ANALYSIS.md","knol/AUR_SUBMISSION.md","knol/IMPLEMENTATION_PROGRESS.md","knol/NOTION_ENHANCER_INTEGRATION.md","knol/V1.5_ROADMAP.md","knol/V1.6_FEATURE_REQUESTS.md","package-lock.json","package.json","playwright.config.js","scripts/launch.sh","src/main/controllers/AppController.js","src/main/controllers/TabController.js","src/main/controllers/WindowController.js","src/main/index.js","src/main/managers/TabManager.js","src/main/spellCheckMenu.js","src/main/store/selectors/tabSelectors.js","src/main/store/selectors/windowSelectors.js","src/main/store/slices/appSlice.js","src/main/store/slices/tabSpacesSlice.js","src/main/store/slices/tabsSlice.js","src/main/store/slices/windowsSlice.js","src/main/store/store.js","src/renderer/index.html","src/renderer/index.js","src/renderer/preload.js","src/renderer/service-worker.js","src/renderer/tab-bar/index.html","src/renderer/tab-bar/logo.png","src/renderer/tab-bar/preload.js","src/renderer/tab-bar/renderer.js","tsconfig.json","webpack.main.config.js","webpack.plugins.js","webpack.renderer.config.js","webpack.rules.js"],"storefront":"/r/puneetsl","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/puneetsl/lotion/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}