Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ jobs:
# front-end build would serialise it for nothing: it validates Rust, not the bundle.
- name: Placeholder frontendDist
run: |
mkdir -p dist/devbox/browser
printf '<!doctype html><title>ci</title>' > dist/devbox/browser/index.html
mkdir -p dist/devnotes/browser
printf '<!doctype html><title>ci</title>' > dist/devnotes/browser/index.html

- run: cargo fmt --manifest-path src-tauri/Cargo.toml --check

Expand Down Expand Up @@ -99,7 +99,7 @@ jobs:
- uses: actions/upload-artifact@v7
with:
name: front-dist
path: dist/devbox/browser
path: dist/devnotes/browser
retention-days: 1

build-rust:
Expand All @@ -117,8 +117,8 @@ jobs:

- name: Placeholder frontendDist
run: |
mkdir -p dist/devbox/browser
printf '<!doctype html><title>ci</title>' > dist/devbox/browser/index.html
mkdir -p dist/devnotes/browser
printf '<!doctype html><title>ci</title>' > dist/devnotes/browser/index.html

- name: Build
run: |
Expand Down Expand Up @@ -164,7 +164,7 @@ jobs:
path: coverage
retention-days: 7

# ⚠️ Windows is not redundant with Ubuntu here. DevBox ships primarily to Windows, and the
# ⚠️ Windows is not redundant with Ubuntu here. DevNotes ships primarily to Windows, and the
# back-end reasons about `app_data_dir()`, path separators, file locking and SQLite — all of
# which differ. Until this leg existed, nothing blocking ever ran the tests on the platform
# most users are on: `test-e2e` covers Windows but is `continue-on-error`.
Expand Down Expand Up @@ -207,8 +207,8 @@ jobs:

- name: Placeholder frontendDist
run: |
mkdir -p dist/devbox/browser
printf '<!doctype html><title>ci</title>' > dist/devbox/browser/index.html
mkdir -p dist/devnotes/browser
printf '<!doctype html><title>ci</title>' > dist/devnotes/browser/index.html

- name: Test
run: |
Expand Down Expand Up @@ -267,7 +267,7 @@ jobs:
- run: npm ci

