<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Radhey Kalra</title>
    <description>The latest articles on DEV Community by Radhey Kalra (@jr4dh3y).</description>
    <link>https://dev.to/jr4dh3y</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3964269%2F610637a2-f6eb-432d-927f-3b0394b8e458.jpeg</url>
      <title>DEV Community: Radhey Kalra</title>
      <link>https://dev.to/jr4dh3y</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jr4dh3y"/>
    <language>en</language>
    <item>
      <title>hi</title>
      <dc:creator>Radhey Kalra</dc:creator>
      <pubDate>Thu, 15 Oct 2026 15:51:41 +0000</pubDate>
      <link>https://dev.to/jr4dh3y/hi-3f2p</link>
      <guid>https://dev.to/jr4dh3y/hi-3f2p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>BoxBox v0.3.0: file and folder sharing for a self-hosted file manager</title>
      <dc:creator>Radhey Kalra</dc:creator>
      <pubDate>Tue, 06 Oct 2026 09:50:23 +0000</pubDate>
      <link>https://dev.to/jr4dh3y/boxbox-v030-file-and-folder-sharing-for-a-self-hosted-file-manager-3aof</link>
      <guid>https://dev.to/jr4dh3y/boxbox-v030-file-and-folder-sharing-for-a-self-hosted-file-manager-3aof</guid>
      <description>&lt;p&gt;A few months ago I wrote about &lt;a href="https://dev.to/jr4dh3y/i-built-boxbox-a-self-hosted-file-manager-for-home-labs-12eg"&gt;building BoxBox&lt;/a&gt;, a self-hosted file manager for homelabs and NAS boxes. v0.3.0 is out, with file and folder sharing.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/cv2_oNkhYI0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Music: "the kill 2" by Lex Amarni &amp;amp; 2muchmotion.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File and folder sharing.&lt;/strong&gt; Every file or folder gets a token link. Folder links come in four levels: View only, Upload only, Upload + delete, and Full access. Links can expire and can be revoked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A public share page.&lt;/strong&gt; Recipients get a path bar, a file list, previews, a read-only code editor (editable with full access), arrow-key navigation, and ZIP downloads. No account needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Folder uploads.&lt;/strong&gt; Drop a whole folder in. Uploads go in chunks and keep nested paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drives and Places.&lt;/strong&gt; Top-level mounts are drives. A mount inside another mount (like &lt;code&gt;Downloads&lt;/code&gt; inside &lt;code&gt;home&lt;/code&gt;) shows up under Places. You can override either with &lt;code&gt;kind:&lt;/code&gt; in the config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your wallpaper on share pages.&lt;/strong&gt; Each user's wallpaper is stored on the server and shown to their recipients.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The hard part: sharing from a box that holds everything
&lt;/h2&gt;

&lt;p&gt;A homelab file manager usually runs with access to your disks, backups, and configs. Public links need to keep recipients inside the shared path. These are the rules BoxBox follows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The token is the only credential.&lt;/strong&gt; Each link is 32 random bytes from &lt;code&gt;crypto/rand&lt;/code&gt;, encoded as 43 URL-safe characters. Recipient endpoints are public, so they get their own per-IP rate limit, separate from login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every failure looks the same.&lt;/strong&gt; Unknown, expired, and revoked tokens all return the same &lt;code&gt;404&lt;/code&gt;. Someone guessing tokens learns nothing about which links ever existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-check the path on every request.&lt;/strong&gt; A share stores a path, not a promise. On every recipient request BoxBox resolves the path against the &lt;em&gt;current&lt;/em&gt; mount config. If you remove or rename a mount, its links stop working. If a mount becomes read-only, its links can still read but can't upload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload-only means upload-only.&lt;/strong&gt; Recipients with upload access must not overwrite existing files. Uploads land in a temp file and are published with &lt;code&gt;renameat2(RENAME_NOREPLACE)&lt;/code&gt; on Linux, so the kernel refuses to replace an existing file atomically.&lt;br&gt;
On other platforms it falls back to a hard link plus remove, which gives the same no-replace guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revocation wins races.&lt;/strong&gt; If you revoke a link while someone is mid-upload, the upload is not published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat previews as hostile.&lt;/strong&gt; Recipient downloads and previews use the same sandboxed &lt;code&gt;Content-Security-Policy&lt;/code&gt; as the main app. HTML, SVG, and XML are always downloaded, never rendered inline, so a shared file can't run script on your BoxBox origin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZIPs stay inside the share.&lt;/strong&gt; Folder archives check every entry's traversal and resolved path against the share root before streaming, so a symlink can't pull in files from outside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep internals private.&lt;/strong&gt; Recipient responses never include mount names or server paths. The share store is &lt;code&gt;0700&lt;/code&gt;, and the token-bearing &lt;code&gt;shares.json&lt;/code&gt; is &lt;code&gt;0600&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Upgrading
&lt;/h2&gt;

