Extensible wiki system using CouchDB and written in Golang

Wikifeat

Build Status

Introduction

Wikifeat is an open source collaboration platform built around the ever-popular Wiki concept. It is meant to be extensible and highly usable. Many enterprise collaboration platforms may be powerful and extensible, but they are often difficult to develop for and have an unfriendly, overly complicated user experience. Wikifeat uses a microservices architecture which not only facilitates scalability, but also allows for the addition of custom services to extend the core system.

wikifeat_screenshot_sm

Goals

The overarching goals for the Wikifeat project are:

  • Usability - The core Wikifeat system should provide a simple, intuitive wiki experience with a clean UI an a simple, easy to learn markup language (i.e., markdown).
  • Extensibility - It should be possible to extend Wikifeat with additional services and front-end plugins to provide new functionality and integrate Wikifeat with other systems.
  • Scalability - It should be possible to horizontally scale a Wikifeat installation without great difficulty.

Key Features

Wikis

  • Allows for the creation of multiple 'wikis', each with its own access controls
  • Markdown is used for the markup language.
  • Users are able to comment on individual pages.

Wiki pages are edited using simple Markdown -- specifically, Commonmark. A screenshot of the editor interface is shown here:

wikifeat_edit_sm

REST API

The wikifeat core services each expose a REST API to facilitate extensibility and integration with other services.

Plugin Support

Wikifeat has the ability to load javascript plugins to extend the functionality of the web application.

Scalability

Wikifeat's architecture is designed with scalability in mind. The core system consists of a set of microservices registered to an Etcd service registry. Multiple instances of each services may be running across multiple machines, with service discovery handled by your Etcd cluster.

Status

I'm no longer actively developing Wikifeat and have moved on to other projects. I will accept pull requests, so please feel free to contribute and/or fork.

For an example of a running Wikifeat installation, see https://www.wikifeat.org

See the Technical Overview for a more detailed introduction.

Documentation

Please see the Wikifeat website for more information and documentation. Documentation is also a work in progress.

Contributing

Contributions are most welcome. See https://www.wikifeat.org/app/wikis/wikifeat/pages/contributing for details.

