minimal no-fuss pastebin service clone in golang
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KatolaZ 9d4d7bfa1f Explain how to use with curl in README.md 7 years ago
html
paste
.gitignore
LICENSE.md
Makefile
README.md Explain how to use with curl in README.md 7 years ago
binnit.cfg
binnit.go Fixed form parsing and template escaping 7 years ago
config.go
templ.go Fixed form parsing and template escaping 7 years ago

README.md

binnit -- minimal pastebin clone in golang

That's just it. A minimalist, no-fuss pastebin clone server in golang. It supports only two operations:

  • store a new paste, through a POST request
  • retrieve a paste using its unique ID, through a GET request

what else do you need?

WTF?

binnit is a single executable with no dependencies. You don't need a web server. You don't need a SQL server. You don't need any external library.

binnit serves pastes in the format:

http://<server_name>/abcdef1234567890

and stores them in a folder on the server, one file per paste, whose filename is identical to the paste ID. The unique ID of a paste is obtained from the SHA256 of the concatenation of title, time, and content. Rendering is minimal, on purpose, but based on a customisable template.

binnit is currently configured through a simple key=value configuration file, whose name can be specified on the command line through the option -c <config_file>. If no config file is specified, binnit looks for ./binnit.cfg. The configurable options are:

  • server_name (the FQDN where the service is reachable from outside)
  • bind_addr (the address to listen on)
  • bind_port (the port to bind)
  • paste_dir (the folder where pastes are kept)
  • templ_dir (the folder where HTML files and templates are kept)
  • max_size (the maximum allowed length of a paste, in bytes. Larger pastes will be trimmed to that length.)
  • log_file (path to the logfile)

As with other pastebin-like services, you can send a paste to binnit using curl. For instance, if your binnit server is running on http://servername.net, you can paste a file there using:

curl -F 'paste=<myfile' http://servername.net

and obtain on output the ID associated to the newly created paste. Similarly

mylongcommand | curl -F 'paste=<-' http://servername.net

will paste the output of mylongcommand to http://servername.net, and show on output the ID of the new paste.

Why another pastebin?

There are hundreds of pastebin-like servers in the wild. But the overwhelming majority of them is overbloated software, depending on lots of libraries/frameworks/tools, providing a whole lot of useless features, and implying a useless amount of complexity.

A paste server must be able to do two things, 1) create a new paste and return its ID, and 2) retrieve an existing paste using its ID. binnit does just and only these two things, in the simplest possible way, without any external dependency. If you need more than that, then binnit is not for you. But do you really need anything more?

About minimalism

It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove (Antoine de Saint Exupéry)

binnit is intended to be truly minimal. It consists of about 500 lines of golang source code in total, including:

  • ~110 lines for License statements (comments)
  • ~110 lines of core logic
  • ~90 blank lines
  • ~75 lines for template management
  • ~75 lines for config management
  • ~30 lines of pure comments

If you want to strip binnit down even further, you could consider removing:

  • blank lines
  • the external configuration file
  • the template system
  • sanity checks and error management
  • logging
  • code comments

You CANNOT remove the licence statements on each source file.

LICENSE

binnit is Copyright (2017) by Vincenzo "KatolaZ" Nicosia.

binnit is free software. You can use, modify, and redistribute it under the terms of the GNU Affero General Public Licence, version 3 of the Licence or, at your option, any later version. Please see LICENSE.md for details.