Nodal is an open-source, desktop note-taking app with a Discord-inspired interface. Folders act like servers — select one from the sidebar and your notes appear as a scrollable message feed. Write in plain text or Markdown, and keep everything organized on your local filesystem.
- 📁 Folder-as-server layout — your note folders are listed in a sidebar just like Discord servers, click one to open its note feed
- 📝 Discord-style note feed — notes inside a folder are displayed as a chronological message list
- ✍️ Markdown support — write notes in Markdown with a built-in CodeMirror editor and rendered preview
- 📎 Attachment support — attach files to your notes
- 🗂️ Custom notes directory — choose any directory on your machine as the root for your notes
- 🎨 Theming — light and dark mode support via a theme store
- ⚡ Fast & local — built on Electron; all notes are stored as plain files on disk, no account or internet connection required
- 🔄 Auto Updater — built-in update mechanism using
electron-updater
- Node.js 18+
- Bun
- Git
git clone https://github.com/your-username/nodal.git
cd nodalbun installbun run devThis starts both the Vite dev server and Electron in development mode with hot reload.
├── electron/ # Electron main process
│ ├── main.ts # Main process entry point
│ ├── preload.ts # Preload script for IPC
│ ├── update.ts # Auto-updater logic
│ └── electron-env.d.ts # TypeScript definitions
├── src/ # React renderer source
│ ├── App.tsx # Root layout (Sidebar + Navbar + Notes feed)
│ ├── main.tsx # React entry point
│ ├── index.css # Global stylesheet & CSS variables
│ ├── components/
│ │ ├── sidebar.tsx # Folder list (the "server" sidebar)
│ │ ├── navbar.tsx # Top bar for the active folder
│ │ ├── create-folder-dialog.tsx # Dialog for creating a new folder
│ │ ├── folder-select-dialog.tsx # Dialog for choosing the notes directory
│ │ ├── notes/
│ │ │ ├── notes-container.tsx # Scrollable note feed
│ │ │ ├── note-item.tsx # Individual note / message bubble
│ │ │ ├── notes-input.tsx # Compose bar for new notes
│ │ │ └── markdown-editor.tsx # CodeMirror-based Markdown editor
│ │ ├── providers/ # React context providers
│ │ └── ui/ # Reusable shadcn/ui components
│ └── lib/
│ ├── types.ts # Shared TypeScript types (Note, etc.)
│ ├── utils.ts # Utility helpers
│ └── hooks/store/
│ ├── use-app-store.ts # Zustand store (folders, notes, directory)
│ └── use-theme-store.ts # Zustand store (light/dark theme)
├── public/ # Static assets
├── docs/ # Documentation assets (screenshots, etc.)
├── electron-builder.json # Electron Builder configuration
├── vite.config.ts # Vite configuration
├── components.json # shadcn/ui configuration
└── package.json # Dependencies and scripts
| Discord concept | Nodal equivalent |
|---|---|
| Server | Folder |
| Channel | (the folder itself) |
| Message | Note |
- On first launch, choose a notes directory — the root folder where Nodal will read and write your notes.
- Create folders from the sidebar. Each folder appears like a server icon.
- Select a folder to open its note feed.
- Type a note in the compose bar at the bottom and press Enter (or click Send). Notes support full Markdown syntax.
- Notes are persisted as files inside the chosen directory, so they remain accessible with any text editor outside of Nodal.
| Script | Description |
|---|---|
bun run dev |
Start Electron + Vite in development mode with hot reload |
bun run build |
Compile TypeScript, bundle with Vite, and package with Electron Builder |
bun run build:ci |
TypeScript + Vite build only (no packaging) |
bun run lint |
Run ESLint across the project |
bun run preview |
Preview the Vite production build |
bun run buildPackaged output is placed in the release/ directory:
- Windows —
.exeNSIS installer - macOS —
.dmgdisk image - Linux —
.AppImageand.debpackages
Nodal includes an automatic update system powered by electron-updater:
- Checks for updates on launch
- Shows download progress and notifications
- Configured via
electron-builder.json→publish
To enable auto-updates for your own fork:
- Create a GitHub repository for releases.
- Update
electron-builder.jsonwith yourownerandrepo. - Add a
RELEASE_PUSH_TOKENsecret to your repository (a GitHub token withreposcope). - Push a tag matching
v*— GitHub Actions will build and publish the release automatically.
| Layer | Technology |
|---|---|
| Desktop shell | Electron |
| Build tool | Vite |
| UI framework | React 18 |
| Language | TypeScript |
| Styling | Tailwind CSS v4 |
| Component library | shadcn/ui |
| State management | Zustand |
| Code editor | CodeMirror 6 via @uiw/react-codemirror |
| Markdown rendering | react-markdown + remark-gfm |
| Persistence | electron-store |
| Icons | Remix Icon + Lucide |
Contributions are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feat/my-feature) - Commit your changes
- Open a pull request
Please make sure bun run lint passes before submitting.
This project is licensed under the MIT License — see the LICENSE file for details.