Comments
  • 'gzip: stdin: unexpected end of file' when untarring the download file

    'gzip: stdin: unexpected end of file' when untarring the download file

    wget https://www.wikifeat.com/api/v1/wikis/686243fa4392400aad390cc59fa0987b/files/222361ead18c40e880b57d386c5a563e/content?attName=wikifeat_0.2.0-alpha.Linux-x86_64.tar.gz | tar xvz
    
    --2015-11-25 21:48:09--  https://www.wikifeat.com/api/v1/wikis/686243fa4392400aad390cc59fa0987b/files/222361ead18c40e880b57d386c5a563e/content?attName=wikifeat_0.2.0-alpha.Linux-x86_64.tar.gz
    Resolving www.wikifeat.com (www.wikifeat.com)... 104.131.164.61
    Connecting to www.wikifeat.com (www.wikifeat.com)|104.131.164.61|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 20040381 (19M) [binary/octet-stream]
    Saving to: ‘content?attName=wikifeat_0.2.0-alpha.Linux-x86_64.tar.gz.1’
    
    content?attName=wikifeat_0.2.0-alpha.Linux-x 100%[=============================================================================================>]  19.11M  1.72MB/s   in 14s    
    
    2015-11-25 21:48:24 (1.33 MB/s) - ‘content?attName=wikifeat_0.2.0-alpha.Linux-x86_64.tar.gz.1’ saved [20040381/20040381]
    
    
    gzip: stdin: unexpected end of file
    tar: Child returned status 1
    tar: Error is not recoverable: exiting now
    
  • Markdown editor replace or improve.

    Markdown editor replace or improve.

    The Wikifeat web client currently uses the showdown markdown editor (used on Stack Exchange, etc.). This was quick to integrate and provided some improvement over a plain HTML textarea. There are a few issues with it, however, that may warrant replacement (or a fork):

    ~~1. The preview pane uses it's own markdown parser, which behaves slightly differently (it apparently implements a slightly different dialect of Markdown) from the Commonmark parser on the backend, which can cause published results to not match the live preview.~~ Brought in commonmark.js to render markdown in the preview pane.

    1. The 'insert image' button takes a url. When attaching an image which is already on the wikifeat site (in the 'files' section), this is inconvenient. Implementing a nice image browser/selector would be the preferred solution.
    2. A method to insert 'download' links for files on the wikifeat system would be highly desirable here.
    3. The preview pane doesn't render plugins
  • Implement user profile/settings

    Implement user profile/settings

    The User settings menu item does nothing. Allow users to edit their profiles (contact info, etc). As part of the user profile, implement user pictures/avatars. Consider implementing Gravatar support as well.

    Also, the various username links that currently lead nowhere should display user profiles.

  • Create config service

    Create config service

    Right now, wikifeat-config loads the configuration parameters from the config.ini file into etcd and then terminates. Need an actual config REST service so that certain configuration parameters may be queried. Eventually this config service could be extended to allow on-the-fly config changes.

  • Figure out Travis CI build issues (or find an alternative CI system)

    Figure out Travis CI build issues (or find an alternative CI system)

    Travis CI continues to produce inconsistent results. The occasional network timeout causing failed unit tests seems to be the main issue (Usually retrying a build corrects this, when that particular Travis feature happens to be working). Adding copious sleep/wait statements and extending the length of http.Client timeouts has helped some, but the issue persists.

    It may be necessary to find an alternative CI. I am tempted to just setup a Jenkins instance on a VPS somewhere.

  • Refactor authentication / login code to improve modularity

    Refactor authentication / login code to improve modularity

    This is necessary to allow for adding custom authentication modules (LDAP, etc.). Will need to stop using the CouchDB Session API as it is not flexible enough, and implement Session management outside of CouchDB.

    The solution to allowing external authentication methods appears to be a combination of handling session management in the middleware (rather than letting CouchDB do this for us), and using CouchDB's Proxy Authentication feature.

    Authorization will still take place in CouchDB using CouchDB's role based access (read, write, admin). Thus, an entry in the '_users' database will still need to be created (and synced) for users authenticating against external services (LDAP).

  • Add meta description to frontend config

    Add meta description to frontend config

    Allow users to specify the content of a meta-description tag in the frontend config.ini. Right now the only way to accomplish this is to manually add a meta-description tag to the index.html file in the web app.

  • Can't 'back' out of web application

    Can't 'back' out of web application

    While the browser back button works for navigating within the application, it's a real pain to back out of the web application altogether. I believe this problem is being caused by the 'home page' being pushed to the Backbone.history after the application has loaded.

  • Cleanup: minor API inconsistencies

    Cleanup: minor API inconsistencies

    While working on the API documentation, I noticed a couple of inconsistencies in some of the JSON data structures. For example, "created_at" vs "createdAt", etc. Minor stuff.

    Better to fix sooner rather than later.

  • File manager download links wrong for guests

    File manager download links wrong for guests

    In the file manager view, when not logged in (guest mode), file download links are not displayed correctly. If you have a link, it works (i.e., the links on the wikifeat.com 'Downloads' page work just fine), this affects the file manager view specifically.

  • Guests can see Wikis they can't access

    Guests can see Wikis they can't access

    In the Wikis menu in the sidebar, wikis with guest access disabled will appear in the listing when using Wikifeat in guest mode. Even though the guest cannot access these wikis, it would be best if they were not able to see them.

    Simple fix, this.

  • run errors

    run errors

    Fetching Configuration from http://localhost:2379 2020/07/24 11:31:19 Error getting key DbAddr: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key DbPort: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key UseSSL: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key DbAdminUser: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key DbAdminPassword: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key DbTimeout: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key MainDb: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key LogFile: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key MaxSize: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key MaxBackups: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key MaxAge: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key EntryTTL: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key CacheRefreshInterval: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key WebAppDir: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key PluginDir: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key Homepage: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key Authenticator: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key SessionTimeout: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key PersistentSessions: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key AllowGuest: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key AllowNewUserRegistration: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. 2020/07/24 11:31:19 Error getting key MinPasswordLength: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. [Poetry.plugin] name=Poetry author=Wikifeat stylesheet=style/poetry.css version=1.0 pluginDir=plugins/poetry mainScript=poetry-plugin.js enabled=false [OpenLayers.plugin] name=OpenLayers author=Wikifeat stylesheet=style/ol.css version=1.0 pluginDir=plugins/ol mainScript=ol-plugin.js enabled=false 2020/07/24 11:31:19 Initializing Database Connection client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint.

  • Document conflict resolution

    Document conflict resolution

    When a Wikifeat system is backed by multiple instances of CouchDB, the possibility of conflicting document versions exist. CouchDB "resolves" this upon replication by storing both versions on each node, and just 'picking' a winner to present in response to a read request (supposedly this is a deterministic process so the same winner is consistently returned on all nodes).

    Need to allow users (those with write access to a particular wiki, anyway) to participate in resolving conflicts (i.e., merging the conflicting versions into a 'new' one). CouchDB does allow you to query for conflicting document versions on a read, which will be helpful.

    The solution should go something like this:

    1. In the UI, place an 'alert' box at the top of a document if an unresolved conflict exists (Possibly limit this to users with 'write' access) along with a clickable 'resolve now' link.
    2. When clicked, the UI presents a 'merge' view containing a side-by-side diff of the two versions (similar to the merge tools in many SCM GUI tools).
    3. The user merges the two documents and saves the result
    4. The old versions are added to the history, with the new 'merged' version becoming the current document revision.
    5. User rejoices.
  • Need a thumbnail gallery for images

    Need a thumbnail gallery for images

    Two parts to this:

    1.) Generate thumbnails for images as they're uploaded. 2.) Implement a thumbnail gallery in the "Insert Image" dialog in the page editor.

