{"id":18377904,"url":"https://github.com/florczakraf/slackfs","last_synced_at":"2025-08-26T15:30:54.909Z","repository":{"id":85584784,"uuid":"240968018","full_name":"florczakraf/slackfs","owner":"florczakraf","description":"Browse and upload slack files directly from your filesystem","archived":false,"fork":false,"pushed_at":"2020-02-22T22:07:17.000Z","size":28,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-06T00:38:22.782Z","etag":null,"topics":["fuse","fuse-filesystem","fusepy","python","slack"],"latest_commit_sha":null,"homepage":"https://blog.andr.host/posts/2020/02/23-fuse/","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/florczakraf.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}},"created_at":"2020-02-16T21:22:52.000Z","updated_at":"2023-09-08T18:03:32.000Z","dependencies_parsed_at":"2023-06-25T23:39:02.468Z","dependency_job_id":null,"html_url":"https://github.com/florczakraf/slackfs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/florczakraf%2Fslackfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/florczakraf%2Fslackfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/florczakraf%2Fslackfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/florczakraf%2Fslackfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/florczakraf","download_url":"https://codeload.github.com/florczakraf/slackfs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231050366,"owners_count":18320452,"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","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","fuse-filesystem","fusepy","python","slack"],"created_at":"2024-11-06T00:29:39.808Z","updated_at":"2024-12-24T04:30:14.757Z","avatar_url":"https://github.com/florczakraf.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# slackfs\nBrowse and upload slack files directly from your filesystem.\n\n## How does it work?\nThis is a simple [FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace) application that\ntalks to Slack using API in the backend. Right now it runs in a single-threaded foreground mode.\n\n## Usage\n```\n$ pip install -r requirements.txt\n$ export SLACKFS_TOKEN=xoxp-your-token\n$ ./slackfs.py /path/to/mountpoint\n```\nIt was tested with legacy tokens that can be generated at https://api.slack.com/legacy/custom-integrations/legacy-tokens.\n\n## Environment variables\n- `SLACKFS_TOKEN` -- token for the underlying Slack client\n- `SLACKFS_LOG_LEVEL`  -- the usual [Python logging level](https://docs.python.org/3/library/logging.html#levels),\n  defaults to `ERROR`\n\n## Filesystem layout\nIn the root of the filesystem there are directories that represent channels you are a member of.\nInside a channel you can find files that have been shared to it. There is a following naming\nconvention for files: `SLACK-FILE-ID_ORIGNAL-FILE-NAME` to avoid name overlapping. `stat` on a file\nreports its real creation time so it is possible to list files by it (e.g. `ls -lat | head`).\n\n```\n$ tree\n.\n├── some-channel\n│   ├── FU0BQXXXX_Screenshot_2020-02-21_21-21-29.png\n│   ├── FUCKUXXXX_somefile\n│   └── FUCL2XXXX_Screenshot_2020-02-21_21-23-41.png\n├── empty-channel\n├── other-channel\n│   ├── FJPC5XXXX_dh.png\n│   ├── FJS36XXXX_gh.png\n...\n```\n\n## Current limitations\nOnly some of the FUSE callbacks are implemented to provide the basic functionality. More sophisticated\nare provided by the `fusepy` library and most likely return unconditional success or some garbage.\nThere is hardly any error handling in slackfs which in turn cause syscalls to return errors to applications.\n\nNew directory creation is UB. Creating files in root of the filesystem is UB, as is modifying existing ones.\n\nThere is absolutely no slack api rate limit respecting implemented on slackfs side. Unless official slack\npython api library handles that itself, your key or even account might be temporarily blocked.\n\nAt the moment there will be at most some 200 channels visible and each of them will contain at most 200\nfiles (both arbitrarily chosen by the slack's api).\n\nChannels and files are fetched lazily only once, there is no way to *invalidate cache* other than remounting\nthe whole filesystem. However, after a successful upload of a new file, it's local name will change to reflect\nthe aformentioned naming convention.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflorczakraf%2Fslackfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflorczakraf%2Fslackfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflorczakraf%2Fslackfs/lists"}