A minimal personal wiki written in Go Lang
model | ||
server | ||
views | ||
go.mod | ||
go.sum | ||
main.go | ||
README.md | ||
TODO.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)
- view version (default latest)
- Normalize URLs
- e.g. reidrect page/ -> page
Stretch goals
- List pages
- optionally filter by tag
- pagination
- Search
- query into title (e.g. PageName), tags
- full text?
- n results, pagination not needed
- Auth for protected pages
- edit, restore
- Atom feed for updated pages (last n)
- 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
- needed? html/template
- not super-easy to use
- 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