Here's how flat file storage is organized. Let's say we have board1 with 3 posts and board2 with 2 posts.
data/
├── html
│ ├── board1
│ │ ├── 1
│ │ ├── 2
│ │ ├── 3
│ │ ├── index
│ │ └── list
│ └── board2
│ ├── 1
│ ├── 2
│ ├── index
│ └── list
└── sexp
├── board1
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── index
│ └── list
└── board2
├── 1
├── 2
├── index
└── list
SchemeBBS will serve static HTTP files if it can find them (but this is actually done directly and much more efficiently by Nginx.) If there's no HTTP file, then it will generate HTML from S-Expressions. Threads in sexp
are lists of posts. It made sense for complete threads but vectors would have been more suitable for random access with posts range. The choice wasn't entirely rational, I wanted lists.