{"id":44051577,"url":"https://github.com/elgar328/nfd2nfc","last_synced_at":"2026-03-05T00:15:30.695Z","repository":{"id":275851961,"uuid":"927143838","full_name":"elgar328/nfd2nfc","owner":"elgar328","description":"macOS NFD-to-NFC filename converter with TUI and background watcher","archived":false,"fork":false,"pushed_at":"2026-02-26T07:59:55.000Z","size":1311,"stargazers_count":101,"open_issues_count":0,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-26T10:24:29.767Z","etag":null,"topics":["file-watcher","filename-conversion","macos","nfc","nfd","tui","unicode-normalization"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/elgar328.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2025-02-04T13:32:26.000Z","updated_at":"2026-02-26T08:32:05.000Z","dependencies_parsed_at":"2025-02-04T23:34:48.265Z","dependency_job_id":null,"html_url":"https://github.com/elgar328/nfd2nfc","commit_stats":null,"previous_names":["elgar328/nfd2nfc"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/elgar328/nfd2nfc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elgar328%2Fnfd2nfc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elgar328%2Fnfd2nfc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elgar328%2Fnfd2nfc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elgar328%2Fnfd2nfc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elgar328","download_url":"https://codeload.github.com/elgar328/nfd2nfc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elgar328%2Fnfd2nfc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30102365,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T23:59:36.199Z","status":"ssl_error","status_checked_at":"2026-03-04T23:56:48.556Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["file-watcher","filename-conversion","macos","nfc","nfd","tui","unicode-normalization"],"created_at":"2026-02-07T23:15:50.806Z","updated_at":"2026-03-05T00:15:28.625Z","avatar_url":"https://github.com/elgar328.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nfd2nfc\n\n[![Release](https://img.shields.io/github/v/release/elgar328/nfd2nfc)](https://github.com/elgar328/nfd2nfc/releases)\n[![CI](https://github.com/elgar328/nfd2nfc/actions/workflows/ci.yml/badge.svg)](https://github.com/elgar328/nfd2nfc/actions/workflows/ci.yml)\n[![License](https://img.shields.io/github/license/elgar328/nfd2nfc)](https://github.com/elgar328/nfd2nfc#license)\n\n[![한국어](https://img.shields.io/badge/lang-한국어_↗-blue)](docs/README.ko.md)\n\nA macOS tool that watches directories and converts NFD filenames to NFC in real time, ensuring cross-platform compatibility.\n\n## What is NFD/NFC?\n\nUnicode has two main ways to represent composed characters such as Korean Hangul, accented Latin (é, ü, ñ), Japanese kana (が, ぱ), and more:\n\n- **NFC** (Composed): One codepoint per character — `가` = `U+AC00`\n- **NFD** (Decomposed): Base + combining marks — `가` = `U+1100 U+1161`\n\nmacOS stores filenames in NFD, while Windows and Linux use NFC. This mismatch causes problems when sharing files across platforms:\n\n- Hangul syllables appear as decomposed jamo (e.g., 한글 → ㅎㅏㄴㄱㅡㄹ)\n- Accented characters may render or sort incorrectly\n- Git sees identical files as untracked or modified\n- Cloud sync and archive tools fail to match paths\n\n**nfd2nfc** provides an interactive TUI and a background watcher service that handles conversion automatically.\n\n## Features\n\n- **Real-time monitoring** — Converts NFD filenames to NFC as soon as they appear\n- **Flexible watch paths** — Mix `watch`/`ignore` actions with `recursive`/`children` modes to control exactly which directories are monitored\n- **Manual conversion** — Browse the filesystem and convert names between NFD and NFC on the spot\n- **Log viewer** — Review past watcher logs or follow new entries live\n- **Intuitive controls** — Every keybinding is shown on screen, and full mouse support is included\n\n## Home\n\n\u003cimg src=\"assets/home.png\" alt=\"Home\" width=\"750\" /\u003e\n\nThe Home tab displays the current watcher service status and provides controls to start, stop, or restart it.\n\n## Config\n\n\u003cimg src=\"assets/config.png\" alt=\"Config\" width=\"750\" /\u003e\n\nThe Config tab manages which directories the watcher monitors. Each path entry has an action (`watch` or `ignore`), mode (`recursive` or `children`), and validation status.\n\n## Logs\n\n\u003cimg src=\"assets/logs.png\" alt=\"Logs\" width=\"750\" /\u003e\n\nThe Logs tab lets you browse past watcher logs and follow new entries in real time. Logs are stored in macOS system logs, and retention is managed by the OS.\n\n## Browser\n\n\u003cimg src=\"assets/browser.png\" alt=\"Browser\" width=\"750\" /\u003e\n\nThe Browser tab lets you inspect files and directories for their Unicode normalization form and convert them directly. The watcher only picks up newly created or modified files, so use this tab to convert any existing NFD names.\n\n## Installation\n\nRequires [Homebrew](https://brew.sh).\n\n```bash\nbrew install elgar328/nfd2nfc/nfd2nfc\n```\n\nThen run it:\n\n```bash\nnfd2nfc\n```\n\nOn first launch, the watcher service is automatically registered via `brew services`. After that, you can start and stop it from the app.\n\n### Permissions\n\nIf macOS repeatedly prompts for folder access when the watcher converts files, grant **Full Disk Access** to the watcher binary:\n\n1. Run `which nfd2nfc-watcher` to find the binary path\n2. Open **System Settings → Privacy \u0026 Security → Full Disk Access**\n3. Click `+`, press `Cmd+Shift+G`, paste the path from step 1, and add it\n\n## Upgrading from v1\n\n```bash\nbrew upgrade nfd2nfc\n```\n\nv2 replaces the previous CLI with a more user-friendly TUI. The config format (`~/.config/nfd2nfc/config.toml`) has changed as well, so you will need to re-add your watch paths in the Config tab after upgrading.\n\n## Uninstallation\n\n```bash\nbrew uninstall nfd2nfc\n```\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felgar328%2Fnfd2nfc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felgar328%2Fnfd2nfc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felgar328%2Fnfd2nfc/lists"}