Welcome! :-)

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2018-11-14 Firefox Setup

New laptop at the office...


  • Privacy Badger
  • uBlock Origin
  • uMatrix
  • HTTPS Everywhere
  • Decentraleyes
media.autoplay.default = 1

Sadly I don’t remember what else to change right now!

Remember that you can import your bookmarks from an old profile via the library / bookmark manager.


Add Comment

2018-11-12 Zaibatsu

I just love the old school Internet enthusiasm shown by @solderpunk in his phlog post: “I am utterly entranced by this idea of a self-organising, ever-changing fractal network of social unix servers, with networks forming and disolving between servers and between networks themselves as users see fit.” Me too!


Add Comment

2018-11-11 ssh config

How to set up your SSH config file: Simplify Your Life With an SSH Config File, a blog post from 2011. I’m 45 and have been using GNU/Linux since way back before people had Internet at home here in Switzerland and I’ve only learned about this today. 😮

@danyspin97 recommended autossh which keeps connections alive. “Autossh is a program to start a copy of ssh and monitor it, restarting it as necessary should it die or stop passing traffic.” I don’t often run into this problem, though.

@zladuric recommended multiplexing which speeds up reconnecting to a server. “OpenSSH can reuse an existing TCP connection for multiple concurrent SSH sessions. This results into reduction of the overhead of creating new TCP connections.” I never saw this as problem, though. Probably because the host I connect to most often is in the same city as I am and I have fibre to the home. But if you’re a heavy duty system administrator perhaps?

@oliof recommended sshshuttle for people that forward many ports and don’t have a virtual private network (VPN). “Transparent proxy server that works as a poor man’s VPN. Forwards over ssh. Doesn’t require admin.” I don’t need that, either. Maybe if I had more need to circumventing geoblocking. 😁

Since we’re talking about SSH, here’s the most important server-side advice I have for you:

  1. use fail2ban to temporarily ban IP numbers that cause too many failed login attempts
  2. change the default port to something else in orther to reduce the number of login attempts
  3. if you need to allow root access on your system (which I do if I want to make backups using rsync) then use the prohibit-password option

The last two are changes you make to the /etc/ssh/sshd_config file. Uncomment #Port 22 and change the port, and set the PermitRootLogin option to prohibit-password.


Comments on 2018-11-11 ssh config

One thing I like to do is to configure a group, which a user has to be in, to be allowed to ssh in. So the default is that a user can’t.

This avoids e.g. the problem where you create a dummy user with a weak password to test something, and forget to delete the user. Not that I’ve ever done that. Noooo.

I’ve split the users allowed to ssh in up into “sshusers” and “sshkeyusers”, the first category is allowed to use a password (basically, me), and the second category can only login with a key (the handful of friends that have access). In /etc/ssh/sshd_config I have:

# Only allow sshusers/sshkeyusers to ssh in:
AllowGroups sshusers sshkeyusers
Match Group sshkeyusers
  PasswordAuthentication no

Adam 2018-11-11 15:22 UTC

Hahaha! 😎

Luckily, that server should only have me on it. But you’re right. Better be safe than sorry!

– Alex Schroeder 2018-11-11 18:32 UTC

I currently have the following:

# List of user names allowed to log in.
# We need root for our backup script.
# We need git for git-via-SSH repos.
AllowUsers alex git root

PermitRootLogin prohibit-password

So let me think this through:

  1. I want alex to connect using a password just in case.
  2. I don’t want git to connect using a password (not sure why it seems to have a password in /etc/shadow and /usr/bin/git-shell as its shell in /etc/passwd and I don’t know whether any of these obviate a setting in /etc/sshd_config) 🤔❓
  3. I don’t want root to connect using a password.

So I added the following:

Match User git
    PasswordAuthentication no

Seems to work as intended, for now.

– Alex Schroeder 2018-11-12 13:26 UTC

“The rage that one felt was an abstract, undirected emotion which could be switched from one object to another like the flame of a blowlamp.” – George Orwell, 1984, chapter 1

– Alex Schroeder 2018-11-12 13:30 UTC

Add Comment

2018-11-10 Manual Pages

I like people who write their own man pages with the most important information they keep forgetting about existing commands. Keep this info in text files and use a little script like mman to access those text files; keep using man for the original. I found this via tfurrows’s gopher site.

On Mastodon, I got some more suggestions:

