DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
A reimagining of Apple Notes as a Markdown folder based editor like Obsidian
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Version 1.3.5 · A blazing-fast, local-first, native macOS (and iOS) Markdown knowledge base with built-in AI — synced effortlessly via Git.
HelloNotes is a native Apple-ecosystem alternative to Electron knowledge apps like Obsidian and cross-platform editors like Typora. It's built strictly on modern Swift — AppKit + TextKit 2 + SwiftUI — prioritising high-FPS text rendering, plain .md files as the absolute source of truth, and seamless background Git synchronisation. No proprietary database. Your files in Finder are the database — and those files can live locally or in Box, Dropbox, OneDrive, Google Drive or iCloud, opened on demand without pulling the whole vault down.
| Doc | What's in it |
|---|---|
| docs/PRD.md | Product vision, users, feature requirements, success metrics |
| docs/architecture.md | Current 4-layer architecture + the Swift packages the app links |
| docs/ui.md | The UI design: the axis-of-abundance rule and the shells, component sizes, the app-drawn chrome, the sizing contract every viewport obeys, and the layout decisions. The window's parts each have their own: primary sidebar, right panel, toolbars, tabs, menu bar |
| docs/unimplemented.md | Production-readiness register — release blockers, deferrals, bugs, tech debt, security, performance, usability & accessibility gaps (from a five-lane audit) |
| docs/native-roadmap.md | Forward roadmap for deeper Apple-platform integration (App Intents, widgets, Spotlight…) |
| docs/cloud-native-roadmap.md | Cloud storage: the File Provider path (on-demand files) and the direct-API providers, phase by phase |
| docs/production.md | Step-by-step runbook to ship the app — the App Store (Mac, iPhone and iPad) and the notarised DMG |
| docs/signing.md | Code-signing & provisioning notes (team, capabilities, entitlements) |
| docs/xcode-targets-setup.md | How the Widget / Quick Look extension targets and the App Group were added |
| docs/website.md | The product site — Astro + Tailwind, its site map, GitHub Actions deploy, DMG distribution, and the two URL traps (base, custom domain) |
| CHANGELOG.md | What changed in each release, in user-facing terms |
| docs/implemented.md | Implementation history — milestones, the editor rewrite, the retired markdown-engine fork, GFM fidelity, HIG pass, and cloud storage |
Local-first, multi-collection
.md files are the truth (settings sync through iCloud's key-value store — never a note). Open several collections at once as a library, with a launcher, recents, and saved library sets. The first launch opens DefaultCollection, the bundled tour and user manual; File ▸ Open Default Collection brings it back.A truly native live editor (the in-repo Packages/NotesEditor)
%%comments%%, and hidden front matter paired with a typed, editable Properties panel.![[Note]] / ![[Note#heading]] render as inline cards.assets/, smart paste (HTML → Markdown), multi-tab and multi-window editing, document statistics, outline with jump-to-heading, and HTML/PDF export.Knowledge graph
[[wiki-links]] with autocomplete, aliases, link-to-heading, backlinks, outgoing links, and unlinked mentions with one-click linking.Organise & find
+ for folders and collections. Apple Notes' account-then-folders arrangement, in the window's one collapsible column. Where the window is taller than it is wide — an iPad in portrait — that navigation becomes a band across the top and splits into two panes, Finder-style: folders on the left, the notes inside the selected one on the right. Both are the same tree; the band is simply too wide and too short for one list. See docs/shell-chrome.md.+ (New Note, Today's Note, New Note from a Prompt, Quick Capture, Dictate to Daily Note), search and Settings — then your tabs, the note's own actions and Show/Hide Panel.[[wiki-link]] to it; the caret crosses between title and body as one flow.#tags with autocomplete (/ is allowed in a name) and front-matter tags: — both spellings count, so an Obsidian vault's tags are visible here, bookmarks, daily notes, and templates.AI, on your terms — and where you'd look for it
tags:, related:, summary: — so it is visible in Properties and removable there, and a related: link is still a real link the graph sees. A command palette (⇧⌘P) runs anything by name, generated from the same command surface the menu bar is, so a command that goes missing from it is a test failure.[[link]] the model returns is verified against the collection and the invented ones are unwrapped to plain text. You read the whole draft before the file exists.Cloud storage — two ways, no lock-in
NSFileCoordinator-coordinated so a cloud file materialises on demand, and indexing deliberately skips un-downloaded notes rather than dragging your whole vault local. Online-only notes get a cloud badge, a "N online-only" status, per-note Download / Remove Download, and a provider label; Git is guarded on cloud folders (auto-commit off) since libgit2 needs real local objects.URLSession, no vendor SDKs) browse the provider's own API in a folder picker, and Open promotes a folder to a first-class collection in the sidebar: it mirrors into a local cache that reuses the entire normal pipeline (scan, index, backlinks, editor), and saves upload back automatically. OAuth uses PKCE where the provider supports it; tokens live in the Keychain and credentials stay in a git-ignored Secrets.xcconfig.File ▸ Open Collection ▸ from Cloud… opens Manage Cloud Collections: the cloud collections you already have (removable, without deleting a thing), the ways to add another, and your accounts. Several accounts per service are first-class — a personal and a work OneDrive each keep their own credentials, are named whatever you call them, and can each supply as many collections as you like. Which route applies is answered rather than asked: on macOS the app reads the installed provider clients and names them.Seamless Git sync
Deep system integration
NoteEntity App Intents (open, create, append, search) with an AppShortcutsProvider, so notes are scriptable from Shortcuts and callable by voice..md preview and thumbnail extensions, so Markdown renders in Finder's Space-bar preview and as file icons.MenuBarExtra does it without switching apps, and a system-wide ⌃⌥⌘N brings HelloNotes forward on a new note.hellonotes://note?… / collection / search / new / daily, the shared entry point behind Shortcuts, Spotlight and widget taps.SpeechAnalyzer transcription straight into the daily note; Writing Tools and inline prediction are wired into the editor (plain-text only, so rewrites can't corrupt Markdown).Native app polish
WebView policy: typing is 100% native TextKit 2. A
WKWebViewappears only in read-only rendering — the GFM Preview, the Marp slides preview, and, in Edit, an off-screen render of a raw HTML block, drawn as an image while the caret is elsewhere so that Edit shows what Preview shows — never where you type.
Free, and what backing it adds
SupportContractTests fails if anything else starts consulting a purchase.A strict 4-layer architecture keeps macOS and iOS sharing everything but the shell:
FileIO — every vault read/write goes through NSFileCoordinator, so on-demand cloud files materialise instead of failing), and the direct-API cloud clients (Core/Remote). UI-agnostic, unit-tested.@Observable macro exclusively: Library → Collections (scan, CRUD, bookmarks, index cache), EditorModel/EditorTabs, LinkGraph, CollectionSearchModel, GitService (FIFO-serialized), AppearanceSettings, stores for recents/libraries/credentials.AdaptiveShell for both platforms, chosen by the axis of abundance (width and aspect) rather than device identity, so a Mac window and an iPad of the same size lay out identically and Stage Manager stops being a special case. It places three slots: the sidebar (collections and folders in one tree), the editor pane, and the right panel. ContentView — one struct for both platforms — supplies the slots. Every viewport in the tree obeys a sizing contract — a window onto content reports the size it is offered, never the size it contains — asserted by ShellContractTests. See docs/layout-architecture.md.The editor is a separate local SPM package, Packages/NotesEditor — MarkdownCore (incremental block/inline parser + style spec), MarkdownEditor (TextKit 2 NSTextView/UITextView), and GFMRender (cmark-gfm for the GitHub-identical Preview + spec/API parity).
The Intelligence layer (HelloNotes/Intelligence/) is built on the Foundation Models framework: LanguageModels resolves the chosen model (on-device, Private Cloud Compute or MLX) and names it by where it runs, IntelligenceService and DeepResearch run the writing tools and research, and the Assistant is a LanguageModelSession driven by a dynamic profile over the collection's read-only tools (ToolContext) — it searches and reads notes and looks things up on the web, and nothing it is offered changes a note. Chat transcripts persist as Foundation Models Transcript JSON under Application Support.
Full detail, data flow, and concurrency model: docs/architecture.md.
Swift Package Manager, native Apple frameworks first.
Apple frameworks: SwiftUI · AppKit / TextKit 2 · Foundation Models · Vision (image alt-text) · PDFKit / QuickLook · Security (Keychain) · libgit2 (via SwiftGitX)
Packages (see architecture.md for how each is used):
| Package | Role |
|---|---|
Packages/NotesEditor (in-repo) | Live TextKit 2 Markdown editor (MarkdownCore + MarkdownEditor) and GitHub-identical Preview (GFMRender) |
swift-cmark (gfm branch) | cmark-gfm — GitHub's own GFM engine, for the Preview + spec/API parity (via GFMRender) |
| swift-markdown | Apple's GFM AST parser — used in Core for headings, export, and Marp splitting (not editing) |
| SwiftGitX | Async/await Git engine over libgit2 |
| beautiful-mermaid-swift + elk-swift | Native Mermaid diagram rendering + ELK layout |
| HighlighterSwift | Code-block syntax highlighting (GitHub theme, matching the Preview) |
| SwiftMath | Native LaTeX math rendering (no WebView) |
mlx-swift-lm (MLXFoundationModels) + mlx-swift | Open models on Apple silicon, as a Foundation Models LanguageModel |
| swift-transformers + |
Requirements: macOS 27+, Xcode 27+ (Swift 5.10+). iOS/iPadOS 27+.
git clone https://github.com/hellotham/hellonotes.git
cd hellonotes
# Optional — only for the direct-API cloud providers (Dropbox/Box/Drive/OneDrive).
# The app builds and runs fine without this; those providers just report
# "not configured" until you add your own keys. See the file's comments for the
# console walkthrough for each provider.
cp Config/Secrets.example.xcconfig Config/Secrets.xcconfig
# Open in Xcode (SPM dependencies resolve automatically on first open)
open HelloNotes.xcodeproj
# …or build from the command line (a shared scheme is committed). Every app
# xcodebuild needs -skipPackagePluginValidation: mlx-swift's Cmlx target carries a
# build-tool plugin (inert on Apple platforms) that a command line cannot trust.
xcodebuild -project HelloNotes.xcodeproj -scheme HelloNotes -destination 'platform=macOS' -skipPackagePluginValidation build
# app unit tests — through the script, never a bare `xcodebuild test`: the bundle is
# hosted by the app, so the script quits a running HelloNotes first and cleans up after
./scripts/run-tests.sh
# editor package tests (GFM conformance, live-editor fidelity, parser fuzz) — on the Mac,
# and on iOS, which `swift test` never builds (make an iPad simulator named HN-iPad first)
swift test --package-path Packages/NotesEditor
(cd Packages/NotesEditor && xcodebuild test -scheme NotesEditor-Package -destination 'platform=iOS Simulator,name=HN-iPad')
# Release build — run this too before shipping (see the note below)
xcodebuild -project HelloNotes.xcodeproj -scheme HelloNotes -destination 'generic/platform=macOS' -configuration Release -skipPackagePluginValidation build
A green Debug build does not imply Release compiles. Optimizer-only failures exist: a Swift SIL-inliner crash once broke every Release build (and therefore any archive/DMG) while Debug stayed clean. Run the Release build after substantial changes — and if a build fails with no
error:line, suspect a compiler crash and grep the full log forWhile running pass, which names the offending function. Details and the debugging recipe: docs/production.md §1h.
Run the HelloNotes scheme: the first launch opens the bundled DefaultCollection/ — a tour of the app and its user manual. Open any folder of Markdown files with File ▸ Open…, or the repo's SampleVault/, whose notes demonstrate callouts, diagrams, math, transclusion, wiki-links, tags, slides, daily notes, and templates.
HelloNotes/ App sources (synchronised Xcode group)
├─ Core/ Layer 1 — pure logic: parsing, front matter, tags,
│ mentions, templates, layouts, stats, export, Marp,
│ Obsidian import, smart paste, index cache, build info,
│ coordinated file I/O (FileIO), cloud-provider detection
│ └─ Remote/ Direct-API cloud: RemoteStore protocol + Dropbox/Box/
│ GoogleDrive/OneDrive clients, RemoteMirror (cloud
│ account → local mirror → first-class collection)
├─ State/ Layer 2 — @Observable models (library/collections,
│ editor/tabs, link graph, search, git, appearance,
│ bookmarks/recents/credentials)
├─ Intelligence/ AI layer on Foundation Models — models (on-device,
│ MLX), writing tools and research, the Assistant
│ (profile, tools, skills), settings & chats
├─ UI/ Layer 3 — shared views (editor host, tree, references,
│ graph, mind map, slides, viewers, assistant, splash)
│ └─ Shell/ Layer 4 — the layout contract (ShellContract), the
│ arrangement (AdaptiveShell), the compact shell, the
│ inspector, and the app-drawn chrome (Chrome*)
├─ ContentView Layer 4 — the slots for AdaptiveShell, one struct
│ for both platforms
└─ HelloNotesApp App entry (main window + auxiliary window scenes)
Packages/NotesEditor/ Live editor package (MarkdownCore, MarkdownEditor, GFMRender)
website/ Product site — Astro 7 + Tailwind 4 → hellotham.com/hellonotes
Config/ Secrets.example.xcconfig (template); Secrets.xcconfig is git-ignored
docs/ PRD, architecture, roadmaps (native + cloud), production, history
HelloNotesTests/ App unit tests
DefaultCollection/ The bundled tour and user manual (in the app; the screenshots' source)
SampleVault/ A sample collection, used by the tests
HelloNotes.xcodeproj/ Project (SPM dependencies, shared scheme)
https://hellotham.com/hellonotes/ — landing page, feature tour, screenshots, download,
an eight-section online user manual, and about / privacy / support pages. Published by
Hello Tham (https://hellotham.com). Built from website/ with Astro 7 +
Tailwind 4 (the CSS-first @tailwindcss/vite plugin; there is no tailwind.config.js — the
palette lives in an @theme block in src/styles/global.css).
cd website
npm install
npm run dev # http://localhost:4321/hellonotes/ (note the base path)
npm run build # static output → website/dist
It deploys on every push to main that touches website/, via
.github/workflows/deploy-website.yml (withastro/action →
actions/deploy-pages). Pages is in GitHub Actions mode — nothing is committed to a
gh-pages branch.
The download button points at the latest GitHub Release, not at a file in the site, so
shipping a build means publishing a release — the ~30 MB disk image is deliberately kept out of
git history. src/lib/site.ts holds the version, size and SHA-256 the download page prints,
and must match the attached artefact.
The site follows your system appearance and can be pinned Auto / Light / Dark from the nav.
Every colour is a semantic token declared once as light-dark(<light>, <dark>) in
src/styles/global.css — there are no colour literals anywhere else. Screenshots are shot
twice, light and dark, composited by
scripts/make-screenshots.py and registered in
src/lib/screens.ts; they follow whichever appearance the site is showing.
Three things to know before editing it — the first two fail silently (the build succeeds and only the live site is wrong). See docs/website.md:
base: '/hellonotes', so build internal links and asset paths
with the href() helper in src/lib/paths.ts rather than hard-coding the prefix.site is the custom domain (hellotham.com), inherited from the hellotham.github.io
user-site repo — so this repo needs no CNAME, and canonical/OG URLs must not point at
github.io, which merely redirects.AppCommands.swift,
the other .keyboardShortcut( calls, and the editor's own key handlers. Grep for a binding before
documenting it; a first pass invented two that don't exist.og:image must live in public/, never src/assets/. Processed assets get
content-hashed filenames that change on re-export, and social crawlers cache by URL — this
shipped broken once, 404ing on every page while the build stayed green.light-dark() takes colours, not values. Wrapping a whole gradient in it is invalid and
silently renders gradient-filled text transparent — put it on each stop.<a> eats the space. 28 of these shipped; use {' '}.Project conventions live in CLAUDE.md: macOS 27+ / iOS 27+ / Swift 5.10+ / Xcode 27; @Observable only (no ObservableObject/StateObject); no CoreData/SwiftData; Git via SwiftGitX; every change must build clean (0 errors) before it's done.
See LICENSE.
LanguageModel protocol. One Default model in Settings ▸ AI serves everything, the Assistant's menu can pick another for one conversation, and its answers and suggestions say which model made them. When Cloud (Apple)'s daily allowance is used up, Local (Apple) does the work until it resets. No third-party AI services and no API keys; keys stored by earlier versions are deleted on upgrade.| Tokenizers and Hugging Face Hub downloads for MLX models |