perma web

How #Seppo! works

#Seppo! is meant for people[1] to operate their own, first-person (single-user) microblog. Therefore gentle onboarding and safe operation are paramount. And because server operation has it's pitfalls, #Seppo! encourages you to rent cheap shared webspace and this way have professionals do the peculiar but generic tasks for you (🏡 Webspace). You do not need privileged server access ('root') to have your own #Seppo!

Setup

#Seppo! is a CGI[2] program driven by a webserver, e.g. Apache being a common one. Put seppo.cgi (see 🌱 Installation) on your CGI-capable shared webspace and enter the address in your browser's address bar, e.g. https://example.com/sub/dir/seppo.cgi. Being brand-new, the CGI doesn't find the marker file delete-me-to-unpack-missing, unpacks all assets (xslt[3], css, delete-me-to-unpack-missing, etc.) and creates private and public facing files, finds no app/etc/credential.s either and so asks to set login credentials. Then it tries to create a symlink in the webspace's root /.well-known/webfinger/.htaccess. Only if self-hosting or not on Apache, you have to care about the webserver configuration. There are config file samples in contrib/etc/.

Discovery (WebFinger RFC7033)

In order to be found (via WebFinger[4]), a http GET request to https://example.com/.well-known/webfinger?resource=acct:alice@example.com must respond with the proper JSON Resource Descriptor document.

#Seppo! sets this up automatically, see S1002 for details.

Add a Post

Typically via web-interface. Posting does:

  1. append to the global app/var/lib/o/p.s
  2. append to the most recent page index app/var/lib/o/p/0.s or start a new one
  3. re-create the public facing according blog page o/p-0/index.xml
  4. evtl. change the symlink to the 'current' blog page o/p/index.xml
  5. do likewise for tags o/t/*-0/index.xml and daily o/d/*-0/index.xml pages
  6. queue a job to notify each follower in app/var/spool/job/new/
  7. trigger queue processing and loop via minutely HTTP calls to itself

Delete a Post

Typically via web-interface. Deleting does:

  1. find the entry in the primary page index app/var/lib/o/p/0.s
  2. overwrite the post in the global app/var/lib/o/p.s
  3. re-create the public facing according blog page o/p-0/index.xml
  4. re-create the according tags and daily overview pages
  5. queue a job to notify each follower in app/var/spool/job/new/
  6. trigger queue processing and loop via minutely HTTP calls to itself

Incoming followed Posts

t.b.d.

Design Decisions

To work unattended, #Seppo! avoids risks wherever possible. Namely

* * *

  1. The Internet is for End Users (RFC8890), back
  2. The Common Gateway Interface (CGI) (RFC3875), back
  3. XSL Transformations (XSLT), back
  4. WebFinger (RFC7033), back
  5. 🐫 OCaml, back
  6. Atom (RFC4287, RFC4685, RFC5005), back