Ukuleleweb is a minimalist Wiki with the look and feel of the original WikiWikiWeb

Ukuleleweb Ukuleleweb is a simple Wiki implementation in the style of the original WikiWikiWeb / C2 wiki. Few dependencies The only dependencies are a

Feb 7, 2022
Our collaborative Wiki software.

Emvi Wiki Support? No. This used to be our SaaS on emvi.com, but didn't work out the way we wanted. It's now open-source to help some of our users kee

Mar 4, 2022
Community system build using GoFrame.
Community system build using GoFrame.

Focus聚焦社区是GoFrame社区项目,采用了简洁强大的GoFrame作为后端WEB框架, 由于前台系统需要SEO因此使用了GF自带template模板引擎,数据库用MySQL,前端使用jQuery/bootstrap框架。

Dec 7, 2022
The source code for workshop Scalable architecture using Redis as backend database using Golang + Redis

The source code for workshop Scalable architecture using Redis as backend database using Golang + Redis

Sep 23, 2022
A Golang REST API to handle users and posts for a simple instagram backend. Uses MongoDB as the database. Tested using golang-testing and Postman.
A Golang REST API to handle users and posts for a simple instagram backend. Uses MongoDB as the database. Tested using golang-testing and Postman.

A Golang REST API to handle users and posts for a simple instagram backend. Uses MongoDB as the database. Tested using golang-testing and Postman.

Oct 10, 2021
A simple command line tool using which you can skip phone number based SMS verification by using a temporary phone number that acts like a proxy
A simple command line tool using which you can skip phone number based SMS verification by using a temporary phone number that acts like a proxy

Fake-SMS A simple command line tool using which you can skip phone number based SMS verification by using a temporary phone number that acts like a pr

Dec 31, 2022
Golang beego framework based personal simple blog system
Golang beego framework based personal simple blog system

goblog 基于Golang的个人简易博客系统 [TOC] goblog介绍 goblog基于go语言开发的一个简约版个人博客系统,基于Golang语言编写,后端基于了Beego的web框架,目前具备博文系统最基础的功能模块.基本上是一个拿来即用的个人博文平台,只需要部署一个mysql数据存储服务

Nov 9, 2021
A blog system implemented via golang.

goblog functions work as a blog site read/write blogs signup/signin/logout vote with stars 1~5 user admin: add ranks to users: bronze, silver, gold wo

Jan 5, 2022
DCreater - Build your own blog system with golang

DCreater - Build your own blog system with golang

Aug 18, 2022
:construction: Closed. A website and user system (Gin/Backbone).

A website and user system starter. Implemented with gin and Backbone. Gowall is port of Drywall Go Node.js Repository here Drywall Site Gowall Drywall

Jul 6, 2020
Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles.
Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles.

Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles. It supports multiple users sharing multiple vehicles. It is the logical successor to Clarkson which has not been updated for quite some time now.

Jan 2, 2023
A URL shortener using http://is.gd/ and the Go programming language (http://golang.org/)

goisgd A simple command line URL shortener using http://is.gd/. Getting the Code go get github.com/NickPresta/GoURLShortener Usage Import this librar

Apr 6, 2022
Simple Todolist using Golang IO and Mysql

Simple Todolist using Golang IO and Mysql HOW TO USE create 2 database with name : todolist for product todolist_test for test create table in both da

Nov 22, 2021
Go-gin-mongo-api - A backend RESTful API built using golang, gin and mongoDB

go-gin-mongo-API This is a RESTful backend API which is developed using the gola

Jul 19, 2022
A social media API to handle users and their posts, written from scratch in Golang
A social media API to handle users and their posts, written from scratch in Golang

Initial Set-Up To start the project on your own machine you'll need Golang instlled, along with mongoDB. Once you've insured these requirements are me

Oct 9, 2021
GoTrue is a small open-source API written in Golang, that can act as a self-standing API service for handling user registration and authentication for Jamstack projects.
GoTrue is a small open-source API written in Golang, that can act as a self-standing API service for handling user registration and authentication for Jamstack projects.

GoTrue is a small open-source API written in Golang, that can act as a self-standing API service for handling user registration and authentication for Jamstack projects.

Dec 13, 2021
A simple demo written in Golang to shorten URL and redirect

url-shortener A simple demo written in Golang to shorten URL and redirect . ├── go.mod ├── go.sum ├── handler │ └── handlers.go ├── main.go ├── shor

Jun 5, 2022
A todo app written in Golang, MongoDB, and React.
A todo app written in Golang, MongoDB, and React.

A todo app written in Golang, MongoDB, and React.

Jun 5, 2022
A RESTful API written in Golang to store and retrieve ticket information.

Tickets-API A RESTful API written in Golang to store and retrieve ticket information. This is a RESTful API built on top of the gin-gonic/gin package

Jan 31, 2022