# `tauri build` chains `beforeBuildCommand` (the e2e front-end build) then cargo. The
# binary it produces carries the `com.devbox.app.e2e` identifier, so its profile is its
# binary it produces carries the `com.devnotes.app.e2e` identifier, so its profile is its
# own: it cannot overwrite an existing library.
- name: Build the e2e binary
run: |
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ jobs:
run: |
pkg=$(node -p "require('./package.json').version")
npm_lock=$(node -p "require('./package-lock.json').packages[''].version")
cargo_lock=$(awk '/^name = "devbox"$/{f=1;next} f&&/^version = /{print;exit}' \
cargo_lock=$(awk '/^name = "devnotes"$/{f=1;next} f&&/^version = /{print;exit}' \
src-tauri/Cargo.lock | cut -d'"' -f2)
echo "Cargo.toml=$VERSION package.json=$pkg package-lock=$npm_lock Cargo.lock=$cargo_lock"
for found in "$pkg" "$npm_lock" "$cargo_lock"; do
Expand Down Expand Up @@ -269,7 +269,7 @@ jobs:
#
# ⚠️ The version comes from `prepare` and not from `GITHUB_REF_NAME`: on a
# `workflow_dispatch` the latter is `main`, and the binaries would be called
# `devbox-main-windows.exe`.
# `devnotes-main-windows.exe`.
- name: Gather installers and the standalone executable
env:
VERSION: ${{ needs.prepare.outputs.version }}
Expand All @@ -282,9 +282,9 @@ jobs:
# The bundler does not collect the bare binary; renaming it keeps the two operating
# systems from overlapping in the release.
if [ '${{ matrix.target }}' = 'windows' ]; then
cp src-tauri/target/release/devbox.exe "release/devbox-${VERSION}-windows.exe"
cp src-tauri/target/release/devnotes.exe "release/devnotes-${VERSION}-windows.exe"
else
cp src-tauri/target/release/devbox "release/devbox-${VERSION}-linux"
cp src-tauri/target/release/devnotes "release/devnotes-${VERSION}-linux"
fi
ls -l release

Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

Notable changes to DevBox, newest first.
Notable changes to DevNotes, newest first.

**The newest section is generated.** `.github/workflows/release.yml` writes it from the pull
requests merged since the last tag, then commits it **before** creating the tag — this file is
Expand Down Expand Up @@ -74,7 +74,7 @@ the release notes the updater hands over.
- Keep the comments that say what the code cannot (#128)
- Refilm the README, and drop the screenshot the GIF repeats (#113)
- Give a card title its width back, and plant the pin in the corner (#114)
- Say which platforms DevBox ships for, and stop implying macOS (#110)
- Say which platforms DevNotes ships for, and stop implying macOS (#110)
- Make the e2e suite pass, and fix the data loss it was reporting
- Film the README on a full board (#105)
- Show a note created while its editor was closing (#104)
Expand Down
19 changes: 10 additions & 9 deletions CLAUDE.md

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Contributing to DevBox
# Contributing to DevNotes

Thanks for taking the time. This file covers what the compiler and CI cannot tell you: the
handful of conventions that are load-bearing, and where the traps are.

DevBox is licensed under the [GNU GPL v3.0](LICENSE). Opening a pull request means you agree
DevNotes is licensed under the [GNU GPL v3.0](LICENSE). Opening a pull request means you agree
to have your contribution distributed under those terms.

## Getting set up
Expand Down Expand Up @@ -51,7 +51,7 @@ you use day to day.
| ----------------------- | ------------------------------------------------------- |
| `npm start` | Angular dev server only, port 1420 |
| `npm run tauri dev` | The main loop: Angular dev server plus the Tauri window |
| `npm run build` | Production Angular build, into `dist/devbox/browser` |
| `npm run build` | Production Angular build, into `dist/devnotes/browser` |
| `npm run tauri build` | Full production build, into `src-tauri/target/release` |
| `npm test` | Unit tests (Vitest on jsdom — no browser needed) |
| `npm run test:watch` | The same, re-running on change |
Expand Down Expand Up @@ -95,7 +95,7 @@ read it before a structural change, and keep it in step when you make one.
**Migrations are append-only.** A model change means a new `src-tauri/migrations/`
directory, never an edit to one that already shipped — it has already run on installed
databases. `src-tauri/src/db/schema.rs` is **hand-written**, not generated, so a new column
means editing both it and the SQL. Deleting `app_data_dir()/devbox.sqlite3` is a legitimate
means editing both it and the SQL. Deleting `app_data_dir()/devnotes.sqlite3` is a legitimate
reset while developing.

**The IPC surface is generated.** `src/app/core/ipc/bindings.ts` comes from the Rust
Expand Down
66 changes: 33 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DevBox
# DevNotes

[![CI](https://github.com/vmillet-dev/devbox-rs/actions/workflows/ci.yml/badge.svg)](https://github.com/vmillet-dev/devbox-rs/actions/workflows/ci.yml)
[![Latest release](https://img.shields.io/github/v/release/vmillet-dev/devbox-rs)](https://github.com/vmillet-dev/devbox-rs/releases/latest)
[![CI](https://github.com/vmillet-dev/devnotes-rs/actions/workflows/ci.yml/badge.svg)](https://github.com/vmillet-dev/devnotes-rs/actions/workflows/ci.yml)
[![Latest release](https://img.shields.io/github/v/release/vmillet-dev/devnotes-rs)](https://github.com/vmillet-dev/devnotes-rs/releases/latest)
[![License: GPL v3](https://img.shields.io/badge/license-GPL--3.0-blue)](LICENSE)

A notes and snippets manager for developers, on the desktop. Write a snippet once, find it
Expand All @@ -10,7 +10,7 @@ by tag or by full text, and paste it into any application from a global shortcut
Search it, narrow it by tag, open it — and from any application, `Ctrl+Alt+P` brings up the
palette, where `Enter` copies and the window steps aside:

![A tour of DevBox: the board of notes, a search narrowing it and quoting the line that matched, a tag filter, a note open in the editor, then the quick-paste palette asking a snippet for its fields](docs/quick-paste.gif)
![A tour of DevNotes: the board of notes, a search narrowing it and quoting the line that matched, a tag filter, a note open in the editor, then the quick-paste palette asking a snippet for its fields](docs/quick-paste.gif)

Everything stays on your machine, encrypted with a passphrase you choose and type once at
launch. Nothing is uploaded, there is no account, and the application works with the network
Expand All @@ -28,7 +28,7 @@ off.
| **Bulk actions** | select several notes, then move, tag, export or trash them in one go |
| **Tag management** | rename, merge or drop a tag across the whole library |
| **Attachments** | drop a file on the editor or paste an image; open it, save it elsewhere, preview it inline |
| **Import / export** | a `.devbox` archive both ways, attachments included — everything, one space, or the selection |
| **Import / export** | a `.devnotes` archive both ways, attachments included — everything, one space, or the selection |
| **Copy as Markdown** | the selection rendered for a pull request, a ticket or a chat message |
| **Encrypted at rest** | one passphrase at launch; notes and attachments sealed on disk, exports optionally too |

Expand All @@ -37,7 +37,7 @@ English, and it ships with a light and a dark theme.

## Your library is encrypted

DevBox asks for a passphrase the first time it runs, and once at every launch after that.
DevNotes asks for a passphrase the first time it runs, and once at every launch after that.
It is what opens the library, and it is never stored anywhere — not in a keychain, not
behind a "remember me". While the application runs the key lives in memory and nowhere
else.
Expand All @@ -55,35 +55,35 @@ What is sealed on disk: note titles, bodies and sources, checklist items, space
library. An export written in the clear is the only copy that does not depend on it.

⚠️ **Opening an attachment** writes a decrypted copy — inside your own profile, never the
shared temporary folder — because the program that opens it reads from disk. DevBox deletes
shared temporary folder — because the program that opens it reads from disk. DevNotes deletes
those copies when it quits, and sweeps whatever survived — a file another application still
held, a crash — at the next launch.

An export is the one file meant to leave the machine, so it is offered a key of its own:
give it a passphrase and it travels sealed, attachments included, or write it in the clear
for a file any DevBox can read. The application asks which, every time, and says which one
for a file any DevNotes can read. The application asks which, every time, and says which one
it wrote.

## Where your library lives, and how it is backed up

Two files, and they only mean anything together — the database is sealed, and the key
file is what opens it:

| | |
| ----------- | -------------------------------- |
| **Windows** | `%APPDATA%\com.devbox.app\` |
| **Linux** | `~/.local/share/com.devbox.app/` |
| | |
| ----------- | ---------------------------------- |
| **Windows** | `%APPDATA%\com.devnotes.app\` |
| **Linux** | `~/.local/share/com.devnotes.app/` |

In it: `devbox.sqlite3`, `vault.json`, `attachments/`, and `preferences.json`. ⚠️ Copy the
In it: `devnotes.sqlite3`, `vault.json`, `attachments/`, and `preferences.json`. ⚠️ Copy the
database without the key file and you have copied something nobody can open again.

DevBox takes a **rolling copy at launch**, at most one a day, and keeps the last three in
DevNotes takes a **rolling copy at launch**, at most one a day, and keeps the last three in
`backups/`. Each one is a full library — database and key file together — so restoring is
copying a folder back. It is written with `VACUUM INTO` rather than by copying the file,
because under WAL the database on its own is not a consistent snapshot. Turn it off in
Preferences → Security if you would rather it did not.

DevBox also checks the database is still sound every time it opens one. If it is not, it
DevNotes also checks the database is still sound every time it opens one. If it is not, it
says so rather than starting on it, and offers to set it aside: the database, its
attachments and whatever could still be rescued from it move into `damaged/`, and the next
unlock starts on a fresh library. Your passphrase does not change — so what was set aside,
Expand All @@ -95,34 +95,34 @@ For that, export somewhere else — or copy that folder to another machine.

## Install

DevBox runs on **Windows and Linux**. There is no macOS build: it cannot be tested here,
DevNotes runs on **Windows and Linux**. There is no macOS build: it cannot be tested here,
and Gatekeeper wants a paid Apple Developer account with no free way around it on recent
versions — shipping for a platform that can be neither tested nor distributed would be a
promise nobody can keep.

Download from the [latest release](https://github.com/vmillet-dev/devbox-rs/releases/latest).
Download from the [latest release](https://github.com/vmillet-dev/devnotes-rs/releases/latest).

**Windows**

| File | Pick it if |
| -------------------------------- | -------------------------------------------------------------- |
| `devbox_<version>_x64-setup.exe` | You just want DevBox installed. This is the one to take. |
| `devbox_<version>_x64_en-US.msi` | You deploy software through group policy or a management tool. |
| `devbox-<version>-windows.exe` | You want no installer at all — run it from where it lands. |
| File | Pick it if |
| ---------------------------------- | -------------------------------------------------------------- |
| `devnotes_<version>_x64-setup.exe` | You just want DevNotes installed. This is the one to take. |
| `devnotes_<version>_x64_en-US.msi` | You deploy software through group policy or a management tool. |
| `devnotes-<version>-windows.exe` | You want no installer at all — run it from where it lands. |

**Linux**

| File | Pick it if |
| --------------------------------- | ------------------------------------- |
| `devbox_<version>_amd64.AppImage` | Any distribution, nothing to install. |
| `devbox_<version>_amd64.deb` | Debian, Ubuntu and derivatives. |
| `devbox-<version>-1.x86_64.rpm` | Fedora, RHEL and derivatives. |
| `devbox-<version>-linux` | The bare executable, no packaging. |
| File | Pick it if |
| ----------------------------------- | ------------------------------------- |
| `devnotes_<version>_amd64.AppImage` | Any distribution, nothing to install. |
| `devnotes_<version>_amd64.deb` | Debian, Ubuntu and derivatives. |
| `devnotes-<version>-1.x86_64.rpm` | Fedora, RHEL and derivatives. |
| `devnotes-<version>-linux` | The bare executable, no packaging. |

```bash
chmod +x devbox_*_amd64.AppImage # make the AppImage runnable, then launch it
sudo apt install ./devbox_*_amd64.deb # Debian and Ubuntu — pulls in what it needs
sudo dnf install ./devbox-*.x86_64.rpm # Fedora and RHEL
chmod +x devnotes_*_amd64.AppImage # make the AppImage runnable, then launch it
sudo apt install ./devnotes_*_amd64.deb # Debian and Ubuntu — pulls in what it needs
sudo dnf install ./devnotes-*.x86_64.rpm # Fedora and RHEL
```

On Windows, the installer and the MSI are opened by double-clicking them; the standalone
Expand All @@ -131,7 +131,7 @@ On Windows, the installer and the MSI are opened by double-clicking them; the st
Updates are offered inside the application, so you only download by hand once.

Windows shows a SmartScreen warning the first time — choose **More info**, then **Run
anyway**. It is about the identity of the publisher, not about the file: DevBox has no
anyway**. It is about the identity of the publisher, not about the file: DevNotes has no
code-signing certificate, while its updates are signed with minisign and verified before
they install. Every release also publishes `SHA256SUMS.txt`.

Expand Down Expand Up @@ -169,7 +169,7 @@ IPC surface between them is generated from the Rust signatures.

## License

DevBox is free software under the [GNU General Public License v3.0](LICENSE). You may use,
DevNotes is free software under the [GNU General Public License v3.0](LICENSE). You may use,
study, share and modify it; a distributed fork has to stay under the same terms and ship its
source.

Expand Down
6 changes: 3 additions & 3 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"analytics": false
},
"projects": {
"devbox": {
"devnotes": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
Expand Down Expand Up @@ -92,10 +92,10 @@
},
"configurations": {
"production": {
"buildTarget": "devbox:build:production"
"buildTarget": "devnotes:build:production"
},
"development": {
"buildTarget": "devbox:build:development"
"buildTarget": "devnotes:build:development"
}
},
"defaultConfiguration": "development"
Expand Down
Loading