@raucao suggested tldr. I installed the Perl variant via cpanm tldr.

alex@melanobombus:~$ tldr emacs

  The extensible, customizable, self-documenting, real-time display editor.

  ✓ Open emacs in console mode (without X window):

    🍣  emacs -nw

  ✓ Open a file in emacs:

    🍣  emacs {{filename}}

  ✓ Exit emacs:

    🍣  C-x C-c

Know about ed I can tell you that knowing how to quit is essential information. But surely there is more to it?

@coffe suggested cheat. I installed it via pip3 install cheat. And I set some options in my ~/bashrc:

export EDITOR=emacsclient
export CHEATCOLORS=true

You need to provide an editor because you can edit your cheat sheets. That’s the spirit!

The colourisation for the Emacs page is wrong. I guess it isn’t handled as Markdown? But at least there’s more information available. Perhaps it’s too much?

alex@melanobombus:~$ cheat emacs
# Running emacs

  GUI mode            $ emacs
  Terminal mode       $ emacs -nw

# Basic usage

  Indent              Select text then press TAB
  Cut                 CTRL-w
  Copy                ALT-w
  Paste ("yank")      CTRL-y
  Begin selection     CTRL-SPACE
  Search/Find         CTRL-s
  Replace             ALT-% (ALT-SHIFT-5)
  Save                CTRL-x CTRL-s
  Save as             CTRL-x CTRL-w
  Load/Open           CTRL-x CTRL-f
  Undo                CTRL-x u
  Highlight all text  CTRL-x h
  Directory listing   CTRL-x d
  Cancel a command    CTRL-g
  Font size bigger    CTRL-x CTRL-+
  Font size smaller   CTRL-x CTRL--

# Buffers

  Split screen vertically                         CTRL-x 2
  Split screen vertically with 5 row height       CTRL-u 5 CTRL-x 2
  Split screen horizontally                       CTRL-x 3
  Split screen horizontally with 24 column width  CTRL-u 24 CTRL-x 3
  Revert to single screen                         CTRL-x 1
  Hide the current screen                         CTRL-x 0
  Move to the next screen                         CTRL-x o
  Kill the current buffer                         CTRL-x k
  Select a buffer                                 CTRL-x b
  Run command in the scratch buffer               CTRL-x CTRL-e

# Navigation ( backward / forward )
  Character-wise                                  CTRL-b , CTRL-f
  Word-wise                                       ALT-b  , ALT-f
  Line-wise                                       CTRL-p , CTRL-n
  Sentence-wise                                   ALT-a  , ALT-e
  Paragraph-wise                                  ALT-{ , ALT-}
  Function-wise                                   CTRL-ALT-a , CTRL-ALT-e
  Line beginning / end                            CTRL-a , CTRL-e

# Other stuff

  Open a shell         ALT-x eshell
  Goto a line number   ALT-x goto-line
  Word wrap            ALT-x toggle-word-wrap
  Spell checking       ALT-x flyspell-mode
  Line numbers         ALT-x linum-mode
  Toggle line wrap     ALT-x visual-line-mode
  Compile some code    ALT-x compile
  List packages        ALT-x package-list-packages

