You are browsing as a guest. Sign up (or log in) to start making projects!

Loom

  • 13 Devlogs
  • 100 Total hours

Loom is a self-hosted, permission-aware file manager for your own server or NAS :]

Ship #1 Pending review

Loom is a self hosted file manager for your own server or NAS. You point it at a folder of photos, videos, and documents you already have and it gives you a proper web app to browse, search, and stream them from anywhere, without ever touching or reorganizing the actual files on disk. I built it because I have a Samsung T7 drive full of a decade of family photos and every app I tried wanted to import everything into its own library and rename stuff. Loom just reads whatever folder structure you already have and works with that.
.
Under the hood it’s three Docker containers, a Next.js app for the UI and API, a separate worker that indexes the filesystem and makes thumbnails, and Postgres for metadata only, never file content. It has a full file browser with grid and list views, a photo and video viewer, drag and drop uploads, trash with recovery, multiple user accounts with per folder permissions, and an audit log. There’s also a public demo you can try without installing anything, it’s a completely fake version running with no backend at all, everything happens in your browser.
.
The hardest part by far was video playback. Browsers only play a handful of video formats natively, so anything else, HEVC from an iphone, old MOV and AVI files, needed converting on the fly. I didn’t want to transcode an entire two hour video before someone could watch even the first second of it, so I built a system that only converts the exact chunk of video someone is actually watching or seeking to, in six second pieces, and shares the work if two people ask for the same part at once. Getting that to not corrupt itself when someone seeks around took a lot of debugging.
.
The other really annoying stretch was making the demo version work. It’s a static build with literally no server, and the entire fake backend is done by intercepting fetch requests in the browser. I got it fully built and deployed and it looked fine, every page loaded, every request returned 200, and it was completely broken underneath, folders showed up empty and buttons did nothing. Turned out the code that fakes the backend was never actually running in the browser at all because of how Next.js bundles server components, and curl and normal build checks couldn’t catch it since everything technically responded fine. I only found it by scripting an actual headless browser to click through the site.
.
What I’m most proud of is probably the idle drive design. A lot of self hosted apps for photos and files constantly watch your disk or hash every file on every scan, and I really didn’t want that for a drive that spins down. Loom only reads file size and modified time to check for changes, and only actually opens a file’s content the first time something genuinely needs to, like making a thumbnail. A full rescan of a library that hasn’t changed barely touches the disk at all.
.
To test it, the easiest way is the live demo, no install needed, any username and password works and there’s a button that fills in the demo login for you. From there you can click into the sample folders (they go a few levels deep on purpose), open a photo or video, try renaming or trashing something and refresh the page to see it stuck around, and check out the settings pages for users, permissions, and the scanner. If you want to run the real thing, it’s a single script install with Docker, clone the repo and run the install script and it walks you through the rest.

  • 13 devlogs
  • 100h
Try project → See source code →
Open comments for this post

7h 14m 13s logged

DEVLOG_13: OKKK, so this is gonna be the last devlog for Loom before I ship it. Loom is now ready to be used by anyone in their VPS to manage their personal file :]
.
I also made a demo website for loom which anyone can visit to see how it works and looks at loomdemo.kaveeshkrishna.in
.
Fixed the last remaining bugs and made the permissions working properly, now every new account in Loom can be given a set of permissions and that account will not be able to access files other than the set permissions.

1
1
45
Open comments for this post

9h 7m 57s logged

DEVLOG_12: This was a long and major update session, I added a working notification system, if uploading files or downloading files or moving them causes any error, loom safely pauses the operation to avoid problems with the file and throws a notification stating what happened. Also other notifications like scan completion is also given :]
.
The file and folder upload features are actually working now, although it gets stuck when uploading very large files, I am trying to make it more reliable at the moment.
.
So let me explain how file upload actually works in loom, so when you upload a file it shows as uploaded on the screen but in the backend it stays in the internal storage of the vps, an automatic scan job is triggered for that file/folder, all the indexing and preview/thumbnail generation is completed and then the file/folder is transferred to the designated path.
.
File search now also works with the Photos, Videos, and Documents tabs.

1
1
143
Open comments for this post

7h 55m 33s logged

DEVLOG_11: OK!! so in this coding session I built a File Health page in Loom. This is a feature which I was personally excited to make :]
.
So basically while the Scan is running Loom tries to index files, generate preview and thumbnails for media files, if during this process any files throws error and Loom finds out the file is corrupt or has any issues it labels the issue and hides it from the file explorer and shows it in the dedicated File Health page.
.
At the moment it only displays these compromised files and shows the exact error they gave, but in the future I want to make Loom be able to fix these files if possible.

0
1
67
Open comments for this post

5h 56m 55s logged

DEVLOG_10: I have added a proper trash system. So any file you delete gets transferred to the .trash folder inside the same storage device and sits there for 15 days. if you don’t manually deleted them permanently, they get deleted automatically after 15 days.
.
Right now I am transferring all the deleted files and folders as it is to the trash, but I am thinking to make them compressed while storing inside the trash so that the don’t take up a lot of space, I haven’t implemented this though as I am not sure how am I gonna do it properly yet :]

