a fast, dead-simple socket-based pastebin.
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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
Tom MTT. 9f641dccda
docs(feuille.1): typo
8 months ago
cgi fix(cgi/feuille.cgi.c): remove carriage returns and fix some code 2 years ago
cron feat(README.md): service tutorial 2 years ago
service fix(service/systemd): typo 2 years ago
.gitignore fix(.gitignore): ignore .ccls-cache 8 months ago
LICENSE style(LICENSE): fix word wrapping 2 years ago
Makefile fix(Makefile): minor tweaks 2 years ago
README.md fix(README.md): Description in ToC 1 year ago
arg.h fix: use `#pragma once' instead of guards 2 years ago
bin.c feat: cosmopolitan libc support 2 years ago
bin.h fix: use `#pragma once' instead of guards 2 years ago
config.mk fix(config.mk): typo 1 year ago
feuille.1 docs(feuille.1): typo 8 months ago
feuille.1.md docs(feuille.1): typo 8 months ago
feuille.c style(feuille.c): padding 2 years ago
feuille.h fix: use `#pragma once' instead of guards 2 years ago
server.c feat: cosmopolitan libc support 2 years ago
server.h fix: use `#pragma once' instead of guards 2 years ago
util.c feat: cosmopolitan libc support 2 years ago
util.h fix: use `#pragma once' instead of guards 2 years ago



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.

Table of Contents
  1. Usage
  2. Description
  3. Installation
  4. Help
  5. Authors
  6. License
  7. Acknowledgments


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, heimdall.pm, you can upload text, code or logs like this:

// sending text
$ echo Hello, World! | nc heimdall.pm 9999

// sending files
$ cat feuille.c | nc heimdall.pm 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 https://bin.heimdall.pm/abcd
Hello, World!

$ curl https://bin.heimdall.pm/efgh
 * 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 https://bin.heimdall.pm/efgh | 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 heimdall.pm 9999

You can then retrieve it and decrypt it using curl and gpg again, like this:

$ curl https://bin.heimdall.pm/ijkl | 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 heimdall.pm 9999"
alias spst="gpg -cao /tmp/paste.pgp && cat /tmp/paste.pgp | nc heimdall.pm 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!


  • Focuses on speed,

    • Handles multiple requests at once (using a pool of fork'ed workers)
    • Only does what it needs to do
  • code quality,

    • Readable, documented code
    • With future contributors / maintainers in mind
  • and security

    • chroots 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 cgi/, cron/ and service/)

    • A CGI script that lets the user send pastes directly from your website
    • 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)

  • 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!



You'll need a working POSIX-compliant system such as Linux, OpenBSD or FreeBSD, a C99 compiler (GCC, Clang...) and a POSIX-Make implementation.

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.


feuille needs to be built from source.

To do so, you'll first need to clone the repository.

$ git clone https://basedwa.re/tmtt/feuille
$ 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 feuille.com.dbg and feuille.com, 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 pcc.

$ 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.


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.


How do I make feuille run at startup?

We made some service files for that.


Tweak service/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


Copy service/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 {} +

See cron/purge.cron 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 cgi/form.html for a sample form.


Tom MTT. tom@heimdall.pm


Copyright © 2022 Tom MTT. tom@heimdall.pm
This program is free software, licensed under the 3-Clause BSD License. See LICENSE for more information.


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.