diff --git a/.gitignore b/.gitignore index 9fa0a67..e11c536 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store .build/ +.swiftpm/ .mise.local.toml ShelfNote.app/ *.jpeg diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4d418bc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 froppa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index eae534a..21a5fb7 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,48 @@ # Jot -Fast, local-first capture for ideas, tasks, things to read, and general notes. It is a small native macOS app: type a thought, put it in a simple bucket, pin the few things that should stay visible, and get back to work. +A small native macOS app for capturing notes without an account or network +connection. Write something down, sort it into a category, and pin the notes +you want to keep visible. + +![Jot showing sample notes in the Inbox](docs/screenshot.png) ## What it does -- Captures **Ideas**, **Tasks**, **Read Later**, and **Notes** locally with SwiftData. -- Keeps a pinned shelf for the important few. -- Searches notes and schedules optional local reminders. -- Works without an account or network connection. +- Stores notes locally with SwiftData. +- Groups them into Inbox, Notes, Ideas, Tasks, and Read Later. +- Supports editing, search within a category, and a pinned shelf. +- Displays inline Markdown formatting while keeping the original text. -## Run and install +## Build and run -Requires macOS 14+, Xcode, and [mise](https://mise.jdx.dev/). Install mise with `brew install mise`, then verify the Xcode toolchain and run the app: +Requires macOS 14+, Xcode, and [mise](https://mise.jdx.dev/). +Jot uses Xcode's Swift toolchain for SwiftUI and SwiftData. ```sh make setup make test -make install +make run ``` -`make install` builds Jot, installs it in `/Applications`, and opens it. `make help` lists the available commands. The underlying mise tasks are also available directly, for example `mise run build`. Jot intentionally uses Xcode’s Swift toolchain because SwiftData is an Apple framework, not mise’s standalone Swift runtime. Project tasks do not auto-install unrelated tools from your global mise configuration. - -The first release is intentionally unsigned; macOS may require you to open it from Finder with **Open**. Signed/notarized distribution belongs in a GitHub Release once there is a Developer ID certificate. - -## Enable iCloud sync +`make run` builds `.build/Jot.app` and opens it. To install the app in +`/Applications` instead, run `make install`. `make help` lists the commands. -This package intentionally starts with local storage so it can run without a signed Apple Developer identity. iCloud sync needs a real App ID and CloudKit container owned by your team. +The build script creates an app bundle without a signing or notarization step. +There is no signed release download yet. -1. Open `Package.swift` in Xcode and give the app target a unique bundle identifier. -2. In **Signing & Capabilities**, add **iCloud** and **CloudKit**; create/select a container such as `iCloud.com.yourteam.Jot`. -3. Replace the placeholder container in `Resources/Jot.entitlements` and attach it to the target. -4. In `JotApp.swift`, replace `ModelConfiguration(cloudKitDatabase: .none)` with: +## Current limits - ```swift - ModelConfiguration(cloudKitDatabase: .private("iCloud.com.yourteam.Jot")) - ``` +Storage is local only. iCloud sync, export, and a UI for scheduling reminders +are not implemented. The reminder model and scheduler are groundwork rather +than a usable feature. -5. Run signed builds on devices using the same iCloud account. +There is no in-app backup or restore. Keep that in mind before using Jot as the +only copy of important notes. -iCloud synchronizes the store; it is not a versioned backup. Add Markdown/JSON export before relying on it for irreplaceable notes. +## Code -## Repository status +`Sources/Jot/JotApp.swift` contains the interface, `Note.swift` defines the data +model and category queries, and `Tests/JotTests` covers query ordering, note +identity, and Markdown rendering. `scripts/build-app.sh` assembles the app bundle. -This repository is private while the app is being shaped. No license is included yet; all rights are reserved. Before open-sourcing, add a license, remove any personal iCloud container identifiers, and decide how releases will be signed. +Licensed under the [MIT License](LICENSE). diff --git a/docs/screenshot.png b/docs/screenshot.png new file mode 100644 index 0000000..4534b24 Binary files /dev/null and b/docs/screenshot.png differ