{"id":49405680,"url":"https://github.com/lollipopkit/mfuse","last_synced_at":"2026-04-28T21:05:53.645Z","repository":{"id":352787398,"uuid":"1216093871","full_name":"lollipopkit/mfuse","owner":"lollipopkit","description":"Mount SFTP/S3... to macOS via File Provider.","archived":false,"fork":false,"pushed_at":"2026-04-21T06:30:07.000Z","size":338,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T06:41:37.128Z","etag":null,"topics":["filesystem","macos","s3","sftp","swift"],"latest_commit_sha":null,"homepage":"","language":"Makefile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lollipopkit.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":"2026-04-20T15:01:32.000Z","updated_at":"2026-04-20T18:20:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lollipopkit/mfuse","commit_stats":null,"previous_names":["lollipopkit/mfuse"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/lollipopkit/mfuse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lollipopkit%2Fmfuse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lollipopkit%2Fmfuse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lollipopkit%2Fmfuse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lollipopkit%2Fmfuse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lollipopkit","download_url":"https://codeload.github.com/lollipopkit/mfuse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lollipopkit%2Fmfuse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32399093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"last_error":"SSL_read: 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":["filesystem","macos","s3","sftp","swift"],"created_at":"2026-04-28T21:05:49.222Z","updated_at":"2026-04-28T21:05:53.634Z","avatar_url":"https://github.com/lollipopkit.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MFuse\n\n[中文](README.zh-CN.md) | [Download](https://github.com/lollipopkit/mfuse/releases) | [License](LICENSE) | [Third-Party Notices](THIRD_PARTY_NOTICES.md)\n\n\u003e Warning\n\u003e This project is currently under active development. Behavior, APIs, and supported workflows may change.\n\nMFuse is a macOS app that exposes remote storage in Finder through File Provider, with a modular backend layer for multiple protocols.\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"28%\"\u003e\n      \u003cimg src=\"docs/pics/app.png\" alt=\"MFuse app UI\"\u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"32%\"\u003e\n      \u003cimg src=\"docs/pics/menubar.png\" alt=\"MFuse menubar status\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003e\n      \u003cimg src=\"docs/pics/finder.png\" alt=\"MFuse mounted in Finder\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Supported Backends\n\n- SFTP\n- S3\n- WebDAV\n- SMB\n- FTP\n- NFS\n- Google Drive\n- Dropbox\n- Microsoft OneDrive\n\n## Backend Notes\n\n- SFTP directory enumeration has a compatibility fallback: when the normal SFTP listing path times out or hits certain connection-level failures, MFuse may execute a small `python3` snippet on the remote host over the existing SSH session to enumerate the directory. This fallback is not used for normal successful listings, permission-denied errors, or missing-path errors. Remote hosts that hit this fallback must have `python3` available, otherwise enumeration fails.\n\n## Project Structure\n\n```text\n.\n├── MFuse/                  # macOS app\n├── MFuseProvider/          # File Provider extension\n├── Packages/\n│   ├── MFuseCore/          # shared models, storage, mount abstractions\n│   ├── MFuseSFTP/\n│   ├── MFuseS3/\n│   ├── MFuseWebDAV/\n│   ├── MFuseSMB/\n│   ├── MFuseFTP/\n│   ├── MFuseNFS/\n│   ├── MFuseGoogleDrive/\n│   ├── MFuseDropbox/\n│   └── MFuseOneDrive/\n├── project.yml             # XcodeGen project definition\n└── Makefile\n```\n\n## Getting Started\n\n### Requirements\n\n- macOS 14+\n- Xcode 15+\n- Swift 5.9+\n- [XcodeGen](https://github.com/yonaskolb/XcodeGen)\n- `swiftlint` for linting\n\n### Generate the Xcode project\n\n```bash\nmake generate\n```\n\n### Configure bundled OAuth apps\n\nDropbox and OneDrive use bundled PKCE OAuth app settings loaded from build settings.\nSet them in `project.local.yml` before running the app:\n\n```yaml\nsettings:\n  base:\n    MFDROPBOX_CLIENT_ID: YOUR_DROPBOX_APP_KEY\n    MFONEDRIVE_CLIENT_ID: YOUR_MICROSOFT_APP_ID\n```\n\nDefault redirect URIs are already wired in the app bundle:\n\n- Dropbox: `com.lollipopkit.mfuse.dropbox:/oauth`\n- OneDrive: `com.lollipopkit.mfuse.onedrive:/oauth`\n\nCurrent scope:\n\n- Dropbox: standard user file space\n- OneDrive: the signed-in user's default personal/work `drive`\n\nOut of scope for this first pass:\n\n- SharePoint document libraries and other non-default Microsoft Graph drives\n- Dropbox Team Space / admin impersonation flows\n\n### Run tests\n\n```bash\nmake test\n```\n\n`make test` currently maps to `test-stable` and runs the stable local package subset.\nUse `make test-all` when you want the full package test matrix.\n\n### Lint\n\n```bash\nmake lint\n```\n\n### Build\n\n```bash\nmake build\n```\n\n### Release\n\n```bash\nmake release\n```\n\n`make release` loads signing and notarization credentials from `.env`, computes the\ncurrent `git rev-list --count HEAD`, and releases with:\n\n- `MARKETING_VERSION=\u003cMFUSE_BASE_VERSION\u003e.\u003ccommit count\u003e`\n- `CURRENT_PROJECT_VERSION=\u003ccommit count\u003e`\n\nExample: when the commit count is `2` and `MFUSE_BASE_VERSION=1.0`, the release\nversion becomes `1.0.2` and the build number becomes `2`.\n\nThe release flow now expects:\n\n- a `Developer ID Application` certificate already installed in your macOS keychain\n- notarization credentials already stored via `xcrun notarytool store-credentials`\n- app and extension provisioning profiles already installed under `~/Library/MobileDevice/Provisioning Profiles`\n- `gh` already authenticated for the target repository with upload permission\n\nAfter notarization succeeds, `make release` automatically creates or updates the\nGitHub Release tagged `v\u003cMARKETING_VERSION\u003e`, sets its title to the same value,\nand uploads the generated DMG asset.\n\n## Testing\n\nCurrent test coverage is centered on Swift packages, especially:\n\n- `MFuseCore` core models and connection management\n- `MFuseFTP` parser behavior\n- `MFuseWebDAV` XML parsing\n\nSome backend tests are placeholders or integration-oriented, so protocol coverage is not uniform yet.\n\n## License\n\nMFuse is licensed under the GNU Affero General Public License v3.0. See [LICENSE](LICENSE).\n\nThird-party dependencies remain under their own licenses. See [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) for the current dependency notice summary.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flollipopkit%2Fmfuse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flollipopkit%2Fmfuse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flollipopkit%2Fmfuse/lists"}