![screenshot](https://raw.githubusercontent.com/mickael-kerjean/filestash_images/master/.assets/photo.jpg) # What is this?

Filestash started as a storage agnostic Dropbox-like file manager that speaks every storage protocol (SFTP, S3, SMB, WebDAV, IPFS, FTP, NFS, and about 20 more).

It grew into what we want to be the world's best file management platform. The world has enough silos to lock your data in. What is missing is the tooling to give those existing silos the Dropbox++ treatment with:

  1. Web client (the file manager available from your browser): documentation / screenshot / demo
  2. Native client for humans (the folder that syncs across your devices): repo / screenshots for mac, windows, linux, android
  3. Native client for agents (A shared folder that syncs for your agents): documentation / demo
  4. Gateways (to expose your data over any protocol): showcase

The philosophy that guides this project is: "anything that's not a fundamental truth of the universe lives in a plugin". That keeps the core lean and fast, and the opinions replaceable, so when your requirements get deep or weird, the answer is a plugin.

# Key Features # Plugins **Malleability** isn't an afterthought, it's the whole architecture: > anything that's not a fundamental truth of the universe lives in a plugin Taken literally, the "truths of the universe" are a set of [core interfaces](https://github.com/mickael-kerjean/filestash/tree/master/server/pkg/core), one for every key component of Filestash, and they're yours to implement (storage, authentication, authorisation, search, thumbnailing, apps, middleware, frontend changes, ...) The oldest one is the storage interface, the one at work whenever you connect to a storage: ```go type IBackend interface { Ls(path string) ([]os.FileInfo, error) Stat(path string) (os.FileInfo, error) Cat(path string) (io.ReadCloser, error) Mkdir(path string) error Rm(path string) error Mv(from string, to string) error Save(path string, file io.Reader) error Touch(path string) error } ``` Historically, plugins were made in Go and [compiled in](https://www.filestash.app/docs/guide/plugin-development.html#compiled-plugin). Today there's a second path: [runtime plugins](https://www.filestash.app/docs/guide/plugin-development.html#runtime-plugins), a zip you drop in the plugins folder. The zip can reshape the frontend and it can carry wasm implementing the very same core interfaces. That wasm runs in a VM with tight control on permissions: no declared network host, no way to phone home. Installing a plugin doesn't mean trusting it with everything. For example: ```rust use filestash::*; #[derive(Default)] pub struct Plugin; impl Authorisation for Plugin { fn ls(&self, _ctx: &Context, path: &str) -> Decision { self.check(path) } fn cat(&self, _ctx: &Context, path: &str) -> Decision { ... } fn stat(&self, _ctx: &Context, path: &str) -> Decision { ... } } impl Plugin { fn check(&self, path: &str) -> Decision { if path.split("/").any(|segment| segment == "top_secret") { log::warn!("[TOPSECRET] access denied !!"); return Decision::Deny; } Decision::Allow } } register!(Plugin: Authorisation); ``` These few lines give you a readonly view of your data where every folder named "top_secret" is off limits. For more examples, browse the [plugin folder](https://github.com/mickael-kerjean/filestash/tree/master/server/plugin), [the runtime plugin cookbook](https://github.com/mickael-kerjean/filestash/tree/master/server/plugin/plg_runtime_cookbook), and [the plugin marketplace](https://www.filestash.app/docs/plugin). And to be clear, code is the power-user path, there are [no code options](https://www.filestash.app/docs/guide/authorization.html) # Getting Started To install Filestash, head to the [Getting started](https://www.filestash.app/docs/?origin=github) guide. If you want to leverage plugins, head over to the [inventory](https://www.filestash.app/docs/plugin/?origin=github), or learn about [developing your own plugins](https://www.filestash.app/docs/guide/plugin-development.html?origin=github). # Support - Commercial Users → [support contract](https://www.filestash.app/pricing/?origin=github) - For individuals: - [#filestash](https://kiwiirc.com/nextclient/#irc://irc.libera.chat/#filestash?nick=guest??) on IRC (libera.chat) - Bitcoin: `3LX5KGmSmHDj5EuXrmUvcg77EJxCxmdsgW` - [Open Collective](https://opencollective.com/filestash) # Why Familiar with the infamous comment from Dropbox's launch on HN? In my memory it goes like this: # Credits Filestash stands on the shoulders of: [contributors](https://github.com/mickael-kerjean/filestash/graphs/contributors), folks developing [awesome libraries](https://github.com/mickael-kerjean/filestash/blob/master/go.mod), [BrandonM](https://news.ycombinator.com/user?id=BrandonM), a whole bunch of C stuff (the [C standard library](https://imgs.xkcd.com/comics/dependency.png), [libjpeg](https://libjpeg-turbo.org/), [libpng](https://www.libpng.org/pub/png/libpng.html), [libgif](https://giflib.sourceforge.net/), [libraw](https://www.libraw.org/about) and many more), [fontawesome](https://fontawesome.com), [material](https://material.io/icons/), [Browser stack](https://www.browserstack.com/) to let us test on real devices, and the many guys from Nebraska and elsewhere who have been thanklessly maintaining the critical pieces that Filestash sits on top: credit to the nebraska guy on xkcd