You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

327 lines
9.0 KiB

# feuille
**feuille** is a fast, dead-simple socket-based pastebin that allows a
user to send text, logs or code to your server. It focuses on speed,
code quality, and security.
<summary>Table of Contents</summary>
<li><a href="#usage">Usage</a></li>
<li><a href="#description">Description</a></li>
<a href="#installation">Installation</a>
<li><a href="#dependencies">Dependencies</a></li>
<li><a href="#build">Build</a></li>
<li><a href="#configuration">Configuration</a></li>
<a href="#help">Help</a>
<li><a href="#how-do-i-make-feuille-run-at-startup">How do I make feuille run at startup?</a></li>
<li><a href="#how-do-i-remove-expired-pastes-after-some-time">How do I remove expired pastes after some time?</a></li>
<li><a href="#how-can-i-send-pastes-directly-from-my-website-instead-of-using-netcat">How can I send pastes directly from my website (instead of using netcat)?</a></li>
<li><a href="#authors">Authors</a></li>
<li><a href="#license">License</a></li>
<li><a href="#acknowledgments">Acknowledgments</a></li>
## Usage
You'll need either `nc` or nmap's `ncat`.
The former is probably already available on your system, but lacks
some features, which will make you wait for the timeout before
getting a link to the paste (usually 2 seconds).
The latter will have to be installed manually but is more featureful
and will get a link instantly once everything is sent. It works the
exact same way as `nc`.
*Choose your weapon wisely.*
Assuming you're using my personal pastebin instance,
[](, you can upload text, code or
logs like this:
// sending text
$ echo Hello, World! | nc 9999
// sending files
$ cat feuille.c | nc 9999
*This truly is the joy of Unix pipes.*
Once you received the link to your paste, you can send it to someone,
browse it or `curl` it, like this:
$ curl
Hello, World!
$ curl
* feuille.c
* Main source file.
If you want syntax highlighting on your pastes, you can use `bat`, a
cat clone with syntax highlighting features. Simply `curl` your paste
and pipe it to `bat` with the language used.
$ curl | bat -l c
* feuille.c
* Main source file.
Want to push the concept further? You can send encrypted files, too!
You'll need `gpg` for this. `-c` means encryption using a password,
`-ao tmp.pgp` means ASCII output to file `tmp.pgp`.
$ cat secret.txt | gpg -cao tmp.pgp
$ cat tmp.pgp | nc 9999
You can then retrieve it and decrypt it using `curl` and `gpg` again,
like this:
$ curl | gpg -d
(Obviously, you'll have to type the right password.)
But, all those commands are really cumbersome, aren't they?
Guess what? We made aliases!
Put those into your `~/.{ba,z,k}shrc`:
alias pst="nc 9999"
alias spst="gpg -cao /tmp/paste.pgp && cat /tmp/paste.pgp | nc 9999 && rm /tmp/paste.pgp"
Now, you can use **feuille** like this:
// plain
$ echo Hello, World! | pst
// encrypted
$ echo da sup3r sekr1t | spst
That sould be it. Have fun!
## Description
* Focuses on speed,
* Handles multiple requests at once (using a pool of `fork`'ed
* Only does what it needs to do
* code quality,
* Readable, documented code
* With future contributors / maintainers in mind
* and security
* `chroot`s in the output folder
* Drops root privileges once they're no longer needed
* Uses OS-specific security measures (like OpenBSD's `pledge`)
* Plenty of auxiliary files (see
[cron/]( and
* A CGI script that lets the user send pastes directly from your
* A sample HTML form for your CGI script
* A cron job that deletes expired pastes
* A SystemD service file
* An OpenRC service file
* Lots of options (see [configuration](#configuration))
* Works on nearly all POSIX-compliant OSes
* Can be run in the background and as a service
* IPv6-enabled
* Now with 100% more [Cosmopolitan libc]( support!
## Installation
### Dependencies
You'll need a working *POSIX-compliant system* such as Linux, OpenBSD
or FreeBSD, a C99 compiler (GCC, Clang...) and a POSIX-Make
You'll probably want an HTTP / Gopher / Gemini / ... server to serve
the pastes on the web, such as OpenBSD's httpd or Apache. Just make
your server serve the folder feuille's using, there are plenty of
tutorials on the web.
If you wish to make modifications to the manpage, you'll need pandoc
to convert the markdown file into a man-compatible format.
### Build
**feuille** needs to be built from source.
To do so, you'll first need to clone the repository.
$ git clone
$ cd feuille
Then, simply run:
$ make
$ sudo make install
You can also build using the
[Cosmopolitan libc](, which will
make an executable capable of running on Linux, OpenBSD, FreeBSD,
Mac... out of the box. To do so, build with the `COSMO` flag.
It will produce `` and ``, the former being
the debug binary, and the latter the portable one.
If you wish to make a debug build, you can set `DEBUG` to whatever
comes to your mind.
You can also set `CC` to the compiler of your liking, like `clang` or
$ make COSMO=y DEBUG=y CC=clang
In order to compile CGI script(s), run:
$ make cgi
`ADDR` and `PORT` can be set to the address and port on which
**feuille** listens, respectively.
### Configuration
For a complete list of options and examples, please see the manpage,
either on your computer by doing `man feuille` or on the
[online wiki](
## Help
* [How do I make feuille run at startup?](#how-do-i-make-feuille-run-at-startup)
* [How do I remove expired pastes after some time?](#how-do-i-remove-expired-pastes-after-some-time)
* [How can I send pastes directly from my website (instead of using netcat)?](#how-can-i-send-pastes-directly-from-my-website-instead-of-using-netcat)
### How do I make feuille run at startup?
We made some service files for that.
#### SystemD
to your liking and copy it to `/etc/systemd/system/feuille.service`.
Then, do (as root):
# systemctl daemon-reload
# systemctl enable feuille
# systemctl start feuille
#### OpenRC
into `/etc/rc.d/feuille`.
Then, do (as root):
# rcctl enable feuille
# rcctl set feuille flags -U https://my.paste.bin
# rcctl start feuille
Tweak the flags to your liking.
### How do I remove expired pastes after some time?
You can put that in your crontab (by doing `sudo crontab -e`).
It will delete all files in `/var/www/feuille` that are at least 7
days old.
Don't forget to change the folder to the one **feuille**'s using and
eventually `+7` to the maximum file age you'd like to use.
0 0 * * * find /var/www/feuille -type f -mtime +7 -exec rm {} +
if you'd like to download the cron job.
### How can I send pastes directly from my website (instead of using netcat)?
We made a CGI script for that. First, you need to build it:
$ make cgi
`ADDR` and `PORT` can be set to the address and port on which
**feuille** listens, respectively.
Once it's done, you can put `./cgi/feuille.cgi` in your website's
`cgi-bin` folder (usually somewhere like
`/var/www/my.paste.bin/cgi-bin`) and configure your web server
to execute CGI scripts.
You can then create an HTML form that will send a POST request to the
CGI script. The form must have `enctype="text/plain"` and must contain
only one input or textarea. See
for a sample form.
## Authors
Tom MTT. <>
## License
Copyright © 2022 Tom MTT. <>
This program is free software, licensed under the 3-Clause BSD License.
See LICENSE for more information.
## Acknowledgments
Heavily inspired by [fiche](
I entirely "rewrote" fiche from scratch because I wasn't happy with
some of its features and its overall code quality.