Main page. Just simple HTML, CSS and JS.
https://asxp.io
- Ruby 67.7%
- HTML 23.6%
- CSS 5.4%
- JavaScript 2.5%
- Nix 0.3%
- Other 0.5%
There was no way to put a file up for public use short of running an S3 client with the uploader key. Add a "files" area to the admin: upload one or more files, copy the link, edit the note, replace the contents under the same link, delete. It has its own read/write/delete permission flags like the other areas, and every action is audited. The objects go to the storage stack's public bucket and are served by Garage at s3.asxp.io/public/<key>, not by this app. The app's key can only put and delete there, so a public_files table is the record of what was published. Keys get a random prefix: links are not guessable and names never collide. That host is same-site with the admin, so a file that can carry script must not render there. Only a fixed list of types (images, PDF, plain text, audio, video) is served inline; the rest, HTML and SVG included, is stored as an attachment. Image metadata is stripped by default, as for the bingo photos, because of GPS tags. A per-file limit and a total quota keep the small disk on asxpio-ops from filling up. Assisted-by: Claude:fable-5-2 |
||
|---|---|---|
| .forgejo/workflows | ||
| bin | ||
| db | ||
| lib | ||
| public | ||
| test | ||
| views | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| asxpio.rb | ||
| CLAUDE.md | ||
| config.ru | ||
| docker-compose.yml | ||
| Dockerfile | ||
| flake.lock | ||
| flake.nix | ||
| Gemfile | ||
| Gemfile.lock | ||
| Rakefile | ||