# Line numbers

  To add line numbers and enable moving to a line with CTRL-l:

    (global-set-key "\C-l" 'goto-line)
    (add-hook 'find-file-hook (lambda () (linum-mode 1)))

I am reminded of my own recommendation regarding Emacs. I wrote this in 2006. Reference Sheet by Alex Schroeder (for Emacs).


Comments on 2018-11-10 Manual Pages

I’ve done something similar using BASH functions. I first saw these in a comment on hackernews, and have simply taken them wholesale.

mdless() {
      pandoc -s -f markdown -t man $1.md | groff -T utf8 -man | less
umedit() { mkdir -p ~/docs/linux_stuff/knowledge; vim ~/docs/linux_stuff/knowledge/$1.md; }
um() { mdless ~/docs/linux_stuff/knowledge/"$1"; }
umls() { ls ~/docs/linux_stuff/knowledge; }

However, these leave a little to be desired in terms of completeness. I’ve been mostly satisfied with them so far though!

– reed 2018-11-12 20:37 UTC

Hah, to translate from Markdown to man is genius. :)

– Alex 2018-11-13 06:22 UTC

Add Comment

2018-11-09 Blog Post Of Note

What do you call this feeling when you want to leave small comments on multiple blogs but you don’t just want to do it on social media and every single comment is too small for a blog post? As I said a few days ago when I introduced the blog Planets: if we want to break out of the silos, we need to start doing what social media has been doing for us. We need to pick up on topics mentioned elsewhere. We need to link to those conversations. We need to recommend other bloggers.

So here’s some stuff I recently noticed:

Luka Rejec writes about Natural Language Roleplaying Games. When I wrote the Halberds and Helmets referee guide, I was somehow aiming for a more conversational style but I fear I failed. I was also trying to have two voices in the text: the main text with the rules and a more conversational style in the sidebar. I don’t think worked very well and my editor also flaged a lot of shifts in time and person (singular, plural, first person, third person, past, present). It was a mess. Perhaps natural language is a mess and if that is so, I’m not sure natural language is a good fit for rules. I do agree with the wish to avoid jargon and legalese, so there’s some sort of equilibrium I’m still looking for.

Courtney Campbell writes Don't look at this trap! and points out that there’s no harm in letting players use player knowledge at the table, if that’s what they want, because we’re friends playing a game. And I agree wholeheartedly. I’ve started telling my players: if you know it, then tour character knows it, if you want to. It cuts both ways: most remember red dragons breathe fire but when the meet trolls they might remember they have a special ability but if they ask, I’ll tell them: if you don’t know, then your character does not know either. I haven’t had any players memorize monster manuals at my table in decades, and even if players remember some of the details, what’s the harm? I also don’t enjoy reskinning monsters just to prolong the guessing game. What’s the point of trolls that look like some other monster? Players are more afraid because they don’t know what they’re facing. But what if they are facing trolls and some of them remember how to fight trolls? There’s joy and happy faces all around! As a referee, it’s good to have a bunch of monster books for the occasional surprise, but at the same time it’s good to have some opposition so players can focus on other things: remembering some lore, or diplomacy, or some other strategy. After all, the real world is super exciting even though practically all the monsters are humans and we all know their special abilities.

Aaron Griffin writes about the sandbox in his blogpost What is a Sandbox?. He mentions the term “railroad” and that reminds me of the whole discussion about player agency we had in 2011. Good times. Aaron also links to another blog by atxredbeard, I’m Crawling, but am I in a Sandbox? which ends with a question: “What does sandbox mean to you?” And that in turn reminded me of all the sandbox posts I wrote, years ago. I collected some of them in a post from 2014, Best of Sandbox Posts. There’s also a post of mine from 2016 I’d like to recommend, Rescuing the Sandbox, where I talk about the factors that help keep a sandbox from deteriorating:

  1. Clearly establish which plot elements belong to which character.
  2. Explicitly list open plots and ask for preferences concerning the next session.
  3. Provide enough information.
  4. Make sure there are consequences and announce them.

Anyway, food for thought, and I’m once again reminded of why I don’t blog so much about role-playing games these days. All too often I get the feeling that I’ve already said what I wanted to say, years ago. I need to focus on the things that changed, if any. And that makes me wonder about all the bloggers that have written good stuff that is not actually lost but simply forgotten because they no longer blog and thus their old stuff doesn’t get boosted every now and then. Let me do my part, then, and point you to this post of mine, Ode to Black Dougal, where I link to some of the best posts by P. Armstrong from 2009. Good times indeed!


Add Comment

2018-11-06 Memory Mystery

The mysteries of problems regarding my website continues. What the hell happened?

Sudden Spike

Memory for “apps” went up to 16G at around 21:00 and then almost everything was killed.

Let’s see what grep oom-killer /var/log/syslog has to say:

Nov  6 21:05:03 sibirocobombus kernel: [18425702.447121] /home/alex/farm invoked oom-killer: ...
Nov  6 21:05:09 sibirocobombus kernel: [18425708.244062] munin-update invoked oom-killer: ...
Nov  6 21:05:09 sibirocobombus kernel: [18425708.925423] /home/alex/farm invoked oom-killer: ...
Nov  6 21:05:13 sibirocobombus kernel: [18425712.660969] apache2 invoked oom-killer: ...
Nov  6 21:05:14 sibirocobombus kernel: [18425713.857753] fail2ban-server invoked oom-killer: ...
Nov  6 21:05:15 sibirocobombus kernel: [18425714.904769] fw_conntrack invoked oom-killer: ...
Nov  6 21:05:18 sibirocobombus kernel: [18425717.168963] apache_accesses invoked oom-killer: ...
Nov  6 21:05:18 sibirocobombus kernel: [18425717.985385] apache_accesses invoked oom-killer: ...
Nov  6 21:05:20 sibirocobombus kernel: [18425719.907638] vmstat invoked oom-killer: ...
Nov  6 21:05:23 sibirocobombus kernel: [18425722.207184] jbd2/vda1-8 invoked oom-killer: ...
Nov  6 21:05:24 sibirocobombus kernel: [18425723.800850] memory invoked oom-killer: ...
Nov  6 21:05:27 sibirocobombus kernel: [18425726.582062] exiqgrep invoked oom-killer: ...
Nov  6 21:05:29 sibirocobombus kernel: [18425728.479563] fail2ban-server invoked oom-killer: ...
Nov  6 21:05:31 sibirocobombus kernel: [18425730.862151] fail2ban-client invoked oom-killer: ...
Nov  6 21:05:31 sibirocobombus kernel: [18425731.049454] /home/alex/camp invoked oom-killer: ...

OK, and what happened back then?

Grepping /var/log/apache2/access.log for this minute does not reveal anything interesting.

My gopher logs show just two hits, no issues.

Checking the toadfarm log file shows the first problem at 21:05:00: “fork failed: Cannot allocate memory”. Hm. The other problem is at 21:05:11: “Worker 4166 has no heartbeat (30 seconds), restarting”. Could be anything? Grepping for “Inactivity timeout” gives me 36 hits from 21:04:56 to 21:05:12. The end must have come quickly.

Hm. Looking at the toadfarm log file, the number of hits to the website of my Arabic teacher in just two minutes is pretty amazing.

 arabisch-lernen.org        388    56%
       emacswiki.org        273    40%
    campaignwiki.org         14     2%
                              6     0%

This is grep '21:0[45]:.*' /home/alex/farm/farm*.log | /home/alex/bin/site-grouping and the second script is very simple:

#!/usr/bin/env perl
while (<STDIN>) {
  m!GET https?://([^:]+):!;
@result = sort {$site{$b} <=> $site{$a}} keys %site;
foreach $label (@result) {
  printf "%20s %10d   %3d%%\n", $label, $site{$label}, 100* $site{$label} / $total;

OK, so who’s calling these two sites?

Note that this is toadfarm reporting. At the same time, Apache isn’t reporting as much. grep "21:0[45]" /var/log/apache2/access.log | wc -l says only 183 requests. When I look at the IP numbers, I don’t see a single IP number doing anything wrong. After a while I do think that there’s a lot of IP numbers starting with a common prefix and so I’m going to count them. 62 hits in two minutes from ChinaNetCenter Ltd. Gaaaah. Looking at the URLs these IP numbers are hitting it’s full of admin actions, diffs, edit action. Clearly, a misbehaving spider. I think I’m going to ban them all, for now.

Soon, I’m going follow these instructions. Grrrrr! Unexpected DDOS: Blocking China with ipset and iptables. (Just kidding. I hate that!)

Gah. Problem. ipset add blacklist ended with an error. The list is full! And I cannot just ipset del blacklist because that gives me another error saying the element isn’t added. Not even for ip in $(ipset list blacklist|grep 220); do ipset del blacklist $ip; done seems to work. Or at least, judging from a few calls to ipset list blacklist | wc -l it’s not very fast. What now?

I guess I will have to look at my setup again. I probably need a different type? It’s type is hash:ip and it’s maxelem is 65536. That would have to increase, of course. Oh well. Perhaps I’ll leave it for some other time. We’ll see how far we’ll get by not doing anything.


Comments on 2018-11-06 Memory Mystery

How is 388 requests in 2 minutes a problem? That’s no more than 4 requests per second - shouldn’t the webserver be able to handle that?

Is there some kind of memory leak or pathological case that the chinese crawlers happen to hit? The sudden spike in memory use is not just because of 4 hits/s, is it?

Can you reproduce the memory use, maybe on a local machine replaying the requests from the log around the time of the problem (or just bombarding it with requests)?

Just random questions from my armchair :-)

Adam 2018-11-09 21:46 UTC

Heh. :) The main problem is that we’re not talking about static HTML pages. If somebody does a search on this wiki, there’s a grep over 7000 pages, and then the wiki code looks at the matches, renders the pages, highlights the phrases, and so on. That means the process takes a while. If it takes 10 seconds, and I get 4 searches per second (I doubt this was the explanation, just trying to explain how the server is prone to accidental denial of service attacks), then I have 40 processes grepping through 7000 files per second. And then it dies, because this is a tiny 2G virtual machine I’m somewhere, managed by myself and nobody else. At least that’s what I suspect.

That’s why my /robots.txt says Crawl-delay: 20.

Replaying the requests from the log is a good idea. I should do it the next time this happens. And I should make sure to compare the memory used with the number of processes running at the time.

– Alex Schroeder 2018-11-10 00:30 UTC

More armchair comments: Could you exclude the search URL in robots.txt?

A more laborous solution, if searching turns out to be the problem, is to index the pages using, say, Xapian (the Perl-bindings work nicely).

Anyway, good luck in finding the cause!

Adam 2018-11-10 13:49 UTC

As they are already ignoring the crawl delay I think it is safe to say that they either don’t know or don’t care. My robot.txt Contains the line Disallow: /wiki? which should take care of anything that is not a page view. But it’s being ignored.

A long time ago I used a Perl module that indexed the text and allowed scoring of results - but eventually it turned out that brute forcing search using grep was actually faster. But that was years ago and on a different setup. Perhaps I should revisit this.

These days I am more interested in blocking misbehaving agents. The old solution limits visits from the same IP number (surge protection, and I have fail2ban watching my log files, to watch over all the other services (cgit and the like). But if the request come from all over a subnet, these defenses don’t work, unfortunately.

– Alex Schroeder 2018-11-10 18:09 UTC

Add Comment

2018-11-05 Email Archives Are Not Archives

People have been linking my old essay on Record Keeping. That reminded me of email. I got into a conversation with @zladuric, @jamie, and @ckeen. Thank you all.

I am trying a new thing: deleting mail that I won’t answer or that I answered. No archiving. By now mail has become so unimportant, this seems feasible again. I will archive receipts and bills and stuff. But perhaps things that aren’t as important as letters from friends and family should be treated as such. Ephemeral messages.

What I am starting to hate is that the default mail app on my iOS devices makes it hard to delete and simple to archive mail, leading me to the Google trough where the mail donkey gets fed its mail every single day. It grows fat and I get no benefit from it. So now I’m starting to get stubborn and questioning the tools and services I use. Hah! Much too late, of course. In 2016 I downloaded all my mail and deleted the archived mail from the server. Time to do it again?

I have gigabytes of mail archives from days gone by and I’m never ever looking anything up in it. I hardly look at pictures in my photo albums, either. Nor do I read my old journals. So who is it for? Nobody, as far as I can tell. It just sits there, growing.

I think the email archive lacks physicality, so no random browsing, walking past interesting email spines, leafing through old paper, looking at cool email covers and reminiscing. No serendipity. No sitting on the loo, looking for a thing to read and finding those old love letters of yore. Nope. Email archives are just there. Somewhere. Somewhere we cannot go. Unseen and forgotten, like stories from before the war.

Now you can be a digital messy, too! Hoarding all the mails, copying all the PDFs, keeping all the documents. One day you will read it. After the apocalypse, when everybody stops creating more and more of the stuff, you will have the treasure trove of troves, the digital arch of archives. You will restart civilization! 🤩

Seriously, now. Your partner could find the good parts of your email archive and read it when you’re gone? That’d be an interesting use, at least. If you curate your email, then it’s a true archive, not a black hole of gaping memories.

XKCD says it best:

Old Files

The image is licensed under a Creative Commons Attribution-NonCommercial 2.5 License.


Comments on 2018-11-05 Email Archives Are Not Archives


Add Comment

2018-11-04 Traveller Starship Geopmorphs

Wow. This free PDF with Traveller geomorphs is amazing. All your station mapping needs are taken care off, I’d say! 🙇

Linked from this blog post: The Starship Geomorphs book is finally complete!.

I always assumed that one day we’d be able to use Gridmapper to create such maps. But not with this level of detail. Such curves, structures, and more details.


Comments on 2018-11-04 Traveller Starship Geopmorphs

Definitely one for Uplinked Intelligence, the wiki that collects cool OSR Science Fiction house rules.

– Alex Schroeder 2018-11-04 19:21 UTC

Add Comment

2018-11-04 No Future

I don’t know what it is. Ever since I set up the RPG Planets because I wanted to do a little something to support blogs in the face of Google+ going down I’ve been reading more blogs, and Brad J Murray’s blog in particular. Is he on fire or what? Did I miss all his blogging for years?

Well, just now Brad writes about post apocalyptic gaming and how he was basically traumatized by the idea of not having a future for fear of nuclear war.

Ouch, this one goes deep. Here I am, a childless nihilist and the world did not burn after all! I guess I should be happy, now. But waking up from the nightmare of no future, of reading about the blind children in our future, of seeing the mushroom clouds again and again in the movies, I still feel unease. Did this not happen? All these stories start shaping the realities we live in and when they turn out to be wrong, it’s as if part of your reality was wrong, too.

Should I have led a different life?

Well, with the sixth mass extinction event life in the news, perhaps I can go back to my nihilist self. After all, children are out of the question. It’s too late for us.

Everything’s too late.

I do like the blogs coming back, though!


Comments on 2018-11-04 No Future


Add Comment

2018-11-04 New Faces for the Face Generator

Here’s how to create a new collection for the face generator.

First, print some templates.

Second, get a pen and start drawing a sheet of eyes, of eyebrows, of noses, of mouths, of ears, of hair, of chins.

Drawing face elements

Scan them. I use Gimp and there the FileCreateXSaneDevice dialog... menu opens the scanner application. There, I pick Gray and 300 DPI. Then I scan all the stuff I drew.


Next, in Gimp, the processing begins. The first problem is that either the printer or the scanner don’t really get straight lines.

I like to work at 50% zoom...

Use the rotate tool to rotate the image until it looks as straight as possible (shortcut Shift+R). Move the window edges around until you have the opportunity to check whether the lines are in fact straight. In the screenshot below I’m looking at the left edge to verify that the rotation is good.

Rotating the template

Use the crop tool to cut off anything outside the template (shortcut Shift+C).

Got to ImageScale Image.... Scale it to 2250×3000, breaking the link between width and height.

Got to ColorsLevels. In the top bar, move the tiny white triangle to the left until the template is no longer visible in the image. Click the black pipette and then click onto a line that you have drawn such that all your lines are now pitch black.

Using levels to clean up the image

Export your image (shortcut Ctrl+Shift+E).

Cut the image into elements using cutter.pl. It cuts the scan into 5 × 5 images of 450 × 600 pixels each and labels them by row. You’d invoke it as follows: perl helpers/cutter.pl source1.png alex eyes_all nose_all mouth_all hair_all chin_all or perl helpers/cutter.pl source2.png alex eyes_all nose_all mouth_all hair_all ears_all.

In other words: First is the source image, then the artist name, and then you provide the element for every row. If the remaining rows are all the same element, you don’t need to repeat it. Thus, if you’ve drawn a sheet full of eyes, just use perl helpers/cutter.pl source4.png alex eyes_all and you’re good. Make sure you use _all in the filename. That’s how the system knows the face element can be used for all types of faces.

In my case:

perl helpers/cutter.pl alex3-chin-man-2.png alex3 chin_man
perl helpers/cutter.pl alex3-ears-2.png alex3 ears_all
perl helpers/cutter.pl alex3-eyebrows-2.png alex3 face_all
perl helpers/cutter.pl alex3-eyes-2.png alex3 eyes_all
perl helpers/cutter.pl alex3-hair-2.png alex3 hair_man
perl helpers/cutter.pl alex3-mouths-2.png alex3 mouth_all
perl helpers/cutter.pl alex3-noses-2.png alex3 nose_all

And then to write a license file, the README, we should be ready to go, more or less. Let’s see...

Generated Faces

Check it out!


Comments on 2018-11-04 New Faces for the Face Generator


  1. Cleanup images that have some transparency left in them
  2. Draw more!

– Alex Schroeder 2018-11-04 15:59 UTC

Add Comment



Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: Strange Magic Planet Emacsen Adventures in Gaming v2 Ynas Midgard's RPG Blog HERR ZINNLINGS ARBEITSZIMMER Diary Diary Troll and Flame U-Con 2018 Alex Schroeder 🐝 (@kensanata@octodon.social) - Octodon ZENOPUS ARCHIVES Gothridge Manor Dreams of Mythic Fantasy