{"id":51045160,"url":"https://github.com/autholykos/liauth","last_synced_at":"2026-06-22T13:01:06.775Z","repository":{"id":365209568,"uuid":"1271057317","full_name":"autholykos/liauth","owner":"autholykos","description":"Markdown editor with live preview and embedded git versioning","archived":false,"fork":false,"pushed_at":"2026-06-16T10:01:03.000Z","size":643,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T11:25:12.926Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/autholykos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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":"2026-06-16T09:43:14.000Z","updated_at":"2026-06-16T09:59:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/autholykos/liauth","commit_stats":null,"previous_names":["autholykos/liauth"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/autholykos/liauth","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/autholykos%2Fliauth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/autholykos%2Fliauth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/autholykos%2Fliauth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/autholykos%2Fliauth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/autholykos","download_url":"https://codeload.github.com/autholykos/liauth/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/autholykos%2Fliauth/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34649822,"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-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T13:01:05.713Z","updated_at":"2026-06-22T13:01:06.769Z","avatar_url":"https://github.com/autholykos.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Liauth\n\nA markdown editor that doesn't suck: Typora-style live preview with an embedded\ngit engine for versioning and asynchronous review.\n\n## What it does\n\n- **Live preview editing** — the markdown source is the document. Syntax\n  markers (`#`, `**`, `` ` ``, `[]()`, `\u003e`, `-`) render in place and reveal\n  themselves only where your cursor is, Typora-style. Task-list checkboxes are\n  clickable.\n- **Versioning built in** — every save is a git commit (skipped when nothing\n  changed). The History panel lists versions of the open file; any version can\n  be viewed read-only or restored.\n- **Review workflow** — create a review branch for a second pair of eyes, both\n  sides edit independently, then \"Merge in\" reconciles. Conflicts appear as\n  standard `\u003c\u003c\u003c \u003e\u003e\u003e` markers right in the editor; saving while a merge is in\n  progress concludes it with a proper two-parent merge commit. Aborting\n  restores the pre-merge state.\n- **Notes** — review annotations stored as CriticMarkup in the text itself\n  (`{== span ==}{\u003e\u003e comment \u003c\u003c}`), so they version, branch, and merge like\n  any other edit. Select text and hit ⌘⇧M; the live view shows a highlight\n  with a hover bubble, the Notes panel lists/jumps/resolves them, and PDF\n  export strips them.\n- **RSVP speed reading** — ⌘⇧R (or `:rsvp`) flashes the document one word at\n  a time, Spritz-style, starting at the cursor: fixed optimal-recognition\n  pivot, sentence/paragraph-aware pacing, 100–900 WPM (↑/↓), arrows to step,\n  Esc drops the cursor where you stopped. Markdown syntax and notes are\n  stripped from the word stream.\n- **Concurrent-write detection** — the open file is watched; external writes\n  reload automatically when the buffer is clean, merge automatically (diff3,\n  same algorithm as git) when both sides changed compatibly, and otherwise\n  offer Merge-with-markers / Keep mine / Take disk. A toolbar ↻ reloads on\n  demand.\n- **PDF export** — renders the document to HTML (markdown-it + DOMPurify) and\n  hands it to the system print dialog (Save as PDF on macOS).\n\n## Architecture\n\n| Layer | Choice | Why |\n|---|---|---|\n| Shell | Tauri 2 (Rust) | small binaries, first-class libgit2 access |\n| Git engine | `git2` (libgit2 bindings) | in-process, no shelling out — `src-tauri/src/git.rs` |\n| Editor | CodeMirror 6 + Lezer markdown | text stays the document model, so git diffs stay meaningful — `src/editor/` |\n| UI | React + TypeScript | toolbar, history/review panels — `src/App.tsx` |\n\nDocuments stay **plain `.md` files on disk**; the repo lives in the document's\nfolder. Files remain fully usable with any other tool, including plain `git`.\n\nReal-time co-editing is deliberately out of scope for v1; the document layer is\nplain text end to end, so a CRDT (Yjs/Loro) can be layered on later without\nchanging the storage model.\n\n## Development\n\n```sh\nnpm install\nnpm run tauri dev      # run the app\nnpm run build          # typecheck + bundle frontend\ncd src-tauri \u0026\u0026 cargo test   # git engine end-to-end tests\n```\n\n## Releases\n\nUpdates are served from GitHub Releases. The app checks:\n\n```text\nhttps://github.com/autholykos/liauth/releases/latest/download/latest.json\n```\n\nTo publish an update, bump the version in `package.json`,\n`src-tauri/Cargo.toml`, and `src-tauri/tauri.conf.json`, then push a matching\ntag:\n\n```sh\ngit tag app-v0.1.1\ngit push origin app-v0.1.1\n```\n\nThe release workflow signs updater artifacts with the\n`TAURI_SIGNING_PRIVATE_KEY` GitHub Actions secret and uploads `latest.json`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautholykos%2Fliauth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fautholykos%2Fliauth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautholykos%2Fliauth/lists"}