jocalsend post
BIN
content/sundries/jocalsend/fuzzy_file_sending.png
Normal file
After Width: | Height: | Size: 99 KiB |
170
content/sundries/jocalsend/index.md
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
+++
|
||||||
|
title = "Jocalsend: actually useful software if you're a weirdo like me"
|
||||||
|
slug = "jocalsend"
|
||||||
|
date = "2025-08-21"
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["software", "sundry", "proclamation", "localfirst", "useful", "p2p"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
# Jocalsend: a peer-to-peer file sharing program using local IP subnetworking
|
||||||
|
|
||||||
|
Recently, I released a program called
|
||||||
|
[`jocalsend`](https://git.kittencollective.com/nebkor/joecalsend), which is a play on
|
||||||
|
"[LocalSend](https://localsend.org/)". LocalSend is, in its own words, " a free,
|
||||||
|
open-source app that allows you to securely share files and messages with nearby devices over your
|
||||||
|
local network without needing an internet connection." You can think of it as a sort of "we have
|
||||||
|
[AirDrop](https://en.wikipedia.org/wiki/AirDrop) at home", where "home" is non-Apple devices and
|
||||||
|
computers. I happen to be a person without any Apple devices, and basically the only thing I ever
|
||||||
|
envy about those unlike me is AirDrop, since I often want to transfer files or bits of text back and
|
||||||
|
forth between my phone and computer.
|
||||||
|
|
||||||
|
LocalSend comes in the form of a cross-platform graphical app that runs on both mobile and desktop.
|
||||||
|
On my Android phone, it works great, and does exactly what I'd hope it would do. On my Linux
|
||||||
|
desktop, however, it requires a lot more fiddly mousing than I like to do, plus launching a GUI for
|
||||||
|
what's supposed to be a low-friction, ad-hoc sharing activity is, frankly, a drag. I've always been
|
||||||
|
a fan of terminal-based programs, and the terminal has been my primary interface for many, many
|
||||||
|
years. It seemed natural to write a TUI version of LocalSend, and so here we are.
|
||||||
|
|
||||||
|
## So, what's it good for?
|
||||||
|
|
||||||
|
Has this ever happened to you? Someone sends you a text message on your phone, and it contains a
|
||||||
|
URL. You go to check it out, but it looks completely terrible on mobile, or tries to force you to
|
||||||
|
install an app, or whatever; you want to use your desktop or laptop computer to look at it. But now
|
||||||
|
what? Send yourself an email? Paste it into a Google Doc? Maybe you have Signal desktop so you can
|
||||||
|
send yourself a Signal message then read it there. Or maybe you have an image or something on your
|
||||||
|
desktop computer that you'd like to get onto your phone; your choices are basically the same as with
|
||||||
|
a bit of text.
|
||||||
|
|
||||||
|
You know what all those choices have in common? They all *fucking suck ass*. Primarily because they
|
||||||
|
require a round-trip from your local network out to a corporate data center, which means you need to
|
||||||
|
be connected to the public internet. What if your internet connection is down? Well, maybe you'd be
|
||||||
|
able to do something with your phone, but that means you might want to get things from your regular
|
||||||
|
computer to the phone, which you can't do now. But they're also all just kinda obnoxious,
|
||||||
|
aesthetically. It would be nice to just be able to directly beam the data from one thing to another,
|
||||||
|
and that's what LocalSend does[^airdrop-explained].
|
||||||
|
|
||||||
|
Something else that's nice about LocalSend is that they published [a protocol
|
||||||
|
spec](https://github.com/localsend/protocol), which means that anyone can make their own compatible
|
||||||
|
implementation, which is where jocalsend comes in. I plan on writing a follow-up[^follow-up]
|
||||||
|
about the design and implementation of jocalsend, but that's going to be a much longer and
|
||||||
|
even-more-niche-interest post, so I'll just skip that for now. Stay tuned, though, if that's a
|
||||||
|
boat-floater for ya!
|
||||||
|
|
||||||
|
## How do I install it?
|
||||||
|
|
||||||
|
### Via cargo
|
||||||
|
|
||||||
|
Jocalsend is written in [Rust](https://www.rust-lang.org/), a programming language released by
|
||||||
|
Mozilla about ten years ago, and meant to be used for writing high-performance software in a way
|
||||||
|
that was easier to do safely than in other languages like C++, but [its aegis has
|
||||||
|
expanded](https://doc.rust-lang.org/book/foreword.html) to encompass basically any and all types of
|
||||||
|
software. Installing Rust on your computer is [very simple](https://rustup.rs/).
|
||||||
|
|
||||||
|
One nice thing that Rust provides out of the box is a package manager called "cargo"[^cargo], and I
|
||||||
|
think this fact alone is responsible for a big portion of Rust's success and popularity. You can use
|
||||||
|
cargo to install any published Rust package that's on [crates.io](https://crates.io), the official
|
||||||
|
Rust package site. Jocalsend has been [published to crates.io](https://crates.io/crates/jocalsend),
|
||||||
|
so if you have Rust installed, just run,
|
||||||
|
|
||||||
|
```
|
||||||
|
cargo install jocalsend
|
||||||
|
```
|
||||||
|
|
||||||
|
which will install the `jocalsend` program to `$HOME/.cargo/bin`; add that directory to you `$PATH`
|
||||||
|
and then you can run `jocalsend` from the command line:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ jocalsend -h
|
||||||
|
A TUI for LocalSend
|
||||||
|
|
||||||
|
Usage: jocalsend [OPTIONS]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-f, --file <FILE> File to pre-select for sending
|
||||||
|
-t, --text <TEXT> Text string to send
|
||||||
|
-h, --help Print help
|
||||||
|
-V, --version Print version
|
||||||
|
```
|
||||||
|
|
||||||
|
### From nixpkgs
|
||||||
|
|
||||||
|
If you use [NixOS](https://nixos.org/) or otherwise use nixpkgs[^nixpkgs], you can also get it from there:
|
||||||
|
|
||||||
|
```
|
||||||
|
nix-shell -p jocalsend
|
||||||
|
```
|
||||||
|
|
||||||
|
and it'll do what you expect.
|
||||||
|
|
||||||
|
## How do I use it?
|
||||||
|
|
||||||
|
When you first run it, you'll be on the main screen. Clockwise from the bottom, the lower left contains information about the
|
||||||
|
network it's on, the lower right has a list of any LocalSend peers it discovered, the upper right
|
||||||
|
has log output from jocalsend, and finally the upper left will show any incoming transfer requests,
|
||||||
|
with possible text preview:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Here we can see that my phone is already available as a peer.
|
||||||
|
|
||||||
|
### Receiving files and text
|
||||||
|
|
||||||
|
I can use my phone to send some text to my computer, and it will show a preview of the text even in
|
||||||
|
the main screen:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If I hit `r`, I'll be taken to the receiving screen, where I can approve or deny the incoming
|
||||||
|
transfer request, with `a` or `d` respectively:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If the incoming content is not plain text, no preview will be shown:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
From nearly any screen, hitting the `esc` key will take you to whatever screen you were in
|
||||||
|
previously.
|
||||||
|
|
||||||
|
### Sending files and text
|
||||||
|
|
||||||
|
Hitting the `s` key will take you to the sending screen. By default, it will show a list of files
|
||||||
|
from your current directory in the upper left, with log output on the right, and peers on the
|
||||||
|
bottom:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Hit `/` to do fuzzy filename selection by entering text:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Regardless if whether or not you're doing fuzzy filename search, the up and down arrow keys will
|
||||||
|
move the selection up or down, respectively.
|
||||||
|
|
||||||
|
If you'd like to send text, hit `t`:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
then `enter` to send, and you can see a preview on the mobile device:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
And that's all pretty much there is!
|
||||||
|
|
||||||
|
## Wrapping up
|
||||||
|
|
||||||
|
Anyway, it's been pretty fun making jocalsend. I now use it daily, and every time I do, I'm pretty
|
||||||
|
darned pleased with myself. If you're a weirdo like me who doesn't use Apple stuff, maybe this would
|
||||||
|
be useful for you, too.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[^airdrop-explained]: did I just mansplain why something like airdrop is useful? idunno, maybe, sorry
|
||||||
|
|
||||||
|
[^follow-up]: still need to write part 2 of [my Gossip Glomers](/sundries/glome-ing-pt1) post...
|
||||||
|
|
||||||
|
[^cargo]: I honestly don't really get the naming theme with Rust, cargo, and crates; are crates typically rusty? I usually think of them as being made of wood.
|
||||||
|
|
||||||
|
[^nixpkgs]: I wasn't the one who added to to nixpkgs; a total stranger who is a nixpkgs maintainer saw that it had been featured
|
||||||
|
as the ["terminal tool of the week"](https://terminaltrove.com/jocalsend/) on a site called
|
||||||
|
Terminal Trove, thought it was neat, and [added it](https://github.com/NixOS/nixpkgs/pull/435106).
|
BIN
content/sundries/jocalsend/main_screen.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
content/sundries/jocalsend/main_screen_txt_rx_request.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
content/sundries/jocalsend/picking_file_sending.png
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
content/sundries/jocalsend/receiving_file_from_phone.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
content/sundries/jocalsend/receiving_text_from_phone.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
content/sundries/jocalsend/receiving_text_on_phone.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
content/sundries/jocalsend/sending_text_to_phone.png
Normal file
After Width: | Height: | Size: 105 KiB |