ReboFiles is the drive of the Rebo suite, beside
Rebodocs. The bytes go straight from the browser
to your bucket and back, at addresses the server signs for a few minutes; the
server keeps the entries (folders, names, owners, the trash, versions) in a
store of your choosing, and asks your application who may do what.
It is early: every package is written and tested, nothing is on npm yet.
Besides folders, versions and the trash: uploads in parts that resume, of
whole folders, three at a time with the time each has left; the same file
asked about before it goes; search by name and by what is written; a viewer;
.zip downloads; links with a password or for one download; activity; quotas
and a trash that empties itself; folder colours; settings; tools for an
assistant; changes shown as they happen and folders of thousands, the drive
read a piece at a time; comments; groups; pictures and text of PDFs made by
the server; files checked by their bytes and by ClamAV; limits; retention,
legal holds and a person's data exported; only the changed parts of a file
sent; copies; requests for files through a link, each document in its place,
accepted or returned from Received; shares that end; webhooks;
frames of videos made by the server; Word versions compared; starred
files; fields of your own on each entry; notifications in the
drive; the space of each person for who looks after it; Excel workbooks shown
and searched; pictures read with OCR; Google Cloud Storage and Azure besides
S3; Word documents created, written by several at once and downloaded as PDF;
and a desktop application that keeps a folder in sync.
ROADMAP.md says what is next and what is checked.
Quick start
// app/api/files/[...path]/route.ts, in Next.js
import { createDriveHandler, s3Storage, s3OptionsFrom, sqliteMetadata } from '@rebofiles/server';
const handle = createDriveHandler({
storage: s3Storage(s3OptionsFrom(process.env)),
metadata: await sqliteMetadata('drive.sqlite'),
identify: async (request) => (await session(request))?.user ?? null,
authorize: (user, action, entry) => true, // your rules
secret: process.env.REBOFILES_SECRET!,
base: '/api/files',
});
export { handle as GET, handle as POST, handle as PATCH, handle as DELETE, handle as PUT };
Packages
| Package | What it is | Runs in |
|---|
@rebofiles/core | The model of a drive: folders, names, moving, the trash, versions, search. | Anywhere, no DOM |
@rebofiles/server | The routes, authorize(), the bytes on S3 or the disk, the metadata in memory or SQLite. | Node 22.12+ |
@rebofiles/drive | The whole drive without a framework, mounted on an element, and the client of the routes. | Any browser |
@rebofiles/react | <FileDrive>, and the hooks it is built from. | React 18+ |
@rebofiles/mcp | Tools for an AI assistant, over HTTP or stdio, with the user's own rights; with Rebodocs, its Word documents edited, each change a version. | Node 22.12+ |
@rebofiles/sync | A folder of the disk kept as a folder of the drive, both ways; rebofiles-sync as a command. | Node 22.12+, or a desktop app |
apps/desktop is the drive in a window of its own, with Tauri, and a folder of the computer kept in sync from it. examples/ has the server in Next.js, Express, Hono and Fastify, and sign-in with Auth.js, Clerk or a token of your own, each run by its tests.
Development
npm install
npm run dev # the playground, at http://localhost:5180: the drive on this computer, in storage/
npm run demo # the demo of the landing, at http://localhost:5181: entirely in the browser
npm run documents # Word documents made, written by several at once and read, at http://localhost:5184
npm run site # the landing page, at http://localhost:5182 (Next.js; npm run build:site makes it static, in apps/site/out,
# with the sitemap, llms.txt and a .md of each page, and fails on a page without its SEO)
npm test # Vitest
npm run test:browser # Playwright, in the Chrome of this computer
npm run typecheck # tsc, over every package
npm run lint # Biome
CONTRIBUTING.md has where things go, the conventions, and how a release is made. Every push and pull request runs the same in GitHub Actions.
License
MIT. Anyone may use it for anything.