7 ms·
Show HN: CallFS – S3-style object store in one Go binary (MIT)
We started CallFS after yet another late-night “why did the uploads vanish?” incident. Our small team had stitched together rsync, a fragile NFS mount, and an S3 bucket—none of it observable, all of it waiting to bite us.
So we wrote a single-process file service in Go that:
• Speaks the S3 API (so existing tooling works).
• Stores hot data on local disks for speed; cold data can sit in any S3-compatible bucket.
• Exposes Prometheus metrics and JSON logs by default, because “what happened?” shouldn’t be guesswork.
• Ships as a ~25 MB static binary—no external deps, MIT license.
Today it’s stable for single-node or side-by-side deployments. Clustering is on the roadmap, replication will follow, but we wanted to share the code early and hear real-world pain points. If storage glue code ever ruined your weekend, we’d love feedback and PRs.
- cowboyscott 1y agoI was wanting this to exist today :) Thanks for sharing the work
- ebogdum 1y agoWell, glad to be of service and I really hope it gives you what you need. If not, just open an issue and we will see what we can do. :) Thanks for sharing your thoughts.
- mt42or 1y agohttps://github.com/juicedata/juicefs https://github.com/juicedata/juicefs
- ebogdum 1y agoSO COOL. This is way more than what my scope was, maybe I can learn some stuff. I do have some future plans on replication and mutex and specific files from specific instances. Thanks for sharing this.
- evil-olive 1y agohttps://github.com/seaweedfs/seaweedfs https://github.com/seaweedfs/seaweedfs is excellent as well
- mdaniel 1y agoI can't quite square up your "speaks the S3 API" with https://github.com/ebogdum/callfs#file-operations https://github.com/ebogdum/callfs#file-operations seeming to do its own thing, which for sure would not leverage existing tooling And it would have been better if in your "static binary" sentence you had included its dependence upon both PostgreSQL and Redis
- ebogdum 1y agoVery fair points, thank you very much for taking the time. I will make the changes later today to mention the dependencies. As for the "speaks the S3 API", the idea is that this has two backends right now, Local File System and any S3 compatible API, like AWS S3, MinIO, DigitalOcean Object Storage ... and so on. In other words you can use them all at the same time, provided you have an instance for each. But you did give me an idea, as to the fact that I need to add some directory/bucket discovery for existing files. Thank you very much for your feedback.
- jasonjmcghee 1y agoI had the same question, and started looking more deeply at the project. Would be interested to hear if this was built by OP or vibe-coded.
- ebogdum 1y agoA bit of both, as you can imagine, there are so many tedious tasks that consume time for so little in return, so yeah.
- moritonal 1y agoSo you're trying to get buy-in for a tool, when you yourself don't see the point in confirming it works? Those "tedious tasks" are software development.
- ebogdum 1y agoWhat, you mean writing documentations and readme? Of course I'm using this. I have a homelab with 12 PI's, this tool helps me play with files between all of them, any way I want. Might not be the world changing usage you were hopping for, but for me it's enough.
- techn00 1y agoI am so sick of AI generated README's, they follow the samn damn format.
- ebogdum 1y agoAs you can imagine, "story telling" isn't something everyone has mastered, so it does make the job easier. But I do get your point.
- Oxodao 1y agoWe don't want story telling. We just want a clear, few lines long paragraph that tells everything you need to know about the software
- dawnerd 1y agoI'm so sick of these vibe coded apps. They all end up having security issues. Definitely wouldn't trust it.
- ebogdum 1y agoYou have a very good point. Definitely, no one would force you to use something you don't find as trustworthy or valuable.
- MOARDONGZPLZ 1y agoKEY FEATURES :key-emoji: CONTRIBUTING :handshake-emoji: CORE FEATURES :apple-core-emoji:
- deleted 1y ago[deleted]
- TheDong 1y ago> Speaks the S3 API Let's test that lol. First, I looked at the docker compose file, seems like an easy way to run it right? Wrong, the docker compose file just runs minio, a real s3 compatible thing: https://github.com/ebogdum/callfs/blob/16e1096095c809f31aa938856ca7cc21e2b29fdb/docker-compose.yml#L34 https://github.com/ebogdum/callfs/blob/16e1096095c809f31aa93... Why check in a docker-compose that only runs someone else's code, not your own project? Okay, fine, let's run it normally: ./callfs server -c ./config.yaml.example failed to load config file ./config.yaml.example: file provider does not support this method Okay, fine, your example config doesn't work with an inscrutable error. But running it without a config flag works, so let's do that: {"level":"info","ts":1752571569.821955,"caller":"cmd/main.go:251","msg":"Starting HTTPS server","addr":":8443"} Let's see if it's really s3 compatible now: AWS_CA_BUNDLE=./server.crt aws --endpoint-url https://localhost:8443 s3 mb s3://foo make_bucket failed: s3://foo An error occurred (404) when calling the CreateBucket operation: Not Found "404" is not the response AWS gives to a make bucket request. Reading the actual docs, this is _not_ s3 compatible, not even close. So much for "Speaks the S3 API". Just use minio, or one of the other actually functioning things in this space.
- MOARDONGZPLZ 1y agoThis is a vibe coded project. It doesn’t work very well at all, not going to rehash what others have found, but these projects have been a major plague to the Go community over the last six months. They’re essentially the code version of littering.
- sivchari 1y agoI'm going to test it :)