Declared-but-empty projects persist locally (UserDefaults) until a note carries the name, at which point the project syncs via notes as usual. Empty declared projects can be swipe-deleted. Claude-Session: https://claude.ai/code/session_014esDWi42URLEC6Cj17hGQ3
47 lines
3.5 KiB
Markdown
47 lines
3.5 KiB
Markdown
# Contextful
|
|
|
|
Context-aware note taking for iOS and macOS. Product name **Contextful**; project working name "Notes", bundle id `dev.rzen.indie.Notes`.
|
|
|
|
The idea: every note silently captures the context it was taken in — where you
|
|
were, what time it was — and that context is used to *recall* notes later.
|
|
Walk back into the coffee shop and the note with the barista's name bubbles to
|
|
the top of the list.
|
|
|
|
## Key features
|
|
|
|
- **Quick text notes** — jot something down in two taps; first line doubles as the title
|
|
- **Voice notes** — record a memo (iPhone, Mac, or Apple Watch); the audio is kept and transcribed on-device afterwards, with a per-note "re-transcribe in another language" override and a settings screen to enable transcription languages
|
|
- **Transcripts kept separate from your text** — every transcription attempt is preserved on the note (latest shown, with language and confidence); your own typing is never mixed with or overwritten by machine output, and a transcript can be inserted into the note body on demand
|
|
- **Apple Watch capture** — a watch-face complication opens a one-button recorder; the recording transfers to your iPhone over WatchConnectivity, which ingests and transcribes it (no iCloud on the watch); the watch keeps its copy until the iPhone acknowledges durable ingest, so a failed handoff never loses audio
|
|
- **Automatic context capture** — location, place name (reverse-geocoded), time zone, and device are stamped onto every note, best-effort and privacy-friendly (all data stays in your iCloud)
|
|
- **"Right here, right now" recall** — a ranked shelf of notes whose capture context matches your current place and time, above the regular newest-first list
|
|
- **Tags** — manual organization alongside the automatic context; browse notes by tag
|
|
- **Projects** — file notes under a project (or "category" — the term is your choice in Settings) with a swipe, browse them in their own tab, create empty ones ahead of time with the tab's "+", sort by activity/name/count, and add notes directly into a project
|
|
- **Search** — full-text over note text, voice transcripts (weighted by transcription confidence), tags, and captured place names
|
|
- **iCloud sync** — notes live as JSON files in your iCloud Drive (visible in Files.app) and sync across iPhone and Mac; the local database is just a rebuildable cache
|
|
- **iOS + macOS + watchOS** — same app and data across iPhone and Mac, with an Apple Watch companion for voice capture
|
|
- **Backups** — one-tap local backup and restore of all notes (IndieBackup); backup files can be shared and imported across devices
|
|
- **About screen** — version info, changelog, and license in Settings (iOS) and the About window (macOS) via IndieAbout
|
|
|
|
Planned: richer context signals, smarter ranking.
|
|
|
|
## Architecture
|
|
|
|
- SwiftUI, iOS 26+ / macOS 26+, Swift 6 strict concurrency, XcodeGen (`xcodegen generate`)
|
|
- Storage per the icloud-sync-engine pattern: iCloud Drive JSON documents are
|
|
the sole source of truth (via the [IndieSync](https://git.rzen.dev/rzen/indie-sync)
|
|
package); a SwiftData cache is populated exclusively by metadata-observer
|
|
events and can be wiped/rebuilt at any time
|
|
- Context capture in `Services/ContextService.swift` (CoreLocation +
|
|
MapKit reverse geocoding); ranking in `Services/Relevance.swift`
|
|
|
|
## Build
|
|
|
|
```bash
|
|
xcodegen generate
|
|
xcodebuild build -project Notes.xcodeproj -scheme Notes \
|
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro'
|
|
```
|
|
|
|
Requires `APPLE_TEAM_ID` in the environment for code signing.
|