This is a simple pasting service, designed to be quick and easy to use. It's fully serverside rendered, and does not include a single line of javascript. Should work perfectly on slower devices, TUI browsers, or anything of the sort.
All the routes can also receive and return JSON. Just pass a JSON payload and/or put JSON into your Accept
header. You can use httpie
, for examploe.
This workspace includes both the server
and a companion cli
, on their respective subdirectories.
The source code (licensed under AGPLv3) for this app can be at github and at my personal git. Feel free to contribute wherever you feel more confortable.
The version live at paste.misterio.me runs on my home Raspberry Pi 4 (running NixOS 22.05). Deployments are reproductible and based on my configuration repository.
I was a little burned out fixing older code at work, so i just wanted to make a nice real world app in a weekend, without having to deal with legacy codebases or databases. Just my clean new shiny schema.
I really recommend doing stuff like this (specially in the exact same stack you use at work). Making stuff from scratch makes it easier to plan out a nicer architecture, getting insights you can't get on an older codebase.
I like how paste.sr.ht and gist.github.com, so why not create my own clone?
This is a fully server-side rendered web application.
It is built with Rust, using the Rocket web framework, and Tera templating engine. Paired with a PostgreSQL relational database.
I dislike class-heavy HTML/CSS, so the styling is based on the awesome Pico.css sheet. Both Pico.css and my own customizations are SCSS, which is compiled at build-time (and included into the executable) using grass.
Also to avoid client-side javascript code, syntax highlighting (a core feature of the app) is also serverside. I use syntect for that. Sadly the default syntax set is kinda stale (based on sublimetext's upstream definitions), so i have slimesag's fork syntax definitions vendored in this project, they are built into a binary cache at build-time as well (also bundled into the executable).
Passwords are hashed using rust-argon, and chrono is used for datetime stuff.
The CLI is handled by clap, the API requests are made through reqwest, and the output is formatted using bat.
It should be really easy to build and run.
Just grab rustc and cargo (usually through either rustup or your distro's packages, if they're recent enough). If you're using nix, just run nix develop
to get a shell with everything you need.
Get a PostgreSQL instance up and running (should be available on your distro's repo, or use docker). Either socket or password auth will work just fine.
Populate your schema using the .sql
files in db/
. These have a version number, so if you're upgrading just run the new ones.
Edit Rocket.toml
's url
section and set it to your psql connection string. Or set ROCKET_DATABASES
environment variable to {database={url="connection_string_here"}}
.
You can change bind address
, port
, and template_dir
as well. Either add the key (lowercase) to Rocket.toml
's [default]
session (easier when hacking), or set ROCKET_FOO_BAR
env variables (better for deployment).
If you're planning on deploying, you need a stable secret (for signing auth cookies). You can generate a nice one with openssl rand -base64 32
, add it to your ROCKET_SECRET_KEY
variable and you're good to go.
Just run cargo run -p paste-misterio-me
to run debug mode. Add in --release
for a optimised (but slower compilling) version. If you just want the executable, use cargo build -p paste-misterio-me
instead.
If you run NixOS, there's a NixOS module available.
pmis
is available on crates.io, on the AUR, and there's also a nix flake in the repo for usage with nix.
Use cargo install pmis
, or clone this repo and run cargo build --release -p pmis
.
You can generate completions using pmis completions <SHELL>
(check your distro docs on where to install them).
You can get a shell with pmis
using nix shell github:misterio77/paste-misterio-me#cli
.
For a more permanent solution, you should add pmis
to your flake inputs, add the overlay, and put it wherever you usually put packages (i recommend using home-manager
, we even have a module you can import).
If you want to avoid compiling, pmis
is cached on cachix: cachix use misterio
.
Completions are provided through the derivation.
Use your favorite AUR helper: paru -S pmis
.
Completions are provided through the package.
The default API URL is https://paste.misterio.me
, you can switch to another (if you're self hosting an instance, for example) using --api
.
All commands and options are fully documented through --help
Use pmis download <ID>
. The output is pretty printed using bat
(unless it is piped, or if you use --raw
).
Do keep in mind pastes can easily be downloaded using many utilities, such as curl
: curl https://paste.misterio.me/p/ID/raw
. This makes it easy to get them on any barebones system or to share with friends that don't use pmis
.
You can list a users public pastes (or all of them, if you're authenticated and the user is you) using pmis list [OWNER]
. You can ommit OWNER
if you're authentiucated. If you just want the IDs, add --ids-only
.
You should generate a key, and then use pmis auth
.
Use pmis upload [FILE]
. The title of the paste is the filename, by default. You can ommit FILE
to read from stdin. Use --description
to add a description, and --unlisted
if you don't want it to appear on your profile. When the upload is complete the link and ID will be output, you can get just the link by piping or using --link-only
.
You can delete your pastes by using pmis delete <ID>
.