{"id":50733268,"url":"https://github.com/rhinoc/stiki","last_synced_at":"2026-06-10T11:00:41.906Z","repository":{"id":362602130,"uuid":"893434719","full_name":"rhinoc/stiki","owner":"rhinoc","description":"A compact macOS sticky note app for rich Markdown notes.","archived":false,"fork":false,"pushed_at":"2026-06-05T02:40:55.000Z","size":7666,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-05T04:15:40.459Z","etag":null,"topics":["desktop-app","macos","markdown","notes","sticky-notes","svelte","tauri"],"latest_commit_sha":null,"homepage":"https://github.com/rhinoc/stiki","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rhinoc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-24T12:50:43.000Z","updated_at":"2026-06-05T02:40:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rhinoc/stiki","commit_stats":null,"previous_names":["rhinoc/stiki"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rhinoc/stiki","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhinoc%2Fstiki","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhinoc%2Fstiki/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhinoc%2Fstiki/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhinoc%2Fstiki/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rhinoc","download_url":"https://codeload.github.com/rhinoc/stiki/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhinoc%2Fstiki/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34149132,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["desktop-app","macos","markdown","notes","sticky-notes","svelte","tauri"],"created_at":"2026-06-10T11:00:24.925Z","updated_at":"2026-06-10T11:00:41.883Z","avatar_url":"https://github.com/rhinoc.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003cimg src=\"./src-tauri/icons/icon.png\" alt=\"Stiki app icon\" width=\"112\" height=\"112\" /\u003e\n  \u003ch1\u003eStiki\u003c/h1\u003e\n  \u003cp\u003eYour notes, always close by.\u003cbr /\u003e\n  A compact native macOS sticky-note app for rich Markdown notes, linked files, theme tuning, and live transcript capture.\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/rhinoc/stiki/releases\"\u003eReleases\u003c/a\u003e\n    \u0026nbsp;·\u0026nbsp;\n    \u003ca href=\"./LICENSE\"\u003eLicense\u003c/a\u003e\n    \u0026nbsp;·\u0026nbsp;\n    \u003ca href=\"./CREDITS.md\"\u003eCredits\u003c/a\u003e\n    \u0026nbsp;·\u0026nbsp;\n    \u003ca href=\"./CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n  \u003c/p\u003e\n  \u003cbr /\u003e\n\u003c/div\u003e\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"./assets/showcase-normal.png\" width=\"250\" alt=\"Stiki main note window with rich Markdown content\" /\u003e\n      \u003cbr /\u003e\n      \u003csub\u003eMarkdown sticky note\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"./assets/showcase-color-pick.png\" width=\"250\" alt=\"Stiki theme color picker with note window\" /\u003e\n      \u003cbr /\u003e\n      \u003csub\u003eTheme color tuning\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"./assets/showcase-collapsed.png\" width=\"250\" alt=\"Stiki folded compact window\" /\u003e\n      \u003cbr /\u003e\n      \u003csub\u003eFolded window mode\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Features\n\n- 📝 **Markdown sticky notes** — Keep quick notes in a compact rich editor with task lists, links, code blocks, images, and clean Markdown output.\n- 🔗 **Linked Markdown files** — Link a tab to a `.md` or `.markdown` file and let Stiki autosave changes back to disk.\n- 🗂️ **A few notes, one small window** — Switch between labeled tabs without turning your desktop into a pile of note windows.\n- 📌 **Always within reach** — Pin it above other windows, fold it down, hide it to the tray, or bring it back with `stiki://toggle-window`.\n- 🎙️ **Live transcript capture** — Append mic or system-audio transcripts to the current note with Apple Speech, or use local FunASR bundles for speaker-labeled segments.\n\n## Requirements\n\n- **macOS** for the packaged desktop app and release DMGs.\n- **Network access** for release downloads and update checks.\n- **Microphone, speech recognition, and system audio permissions** are requested only when transcript capture is used.\n\n## Install\n\nStiki ships as a macOS disk image. Download the latest **`stiki-\u003cversion\u003e-\u003carch\u003e.dmg`** from **[GitHub Releases](https://github.com/rhinoc/stiki/releases)**.\n\n1. Open the DMG (double-click the download).\n2. In the mounted window, drag **`stiki.app`** onto the **Applications** shortcut.\n3. Eject the disk image, then launch **Stiki** from **Applications**, Spotlight, or the tray.\n\nThe DMG contains `stiki.app` and an **Applications** shortcut only — there is no separate installer or package manager step.\n\n### First launch and Gatekeeper\n\nBrowser downloads are tagged with Gatekeeper **quarantine** (`com.apple.quarantine`). If macOS warns that the app cannot be opened or is from an unidentified developer, use one of the options below after copying the app to **Applications**.\n\nRemove quarantine from the installed app:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/stiki.app\n```\n\nOr **Control-click (or right-click) → Open** on `stiki.app` once and confirm in the dialog. macOS records that exception for future launches.\n\nIn-app updates use the same packaged app format. If macOS leaves an updated app outside `/Applications`, drag the updated `stiki.app` into **Applications** the same way.\n\n## Usage\n\n**First launch** creates Stiki's local app state and opens a starter note. App-managed notes and preferences are stored locally; linked Markdown files remain in the file locations you choose.\n\n### Tabs and notes\n\nUse the footer toolbar to add tabs, rename them, assign emoji markers, switch notes, clear content, copy Markdown, or toggle power mode. Each tab keeps its own editor content and label.\n\n### Markdown files\n\nStiki can link the current tab to a Markdown file. Choose a `.md` or `.markdown` file to open it into the current tab, or save the current tab as a Markdown file and keep it linked for autosave.\n\nLinked tabs show their file path in the tab tooltip. Use the footer toolbar to save immediately or unlink the tab when you want it to return to app-managed storage only.\n\n### Window and tray\n\nUse the header toolbar to pin Stiki above other windows or fold the window down to a smaller height. Closing the window hides it instead of quitting the app.\n\nThe tray menu can show or hide the window, toggle launch at startup, check for updates, or quit Stiki.\n\n### Theme tuning\n\nUse the theme control in the header toolbar to adjust the accent color. Stiki stores separate light and dark accent values and follows the system color scheme.\n\n### Transcript capture\n\nUse the microphone button in the footer toolbar to start or stop transcript capture. The transcript source can be microphone audio, system audio, or both. When both sources are enabled, Stiki suppresses close duplicate transcript snippets from different sources so system audio picked up by the microphone is less likely to be written twice.\n\nThe transcript backend defaults to **Apple Speech**. Apple Speech uses macOS speech recognition and does not require a local model folder.\n\nThe footer toolbar menu includes transcript settings for source, language, backend, local FunASR model bundle, max speakers, silence timeout, and output format. Transcript format can include or omit a 24-hour timestamp and speaker label. With Apple Speech, speaker labels fall back to the audio source (`Mic:` or `System:`). With FunASR, Stiki uses the user-provided speaker model for diarization and writes labels such as `Speaker 1:` when FunASR returns speaker-attributed segments. For small conversations, set **Max Speakers** to the largest expected number of speakers to keep embedding drift from creating extra labels. Increase **Silence Timeout** when transcript segments are being cut too aggressively.\n\n#### Local FunASR models\n\nFunASR models are bring-your-own-model. Stiki release builds include the local inference runtime, but model files are not bundled, committed, or downloaded by Stiki. Users must provide every model directory locally and can keep large model directories wherever they prefer.\n\nTo add a local FunASR model bundle:\n\n1. Open the footer toolbar menu.\n2. Choose **Backend: FunASR**.\n3. Choose **FunASR Model Bundle → Open Models Folder...**.\n4. Put a complete model bundle directory in that folder, or create a symbolic link to a bundle stored elsewhere.\n5. Choose **FunASR Model Bundle → Refresh Models**.\n6. Select the model bundle from the **FunASR Model Bundle** submenu.\n\nThe models folder is:\n\n```text\n~/Library/Application Support/com.rhinoc.stiki/funasr-models/\n```\n\nEach direct child directory or symbolic link is treated as one selectable model bundle only when it contains all required subdirectories:\n\n```text\nMyFunASRBundle/\n  asr/      # ASR model, for example SenseVoiceSmall\n  vad/      # VAD model, for example FSMN-VAD\n  punc/     # punctuation model, for example CT-Punc\n  speaker/  # speaker embedding/diarization model, for example CAM++\n```\n\nTo download the example ModelScope models and expose them as one Stiki bundle:\n\n```bash\npython3 -m pip install --user \"modelscope==1.37.1\"\n\npython3 \u003c\u003c'PY'\nfrom pathlib import Path\nfrom modelscope import snapshot_download\n\nbundle = Path.home() / \"funasr-stiki-bundle\"\nmodels_dir = Path.home() / \"Library/Application Support/com.rhinoc.stiki/funasr-models\"\nbundle.mkdir(parents=True, exist_ok=True)\nmodels_dir.mkdir(parents=True, exist_ok=True)\n\n\ndef replace_symlink(path, target):\n    if path.is_symlink() or path.is_file():\n        path.unlink()\n    elif path.exists():\n        raise SystemExit(f\"{path} exists and is not a symlink; move it first.\")\n    path.symlink_to(target, target_is_directory=True)\n\n\nmodels = {\n    \"asr\": \"iic/SenseVoiceSmall\",\n    \"vad\": \"iic/speech_fsmn_vad_zh-cn-16k-common-pytorch\",\n    \"punc\": \"iic/punc_ct-transformer_cn-en-common-vocab471067-large\",\n    \"speaker\": \"iic/speech_campplus_sv_zh-cn_16k-common\",\n}\n\nfor name, model_id in models.items():\n    replace_symlink(bundle / name, Path(snapshot_download(model_id)).expanduser())\n\napp_bundle = models_dir / \"FunASRBundle\"\nreplace_symlink(app_bundle, bundle)\nprint(app_bundle)\nPY\n```\n\nDifferent model sizes, checkpoints, or parameter variants can be exposed by adding more complete bundle directories or links with different names. Stiki lists only direct child directories and symlinks that contain `asr/`, `vad/`, `punc/`, and `speaker/`.\n\n### Deep links\n\nUse this URL to toggle the main window from launchers or scripts:\n\n```text\nstiki://toggle-window\n```\n\n### Local data locations\n\n| Location | What it stores | Notes |\n| --- | --- | --- |\n| `~/Library/Application Support/com.rhinoc.stiki/` | App-managed settings and note state | Includes the Tauri store data used by Stiki. |\n| `~/Library/Application Support/com.rhinoc.stiki/funasr-models/` | User-provided FunASR model bundle directories or symlinks | Model files are not committed to this repository and are not downloaded by Stiki. |\n| User-selected `.md` / `.markdown` files | Linked note content | Stiki writes linked tabs back to these files. |\n\n## Contributing\n\nFor development setup, coding conventions, tests, asset rules, and release boundaries, read **[CONTRIBUTING.md](./CONTRIBUTING.md)**.\n\n## Third-Party Assets and Licenses\n\nOriginal project source code is licensed under the **MIT License**. See **[LICENSE](./LICENSE)**.\n\nThat license does not override third-party terms. This repository includes or references frameworks, packages, icons, release tools, and platform integrations with separate licenses or usage terms. See **[CREDITS.md](./CREDITS.md)** for attribution and current redistribution notes.\n\n**Important boundaries:**\n\n- Tauri, Svelte, Tiptap, ProseMirror, and other dependencies remain under their own upstream licenses.\n- Bundled icons and DMG background assets require source-by-source redistribution verification before replacement or reuse outside this project.\n- Release DMGs, updater archives, signing keys, certificates, passwords, and notarization credentials are not source artifacts and should not be committed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhinoc%2Fstiki","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frhinoc%2Fstiki","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhinoc%2Fstiki/lists"}