A collaborative class-notes app — Classes → Sessions → Notes (photo / handwritten / typed) with per-session AI chat. SwiftUI + PencilKit on the client, a SpacetimeDB Rust module (smartnotesdb) for realtime sync, Cloudinary for image hosting, and the Anthropic API for OCR and chat.
The Xcode project/bundle is named SmartNotes (
com.derockjr.SmartNotes); "BoardWise" is the product name.
- Xcode 15+ / iOS 17+
- An Anthropic API key
- A free Cloudinary account (for note image uploads)
Secrets are not committed. Create your local Info.plist from the template and fill in three values:
cp SmartNotes/Info.plist.template SmartNotes/Info.plistThen open SmartNotes/Info.plist and set:
| Key | Where to get it |
|---|---|
ANTHROPIC_API_KEY |
console.anthropic.com → API Keys → Create Key (starts with sk-ant-…). Used for OCR + chat. |
CLOUDINARY_CLOUD_NAME |
Cloudinary Dashboard → Product Environment / Cloud name. |
CLOUDINARY_UPLOAD_PRESET |
Cloudinary → Settings → Upload → Upload presets → create an unsigned preset and use its name. |
SmartNotes/Info.plist is gitignored, so your keys stay local. The template also carries the required NSCameraUsageDescription (camera capture), so don't drop it.
Open SmartNotes.xcodeproj and run.
The SpacetimeDB Swift SDK is vendored as a local Swift package at LocalPackages/spacetimedb-swift and carries two hand-applied patches that are required for the app to work:
autoSubscribeExcludedTables(Sources/SpacetimeDB/Network/SpacetimeClient.swift) — excludes the largestrokestable from the connect-time subscribe-all, avoiding a BSATN decode overflow.- WebSocket fragment reassembly (
Sources/SpacetimeDB/Network/NWWebSocketTransport.swift) — FIN-bit tracking + continuation-frame reassembly, so large subscription snapshots aren't silently truncated.
Updating/re-pulling the package upstream will wipe these patches and reintroduce the bugs. The patched source is committed here as plain files (not a submodule) precisely so it can't be lost.