0
0
16
Open comments for this post

4h 6m 55s logged

DEVLOG_9: Ok now the Favorites, Photos, Videos and Documents pages are working properly.
.
In the Fav page all the files which we have starred are listed, and on the vid, photos and docs pages the respective kind of files are listed.
.
These specific pages are essentially acting like a filter filtering out specific files extensions from throughout the storage device and listing all of the filtered files in one place :]

1
1
102
Open comments for this post

6h 28m 23s logged

DEVLOG_8: Added a proper folder path tree just like windows file explorer. It grows as you open folders inside folders and clicking on the previous folder name will take you to that folder. :]
.
I have made it properly responsive too, so if it grows too much the previous folders are replaced with “…”

0
1
94
Open comments for this post

8h 58m 23s logged

DEVLOG_7: OK!! so this time I have added a few small but noticeable features!!
.
First, I added multiple file/folder selection and bulk actions like delete.
.
Second, I made the search work, so it searches in the current open directory by default and if you are on the home page then ofc it searches the entire storage device, but if you are in some other folder and you try searching it will by default search in that folder only if you want it to search the entire storage device then u can click on the little global search icon beside the search bar (it appears only when you are not in the home directory)
And it is quite fast because it searches using the folder indexes stored in the database during scan.
.
Third, I added list view and in the grid view I added 4 different icon sizes, Small, Medium, Large, Extra Large.
.
And Finally, for all the right click actions, I added a long press action for touch screen devices :]

0
1
126
Open comments for this post

8h 4m 12s logged

DEVLOG_6: Ok, I don’t why it took me this long to implement but here we are _

I added right click action menu for folders, files and directory. right clicking on the empty space of current directory will give you options to upload files and folders and create folders (only create folder action works at the moment). And right clicking on folders and files will give you options like cut, paste, copy delete and star.

Starring a file will add it to the favorites folder which can be accessed via the side panel and deleting anything will send it to the trash folder and it will be permanently deleted after 15 days.

I am still working on making the proper UI of trash folder and fav folder :]

1
1
116
Open comments for this post

12h 11m 8s logged

DEVLOG_5: Worked for 12+ hours straight and finally implemented a lot of very important features.

The Scanner is now properly working there was a bug I solved which was making the scanner log the indexes of the files but never start a preview or thumbnail generation. Now each time U hit scan button it goes through the entire directory of your storage device and every file is properly indexed in a postgres database. every img file is sent to a thumbnail and preview generator and from every vid file its 1st second is captured and used to generate a thumbnail and preview for it as well.

All these thumbnails and previews are stored in the internal ssd of the vps so that when you are scrolling throught the galary the main ssd is not touched and the user sees a lower quality thumbnail of every image and vid instead of loading the entire thing in full quality.

To actually play vids on the browser, I’m using HLS Video Cache which lets me supply the vid to the user’s browser in chunks rather than the entire file at once, it makes the loading faster and playtime smooth.

Lasty I also added an audit log page which shows the last 20 audits on done on Loom :]

2
1
147
Open comments for this post

8h 54m 18s logged

DEVLOG_4: In the settings page I have added the option to create new users with different permissions.
I can decide which folders each account can see and what they can not see.

Also, the Scanner page now lets me start a manual scan which will go through the storage device and index all the files properly.
I am also working on an automatic Preview and Thumbnail generation while this scan runs but right now it is not working, hopegully by the next 2 Devlogs I can make it work :]

0
1
102
Open comments for this post

6h 18m 56s logged

DEVLOG_3: After doing a lot of research online about industry standard says to make a secure login method. I added a login page that uses email and password, no Google OAuth because Loom is not supposed to be a public website but for personal use.

I’m using better-auth for the actual logic. It hashes passwords with Scrypt so they are never stored in plain text, and it keeps sessions as a row in a sessions table plus a signed httpOnly cookie. The cookie is signed with BETTER_AUTH_SECRET which the installer generates as a random 48 byte value.

Each sessions last 30 days and refresh if they are older than a day, so you dont get logged out mid use.
CSRF is handled by TRUSTED_ORIGINS in the env, a list of origins allowed to make logged in requests, anything not on the list gets rejected :]

0
1
111
Open comments for this post

5h 41m 39s logged

DEVLOG_2: This one took more time than I thought but now Loom is able to identify folder structure and files inside my SSD :]

The scanner walks the tree with readdir and stat, and for every file it stores the path (relative to /media), the name, file or directory, the type, size and modified time. all of that becomes a FileNode row in Postgres.

0
1
164
Open comments for this post

9h 7m 2s logged

DEVLOG_1: After taking break from my project Sentinel, I have now started a new project Loom. It is again related to the home server I made using my 7 year old laptop!!

I am making this project because I wanted a reliable way to access and edit personal files which are on an external ssd attached to my server. Everything remotely. Right now I have made the initial UI of Loom and a rough outline of where buttons and options are gonna be. now I am gonna work on all the different sections you are seeing on the attached image :]

0
1
314

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…