{"id":24567530,"url":"https://github.com/suprasummus/ipfs-api-mount","last_synced_at":"2025-09-08T12:39:17.527Z","repository":{"id":32499542,"uuid":"109889428","full_name":"SupraSummus/ipfs-api-mount","owner":"SupraSummus","description":"Mount IPFS directory as local FS.","archived":false,"fork":false,"pushed_at":"2021-11-06T22:29:29.000Z","size":164,"stargazers_count":28,"open_issues_count":9,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-22T12:59:08.001Z","etag":null,"topics":["fuse","ipfs","mount"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/SupraSummus.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-11-07T20:51:46.000Z","updated_at":"2025-03-28T01:23:26.000Z","dependencies_parsed_at":"2022-08-07T17:31:51.245Z","dependency_job_id":null,"html_url":"https://github.com/SupraSummus/ipfs-api-mount","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/SupraSummus/ipfs-api-mount","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupraSummus%2Fipfs-api-mount","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupraSummus%2Fipfs-api-mount/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupraSummus%2Fipfs-api-mount/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupraSummus%2Fipfs-api-mount/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SupraSummus","download_url":"https://codeload.github.com/SupraSummus/ipfs-api-mount/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SupraSummus%2Fipfs-api-mount/sbom","scorecard":{"id":135899,"data":{"date":"2025-08-04","repo":{"name":"github.com/SupraSummus/ipfs-api-mount","commit":"e4e07a7376afe7b57d0515a4bf22db4fe60678b1"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T06:30:48.323Z","repository_id":32499542,"created_at":"2025-08-16T06:30:48.323Z","updated_at":"2025-08-16T06:30:48.323Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274187204,"owners_count":25237741,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-08T02:00:09.813Z","response_time":121,"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":["fuse","ipfs","mount"],"created_at":"2025-01-23T13:18:57.843Z","updated_at":"2025-09-08T12:39:17.468Z","avatar_url":"https://github.com/SupraSummus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"ipfs-api-mount\n==============\n\n[![Build Status](https://travis-ci.com/SupraSummus/ipfs-api-mount.svg?branch=master)](https://travis-ci.com/SupraSummus/ipfs-api-mount)\n[![codecov](https://codecov.io/gh/SupraSummus/ipfs-api-mount/branch/master/graph/badge.svg)](https://codecov.io/gh/SupraSummus/ipfs-api-mount)\n\nMount IPFS directory as local FS.\n\ngo-ipfs daemon has this function but as of version 0.9.1 it's slow.\n`ipfs-api-mount` aims to be more efficient. For sequential access to\nrandom data it's ~3 times slower than `ipfs cat` but also ~20 times\nfaster than `cat`ing files mounted by go-ipfs.\n\nIt's supposed that FS mounted by go-ipfs daemon is slow because of file\nstructure being accessed in every read. By adding caching one can improve\nperformance a lot.\n\nHow to use\n----------\n\nInstall package ...\n\n    pip install ipfs-api-mount\n\n... and then\n\n    mkdir a_dir\n    ipfs-api-mount QmXKqqUymTQpEM89M15G23wot8g7n1qVYQQ6vVCpEofYSe a_dir \u0026\n    ls a_dir\n    # aaa  bbb\n\nTo unmount\n\n    fusermount -u a_dir\n\n### Mount whole IPFS at once\n\nApart from mounting one specified CID you can also mount whole IPFS namespace. This is similar to `ipfs mount` provided in go-ipfs.\n\n    mkdir a_dir\n    ipfs-api-mount-whole a_dir \u0026\n    ls a_dir/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco\n    # -  I  index.html  M  wiki\n\n### Python-level use\n\nMountpoints can be created inside python programs\n\n    import os\n    import ipfshttpclient\n    from ipfs_api_mount.ipfs_mounted import ipfs_mounted\n    from ipfs_api_mount.fuse_operations import IPFSOperations\n\n    with ipfs_mounted(IPFSOperations('QmSomeHash', ipfshttpclient.connect())) as mountpoint:\n        print(os.listdir(mountpoint))\n\nBenchmark\n---------\n\nTry it yourself and run `./benchamrk [number of Mbytes]`.\n\nExample output:\n\n    ipfs version 0.9.1\n    creating 100MB of random data and uploading to ipfs ...\n    100MB of data at:\n            QmTnYkR6FBajXhY6bmRnTtuQ2MA8f66BoW2pFu2Z6rParg\n            QmaiV6qpn4k4WEy6Ge7p2s4rAMYTY6hd77dSioq4JUUaLU/data\n\n    ### ipfs cat QmTnYkR6FBajXhY6bmRnTtuQ2MA8f66BoW2pFu2Z6rParg\n    4f63d1c2056a8c33b43dc0c2a107a1ec3d679ad7fc1b08ce96526a10c9c458d7  -\n\n    real    0m0.686s\n    user    0m0.867s\n    sys     0m0.198s\n\n    ### ipfs-api-mount QmaiV6qpn4k4WEy6Ge7p2s4rAMYTY6hd77dSioq4JUUaLU /tmp/tmp.7CyBemuY5Q\n    ### cat /tmp/tmp.7CyBemuY5Q/data\n    4f63d1c2056a8c33b43dc0c2a107a1ec3d679ad7fc1b08ce96526a10c9c458d7  -\n\n    real    0m2.387s\n    user    0m0.495s\n    sys     0m0.145s\n\n    ### cat /ipfs/QmTnYkR6FBajXhY6bmRnTtuQ2MA8f66BoW2pFu2Z6rParg\n    4f63d1c2056a8c33b43dc0c2a107a1ec3d679ad7fc1b08ce96526a10c9c458d7  -\n\n    real    0m59.976s\n    user    0m2.975s\n    sys     0m1.166s\n\nMore in depth description\n-------------------------\n\n`ipfs-api-mount` uses node API for listing directories and reading\nobjects. Objects are decoded and file structure is created localy (not\nin IPFS node). Caching is added on objects level. In case of nonlinear\nfile access with many small reads there is a risk of cache thrashing.\nIf this occurs performance will be much worst than without cache. When\nusing the command you can adjust cache size to get best performance (but\nfor cache thrashing there is little hope).\n\nCaching options\n---------------\n\nThere are four cache parameters:\n* `--ls-cache-size` - how many directory content lists are cached. Increase this if you want subsequent `ls` to be faster.\n* `--block-cache-size` - how many data blocks are cached. This cache needs to be bigger if you are doing sequential reads in many scattered places at once (in single or multiple files). It doesn't affect speed of reading the same spot for the second time, because this is handled by FUSE (`kernel_cache` option). This cache is memory-intensive - takes up to 1MB per entry.\n* `--link-cache-size` - Files on IPFS are trees of blocks. This cache keeps the tree structure. Increase this cache's size if you are reading many big files simultanously (depth of a single tree is generally \u003c4, but many of them can overflow the cache). It doesn't affect speed of reading previously read data - this is handled by FUSE (`kernel_cache` option).\n* `--attr-cache-size` - cache related to file and directory attributes. This needs to be bigger if you are reading many files attributes, and you want subsequent reads to be faster. For example, if you do `ls -l` (`-l` will call `stat()` on every file) on a large directory and you want second `ls -l` to be faster, you need to set this cache to be bigger than number of files in the directory.\n\nHope that makes sense ;-)\n\n\nSee also\n--------\n\n* [Discussion at go-ipfs repo](https://github.com/ipfs/go-ipfs/issues/2166) along with an idea to fix it by adding cache\n* [js-ipfs-mount](https://github.com/piedar/js-ipfs-mount) - similar utility, but written in nodejs\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuprasummus%2Fipfs-api-mount","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuprasummus%2Fipfs-api-mount","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuprasummus%2Fipfs-api-mount/lists"}