Front-end for Know Your Meme
Go to file
Skylar "The Cobra" Widulski 2a3526aace
Update copyright
Signed-off-by: Skylar "The Cobra" Widulski <>
2024-01-03 11:30:39 -05:00
guile-libxml2@1c3ff42fa4 Update copyright 2024-01-03 11:30:39 -05:00
meme Update copyright 2024-01-03 11:30:39 -05:00
static Don't cache style.css, max-width on meme-body img 2023-12-15 09:34:12 -05:00
.gitignore Init 2023-06-22 16:41:02 -04:00
.gitmodules Move libxml2.scm to its own repo 2023-12-16 11:43:57 -05:00
LICENSE feat: Add license 2023-06-22 16:43:27 -04:00 Move libxml2.scm to its own repo 2023-12-16 11:43:57 -05:00
instances.json Add instances 2023-12-10 12:52:12 -05:00
meme.scm Update copyright 2024-01-03 11:30:39 -05:00


MeMe is a privacy-respecting frontend to Know Your Meme

Currently this project is still in development. While it might be in a state where you can host it publicly, There is likely to be many bugs.


Join our Matrix room for support and other things related to MeMe


See instances.json

Run your own instance


This program is written in Guile Scheme.

You will need need guile, guile-gnutls, guile-lib, and guile-libxml2. guile-libxml2 is submodule in this repository libxml2, libgumbo, and gumbo-libxml installed.


  1. Clone the repository using git clone --recurse-submodules
  2. cd into guile-libxml2
  3. Follow the build instructions there
  4. cd back to the main repo
  5. Run guile -L . -L guile-libxml2 meme.scm
  6. Connect to http://localhost:8003 (or point your reverse proxy to it)
  7. Profit


PATCHES_URL - Link to any patches that were applied. Necessary if there are any. Do not set if there aren't.

The following are optional.

PORT - What port to run on (default 8003).

LIBXML2_LOCATION (Used by guile-libxml2) - Path to (default libxml2, which checks LD_LIBRARY_PATH).

GUMBO_LIBXML_LOCATION (Used by guile-libxml2) - Path to (default ./gumbo-libxml/.libs/, can be edited to libgumbo_xml, which does the same thing as libxml2 in LIBXML2_LOCATION)


When using a service manager (e.g. systemd), make sure the stop signal is set to SIGINT, or 2. This will prevent EADDRINUSE.



RAM usage seems to max out below 150 MiB (134 in production testing, different from local, which was around 65 MiB).


Due to the nature and method of proxying images, the performance on first load is poor (PageSpeed Inisghts speed index of 2.5s).

After the first load, though, your browser's cache control should kick in, and any subsequent requests for an image are cached.

Altogether, the performance listed on PageSpeed Insights is 63.


  • Speed up image proxying somehow
  • Video list page*
  • Video page*
  • User page (it is internally linked)

*Videos might not be added because they use embeds from stuff like tiktok and I don't know how to scrape tiktok (use existing proxitok instance?)

Known issues

  1. It's slow
  2. It could probably be faster