&lt;p&gt;One breaking change: the container now listens on &lt;strong&gt;8080&lt;/strong&gt; instead of 80. The container side of your port mapping, the healthcheck, and any reverse proxy must match &lt;code&gt;port&lt;/code&gt; in &lt;code&gt;config.yaml&lt;/code&gt;. The &lt;a href="https://boxbox.radhey.dev/docs/release/" rel="noopener noreferrer"&gt;release notes&lt;/a&gt; cover this, plus rollback.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BOXBOX_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghcr.io/jr4dh3y/boxbox:v0.3.0 docker compose pull
&lt;span class="nv"&gt;BOXBOX_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghcr.io/jr4dh3y/boxbox:v0.3.0 docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site and docs: &lt;a href="https://boxbox.radhey.dev" rel="noopener noreferrer"&gt;https://boxbox.radhey.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo (MIT): &lt;a href="https://github.com/jR4dh3y/BoxBox" rel="noopener noreferrer"&gt;https://github.com/jR4dh3y/BoxBox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Release: &lt;a href="https://github.com/jR4dh3y/BoxBox/releases/tag/v0.3.0" rel="noopener noreferrer"&gt;https://github.com/jR4dh3y/BoxBox/releases/tag/v0.3.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run a homelab, I'd like to know what you'd share first, and what would stop you from exposing a share page to the internet.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>svelte</category>
      <category>selfhosting</category>
    </item>
    <item>
      <title>I built BoxBox, a self-hosted file manager for home-labs</title>
      <dc:creator>Radhey Kalra</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:48:09 +0000</pubDate>
      <link>https://dev.to/jr4dh3y/i-built-boxbox-a-self-hosted-file-manager-for-home-labs-12eg</link>
      <guid>https://dev.to/jr4dh3y/i-built-boxbox-a-self-hosted-file-manager-for-home-labs-12eg</guid>
      <description>&lt;p&gt;I wanted a simple way to manage files on my Linux server from the browser.&lt;/p&gt;

&lt;p&gt;Not a full cloud suite.&lt;br&gt;
Not a bloated desktop app.&lt;br&gt;
Just a clean web UI over the folders and disks I already have mounted.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;BoxBox&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;BoxBox is a self-hosted file manager for homelabs, NAS-style setups, and bare-metal Linux servers.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/jR4dh3y/BoxBox" rel="noopener noreferrer"&gt;https://github.com/jR4dh3y/BoxBox&lt;/a&gt;&lt;br&gt;
Site: &lt;a href="https://boxbox.radhey.dev" rel="noopener noreferrer"&gt;https://boxbox.radhey.dev&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;BoxBox lets you browse multiple mounted paths from one UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mnt/storage
/srv/media
/home/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-mount navigation&lt;/li&gt;
&lt;li&gt;Chunked uploads for large files&lt;/li&gt;
&lt;li&gt;Real-time progress through WebSockets&lt;/li&gt;
&lt;li&gt;Copy, move, and delete operations&lt;/li&gt;
&lt;li&gt;Image, audio, video, PDF, code, and text previews&lt;/li&gt;
&lt;li&gt;Monaco editor for editing config and code files in the browser&lt;/li&gt;
&lt;li&gt;Docker and Compose deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Manage Linux server files like local folders.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why not just use Nextcloud?
&lt;/h2&gt;

&lt;p&gt;Nextcloud, Seafile, Syncthing, and similar tools are great, but they are much bigger than what I wanted.&lt;/p&gt;

&lt;p&gt;I did not need calendars, contacts, sync clients, plugins, or a whole cloud ecosystem.&lt;/p&gt;

&lt;p&gt;I wanted something narrower:&lt;/p&gt;

&lt;p&gt;Open browser. Pick mount. Browse files. Upload and download. Preview media. Edit config files. Move stuff around.&lt;/p&gt;

&lt;p&gt;That is the core loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;The backend is written in &lt;strong&gt;Go&lt;/strong&gt;.&lt;br&gt;
The frontend is built with &lt;strong&gt;SvelteKit&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;br&gt;
The editor uses &lt;strong&gt;Monaco&lt;/strong&gt;.&lt;br&gt;
Live progress and events use &lt;strong&gt;WebSockets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Deployment is Docker-first, so the setup is meant to stay simple for homelab use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want feedback on
&lt;/h2&gt;

&lt;p&gt;BoxBox is still early, and I would love feedback from people who actually run homelabs or NAS servers.&lt;/p&gt;

&lt;p&gt;PRs, issues, feature requests, commits, bug reports, and security feedback are open.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/jR4dh3y/BoxBox" rel="noopener noreferrer"&gt;https://github.com/jR4dh3y/BoxBox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>svelte</category>
      <category>selfhosting</category>
    </item>
  </channel>
</rss>
