feat: Manpage
This commit is contained in:
		
							parent
							
								
									146b2241f5
								
							
						
					
					
						commit
						ca9f8261bf
					
				
					 2 changed files with 344 additions and 0 deletions
				
			
		
							
								
								
									
										183
									
								
								feuille.1
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								feuille.1
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,183 @@
 | 
				
			||||||
 | 
					.\" Automatically generated by Pandoc 2.17.1.1
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\" Define V font for inline verbatim, using C font in formats
 | 
				
			||||||
 | 
					.\" that render this, and otherwise B font.
 | 
				
			||||||
 | 
					.ie "\f[CB]x\f[]"x" \{\
 | 
				
			||||||
 | 
					. ftr V B
 | 
				
			||||||
 | 
					. ftr VI BI
 | 
				
			||||||
 | 
					. ftr VB B
 | 
				
			||||||
 | 
					. ftr VBI BI
 | 
				
			||||||
 | 
					.\}
 | 
				
			||||||
 | 
					.el \{\
 | 
				
			||||||
 | 
					. ftr V CR
 | 
				
			||||||
 | 
					. ftr VI CI
 | 
				
			||||||
 | 
					. ftr VB CB
 | 
				
			||||||
 | 
					. ftr VBI CBI
 | 
				
			||||||
 | 
					.\}
 | 
				
			||||||
 | 
					.TH "FEUILLE" "1" "November 2022" "feuille 0.1.0" ""
 | 
				
			||||||
 | 
					.hy
 | 
				
			||||||
 | 
					.SH NAME
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					\f[B]feuille\f[R] - socket-based pastebin
 | 
				
			||||||
 | 
					.SH SYNOPSYS
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					\f[B]feuille\f[R] [-abfhiopstuUvVw]
 | 
				
			||||||
 | 
					.SH DESCRIPTION
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					\f[B]feuille\f[R] 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.
 | 
				
			||||||
 | 
					.SH OPTIONS
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-a address\f[R]
 | 
				
			||||||
 | 
					Sets the address that \f[B]feuille\f[R] will listen on.
 | 
				
			||||||
 | 
					If set to \f[V]*\f[R], \f[B]feuille\f[R] will listen on the IPv6 address
 | 
				
			||||||
 | 
					\f[V]::\f[R] and enable dual-stack mode, which makes \f[B]feuille\f[R]
 | 
				
			||||||
 | 
					listen on both IPv4 and IPv6 addresses (won\[cq]t work on OpenBSD).
 | 
				
			||||||
 | 
					Default: \f[V]0.0.0.0\f[R]
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-b bytes\f[R]
 | 
				
			||||||
 | 
					Sets the buffer size (in bytes) used to receive data from a client.
 | 
				
			||||||
 | 
					A smaller buffer means more memory allocations and exchanges with the
 | 
				
			||||||
 | 
					connection, while a larger buffer induces less memory allocations but
 | 
				
			||||||
 | 
					more loss if not filled completely.
 | 
				
			||||||
 | 
					The difference is minimal, no need to worry about it.
 | 
				
			||||||
 | 
					Default: \f[V]131072\f[R]B (128KiB)
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-f\f[R]
 | 
				
			||||||
 | 
					Makes \f[B]feuille\f[R] run in the forground.
 | 
				
			||||||
 | 
					Default: runs in the background
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-h\f[R]
 | 
				
			||||||
 | 
					Displays **feuille*\[cq]s help page.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-i length\f[R]
 | 
				
			||||||
 | 
					Sets the minimum ID length in characters.
 | 
				
			||||||
 | 
					If a paste with the same ID exists, the length will be increased (for
 | 
				
			||||||
 | 
					that paste only).
 | 
				
			||||||
 | 
					Default: \f[V]4\f[R] (Maximum: \f[V]254\f[R])
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-p port\f[R]
 | 
				
			||||||
 | 
					Sets the port that \f[B]feuille\f[R] will listen on.
 | 
				
			||||||
 | 
					Default: \f[V]8888\f[R]
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-o path\f[R]
 | 
				
			||||||
 | 
					Sets the path where \f[B]feuille\f[R] will output the pastes (and
 | 
				
			||||||
 | 
					chroot, if possible).
 | 
				
			||||||
 | 
					Default: \f[V]/var/www/htdocs/feuille\f[R]
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-s bytes\f[R]
 | 
				
			||||||
 | 
					Sets the maximum size for every paste (in bytes).
 | 
				
			||||||
 | 
					Default: 2097152B (2MiB)
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-t seconds\f[R]
 | 
				
			||||||
 | 
					Sets the timeout for the client to send the paste (in seconds).
 | 
				
			||||||
 | 
					If set to zero, no timeout is set.
 | 
				
			||||||
 | 
					(Not recommended.)
 | 
				
			||||||
 | 
					Default: \f[V]4\f[R]s
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-u\f[R]
 | 
				
			||||||
 | 
					Sets the user that will be used when dropping root privileges.
 | 
				
			||||||
 | 
					\f[B]Warning\f[R]: requires root privileges.
 | 
				
			||||||
 | 
					Default: \f[V]www\f[R]
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-U\f[R]
 | 
				
			||||||
 | 
					Sets the base URL which will be prepended to the ID and sent to the
 | 
				
			||||||
 | 
					client.
 | 
				
			||||||
 | 
					You do not need to put a slash at the end.
 | 
				
			||||||
 | 
					Default: \f[V]https://my.paste.bin\f[R]
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-v\f[R]
 | 
				
			||||||
 | 
					Enables verbose mode.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-V\f[R]
 | 
				
			||||||
 | 
					Displays \f[B]feuille\f[R]\[cq]s version and authors.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]-w\f[R]
 | 
				
			||||||
 | 
					Sets the number of processes that will be spawned to handle the
 | 
				
			||||||
 | 
					connections.
 | 
				
			||||||
 | 
					Those are \f[I]real\f[R] processes, not green / posix threads, you might
 | 
				
			||||||
 | 
					not want to set this to a huge number.
 | 
				
			||||||
 | 
					Default: the number of threads configured on your machine.
 | 
				
			||||||
 | 
					.SH EXAMPLES
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille\f[R]
 | 
				
			||||||
 | 
					Runs feuille in the background, chrooting into
 | 
				
			||||||
 | 
					\f[V]/var/www/htdocs/feuille\f[R], dropping root privileges and spawning
 | 
				
			||||||
 | 
					worker processes to accept incoming connections.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]feuille -p 1337\f[R]
 | 
				
			||||||
 | 
					Runs feuille in the background \f[I]without\f[R] root privileges on port
 | 
				
			||||||
 | 
					\f[V]1337\f[R].
 | 
				
			||||||
 | 
					\f[B]feuille\f[R] won\[cq]t be able to chroot or switch to another user,
 | 
				
			||||||
 | 
					and might not be able to write to the default output folder.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]feuille -P ./pastebins/\f[R]
 | 
				
			||||||
 | 
					Same as before, but this time with a different path:
 | 
				
			||||||
 | 
					\f[V]./pastebins/\f[R].
 | 
				
			||||||
 | 
					If the folder doesn\[cq]t exist, it is created with the right
 | 
				
			||||||
 | 
					permissions.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -U \[lq]https://bin.heimdall.pm\[rq]\f[R]
 | 
				
			||||||
 | 
					Runs feuille and sets the base address to
 | 
				
			||||||
 | 
					\f[V]https://bin.heimdall.pm\f[R].
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -w 1\f[R]
 | 
				
			||||||
 | 
					Runs feuille \[lq]single-threaded\[rq].
 | 
				
			||||||
 | 
					(Actually, there\[cq]s a main thread that does nothing and a thread that
 | 
				
			||||||
 | 
					does the actual work.)
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -fvP debug_pastes/\f[R]
 | 
				
			||||||
 | 
					Runs feuille in the foreground, with verbose mode enabled, and makes it
 | 
				
			||||||
 | 
					output its pastes to the \f[V]debug_pastes/\f[R] folder.
 | 
				
			||||||
 | 
					Useful for debugging purposes.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -u nobody\f[R]
 | 
				
			||||||
 | 
					Runs feuille using the user \f[V]nobody\f[R], instead of user
 | 
				
			||||||
 | 
					\f[V]www\f[R].
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -s 8388608\f[R]
 | 
				
			||||||
 | 
					Runs feuille with a maximum file size of 8388608 bytes (8MiB).
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]sudo feuille -t 2\f[R]
 | 
				
			||||||
 | 
					Runs feuille with a timeout of 2 seconds.
 | 
				
			||||||
 | 
					.SH LOGS
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					By default, \f[B]feuille\f[R] runs in the background.
 | 
				
			||||||
 | 
					The logs should be located at \f[V]/var/log/messages\f[R], if using a
 | 
				
			||||||
 | 
					standard syslog daemon.
 | 
				
			||||||
 | 
					\f[B]feuille\f[R] doesn\[cq]t log much, be ready to use the verbose mode
 | 
				
			||||||
 | 
					for debugging purposes.
 | 
				
			||||||
 | 
					.SH EXIT VALUES
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]0\f[R]
 | 
				
			||||||
 | 
					Success
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]1\f[R]
 | 
				
			||||||
 | 
					Unspecified error
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]34\f[R]
 | 
				
			||||||
 | 
					Specified number is out of range
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\f[B]Other\f[R]
 | 
				
			||||||
 | 
					Error has been set by a C function
 | 
				
			||||||
 | 
					.SH BUGS
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					IPs aren\[cq]t logged.
 | 
				
			||||||
 | 
					It\[cq]s not a bug, it\[cq]s a feature.
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					Apart from that, none at the moment, as far as I know.
 | 
				
			||||||
 | 
					.SH COPYRIGHT
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					Copyright \[co] 2022 Tom MTT.
 | 
				
			||||||
 | 
					<tom@heimdall.pm> This program is free software, licensed under the
 | 
				
			||||||
 | 
					3-Clause BSD License.
 | 
				
			||||||
 | 
					See LICENSE for more information.
 | 
				
			||||||
 | 
					.SH APPENDICES
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					Heavily inspired by fiche (https://github.com/solusipse/fiche).
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					I entirely \[lq]rewrote\[rq] fiche from scratch because I wasn\[cq]t
 | 
				
			||||||
 | 
					happy with some of its features and its overall code quality.
 | 
				
			||||||
 | 
					.SH AUTHORS
 | 
				
			||||||
 | 
					Tom MTT. <tom@heimdall.pm>.
 | 
				
			||||||
							
								
								
									
										161
									
								
								feuille.1.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								feuille.1.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,161 @@
 | 
				
			||||||
 | 
					% FEUILLE(1) feuille {VERSION}
 | 
				
			||||||
 | 
					% Tom MTT. <tom@heimdall.pm>
 | 
				
			||||||
 | 
					% November 2022
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NAME
 | 
				
			||||||
 | 
					**feuille** - socket-based pastebin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SYNOPSYS
 | 
				
			||||||
 | 
					**feuille** [-abfhiopstuUvVw]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# DESCRIPTION
 | 
				
			||||||
 | 
					**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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# OPTIONS
 | 
				
			||||||
 | 
					**-a address**
 | 
				
			||||||
 | 
					: Sets the address that **feuille** will listen on.
 | 
				
			||||||
 | 
					: If set to `*`, **feuille** will listen on the IPv6 address `::` and
 | 
				
			||||||
 | 
					enable dual-stack mode, which makes **feuille** listen on both IPv4
 | 
				
			||||||
 | 
					and IPv6 addresses (won't work on OpenBSD).
 | 
				
			||||||
 | 
					: Default: `0.0.0.0`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-b bytes**
 | 
				
			||||||
 | 
					: Sets the buffer size (in bytes) used to receive data from a client.
 | 
				
			||||||
 | 
					: A smaller buffer means more memory allocations and exchanges with
 | 
				
			||||||
 | 
					  the connection, while a larger buffer induces less memory allocations
 | 
				
			||||||
 | 
					  but more loss if not filled completely.
 | 
				
			||||||
 | 
					: The difference is minimal, no need to worry about it.
 | 
				
			||||||
 | 
					: Default: `131072`B (128KiB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-f**
 | 
				
			||||||
 | 
					: Makes **feuille** run in the forground.
 | 
				
			||||||
 | 
					: Default: disabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-h**
 | 
				
			||||||
 | 
					: Displays **feuille*'s help page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-i length**
 | 
				
			||||||
 | 
					: Sets the minimum ID length in characters.
 | 
				
			||||||
 | 
					: If a paste with the same ID exists, the length will be increased
 | 
				
			||||||
 | 
					(for that paste only).
 | 
				
			||||||
 | 
					: Default: `4` (Maximum: `254`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-p port**
 | 
				
			||||||
 | 
					: Sets the port that **feuille** will listen on.
 | 
				
			||||||
 | 
					: Default: `8888`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-o path**
 | 
				
			||||||
 | 
					: Sets the path where **feuille** will output the pastes (and chroot,
 | 
				
			||||||
 | 
					if possible).
 | 
				
			||||||
 | 
					: Default: `/var/www/htdocs/feuille`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-s bytes**
 | 
				
			||||||
 | 
					: Sets the maximum size for every paste (in bytes).
 | 
				
			||||||
 | 
					: Default: `2097152`B (2MiB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-t seconds**
 | 
				
			||||||
 | 
					: Sets the timeout for the client to send the paste (in seconds).
 | 
				
			||||||
 | 
					: If set to zero, no timeout is set. (Not recommended.)
 | 
				
			||||||
 | 
					: Default: `4`s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-u**
 | 
				
			||||||
 | 
					: Sets the user that will be used when dropping root privileges.
 | 
				
			||||||
 | 
					: **Warning**: requires root privileges.
 | 
				
			||||||
 | 
					: Default: `www`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-U**
 | 
				
			||||||
 | 
					: Sets the base URL which will be prepended to the ID and sent to the
 | 
				
			||||||
 | 
					client.
 | 
				
			||||||
 | 
					: You do not need to put a slash at the end.
 | 
				
			||||||
 | 
					: Default: `http://localhost`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-v**
 | 
				
			||||||
 | 
					: Adds 1 to the verbose level.
 | 
				
			||||||
 | 
					: Default: `0`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-V**
 | 
				
			||||||
 | 
					: Displays **feuille**'s version and authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-w**
 | 
				
			||||||
 | 
					: Sets the number of processes that will be spawned to handle the
 | 
				
			||||||
 | 
					connections.
 | 
				
			||||||
 | 
					: Those are *real* processes, not green / posix threads,
 | 
				
			||||||
 | 
					you might not want to set this to a huge number.
 | 
				
			||||||
 | 
					: Default: the number of threads configured on your machine.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# EXAMPLES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille**
 | 
				
			||||||
 | 
					: Runs feuille in the background, chrooting into `/var/www/htdocs/feuille`,
 | 
				
			||||||
 | 
					dropping root privileges and spawning worker processes to accept
 | 
				
			||||||
 | 
					incoming connections.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**feuille -p 1337**
 | 
				
			||||||
 | 
					: Runs feuille in the background *without* root privileges on port
 | 
				
			||||||
 | 
					`1337`.
 | 
				
			||||||
 | 
					: **feuille** won't be able to chroot or switch to another user, and
 | 
				
			||||||
 | 
					might not be able to write to the default output folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**feuille -P ./pastebins/**
 | 
				
			||||||
 | 
					: Same as before, but this time with a different path: `./pastebins/`.
 | 
				
			||||||
 | 
					: If the folder doesn't exist, it is created with the right
 | 
				
			||||||
 | 
					permissions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -U "https://bin.heimdall.pm"**
 | 
				
			||||||
 | 
					: Runs feuille and sets the base address to `https://bin.heimdall.pm`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -w 1**
 | 
				
			||||||
 | 
					: Runs feuille "single-threaded".
 | 
				
			||||||
 | 
					: (Actually, there's a main thread that does nothing and a thread
 | 
				
			||||||
 | 
					that does the actual work.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -fvP debug_pastes/**
 | 
				
			||||||
 | 
					: Runs feuille in the foreground, with verbose mode enabled, and
 | 
				
			||||||
 | 
					makes it output its pastes to the `debug_pastes/` folder.
 | 
				
			||||||
 | 
					: Useful for debugging purposes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -u nobody**
 | 
				
			||||||
 | 
					: Runs feuille using the user `nobody`, instead of user `www`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -s 8388608**
 | 
				
			||||||
 | 
					: Runs feuille with a maximum file size of 8388608 bytes (8MiB).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**sudo feuille -t 2**
 | 
				
			||||||
 | 
					: Runs feuille with a timeout of 2 seconds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# LOGS
 | 
				
			||||||
 | 
					By default, **feuille** runs in the background. The logs should be
 | 
				
			||||||
 | 
					located at `/var/log/messages`, if using a standard syslog daemon.
 | 
				
			||||||
 | 
					**feuille** doesn't log much, be ready to use the verbose mode for
 | 
				
			||||||
 | 
					debugging purposes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# EXIT VALUES
 | 
				
			||||||
 | 
					**0**
 | 
				
			||||||
 | 
					: Success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**1**
 | 
				
			||||||
 | 
					: Unspecified error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**34**
 | 
				
			||||||
 | 
					: Specified number is out of range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Other**
 | 
				
			||||||
 | 
					: Error has been set by a C function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# BUGS
 | 
				
			||||||
 | 
					IPs aren't logged. It's not a bug, it's a feature.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apart from that, none at the moment, as far as I know.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# COPYRIGHT
 | 
				
			||||||
 | 
					Copyright © 2022 Tom MTT. <tom@heimdall.pm>
 | 
				
			||||||
 | 
					This program is free software, licensed under the 3-Clause BSD License.
 | 
				
			||||||
 | 
					See LICENSE for more information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# APPENDICES
 | 
				
			||||||
 | 
					Heavily inspired by [fiche](https://github.com/solusipse/fiche).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I entirely "rewrote" fiche from scratch because I wasn't happy with
 | 
				
			||||||
 | 
					some of its features and its overall code quality.
 | 
				
			||||||
		Reference in a new issue