A minimal personal wiki written in Go Lang
 
 
 
Go to file
Óscar M. Lage 8b70447e2a Update TODO 2022-04-04 22:16:26 +02:00
bin Add: Bin directory 2022-03-28 21:32:35 +02:00
model Add: Page version list 2022-04-04 22:16:07 +02:00
server Add: Page version list 2022-04-04 22:16:07 +02:00
templates Add: Page version list 2022-04-04 22:16:07 +02:00
CONTRIBUTING.md Add: CONTRIBUTING file 2022-03-28 22:00:13 +02:00
Makefile WIP: Generate changelog 2022-03-28 22:10:39 +02:00
README.md Organize docs 2022-03-19 00:35:53 +01:00
TODO.md Update TODO 2022-04-04 22:16:26 +02:00
go.mod Add: Bluemonday + Backfriday support 2022-03-22 22:06:41 +01:00
go.sum Add: Bluemonday + Backfriday support 2022-03-22 22:06:41 +01:00
main.go Add: version flag (-v) 2022-03-28 21:19:36 +02:00

README.md

Wikingo

A minimal personal wiki written in Go Lang

Features

  • Markdown -> HTML
  • Basic HTML (with Water CSS, for example)
    • requires serving static content
  • One level pages (e.g. http://host/PageName/)
    • view version (default latest)
      • old version -> restore
      • delete
    • edit
    • list history (changes -> view version)
  • Normalize URLs
    • e.g. reidrect page/ -> page

Stretch goals

  1. List pages
  • optionally filter by tag
  • pagination
  1. Search
  • query into title (e.g. PageName), tags
  • full text?
  • n results, pagination not needed
  1. Auth for protected pages
  • edit, restore
  1. Atom feed for updated pages (last n)
  2. Detect the page has changed before post
  • show warning

Stack

  • Storage: sqlite with GORM
    • easy queries
    • struct -> tables
    • auto-migrations
  • HTTP server: Echo
    • easy to use
    • routes
    • static content
    • middleware (e.g. auth, remove trailing slash)
  • Templates
  • Markdown -> HTML: Blackfriday

Routes

Method URL Notes
GET / alias for WikiHome
GET /:page(/:version)? version is optional, defaults to "latest"
GET /:page/edit protected
POST /:page/edit protected
GET /:page/history
POST /:page/restore/:version protected
DELETE /:page/:version protected
GET /list(/:tag)? tag is optional, stretch goal
POST /search stretch goal
GET /atom.xml stretch goal

:page in format CamelCase (starts uppercase)
:version is numeric
:tag is string

Model: Page

  • Page name
  • version
  • change description
  • created on
  • updated on
  • tags (e.g. tag1:tag2:tag3)
  • body

(thanks reidrac, MrReidrac)