It’s a vibe-coded, Pandoc-based, Dokuwiki-inspired, flat-file, wiki-like CMS written in Python
Ryan Schram
2025-06-08
Pandoky is a lightweight, flat-file based Content Management System (CMS) inspired by DokuWiki, built using Python, Flask, and Pandoc. It allows for easy creation and management of Markdown-based wiki pages with a focus on extensibility through a plugin architecture. All code was created in an interactive chat session with Google Gemini 2.5 pro (preview). The AI followed the instructions given by a human creator, starting with the prompt,
I have a new1 vibe coding project for you. Dokuwiki is a content management system based on flat file data storage. It’s implemented in PHP. I would like to create a dokuwiki clone implemented in python. It should have the same basic architecture as Dokuwiki including plug-in extensibility.2
The AI replied with, initially, an overview of how one might create such an app, and then a skeleton for a Flask app, followed by initial versions of core files, basic templates and static assets, and plug-ins. The human creator in turn followed the instructions of the AI, asked questions of procedure, copied the files, ran them, reported errors, made changes (or copied over corrected or improved versions of different components), and then suggested new plug-ins or expanded functions.3 Who was the lord and who was the servant? Is the human a creator, worker, or just another Google customer? Is the AI a worker, a creator, or just another product? It is a question for the ages. If anything, I have learned how little I know about the basic conventions of software development. This code is still being tested and so this site may not always work. Please let me know if you find any errors, but I can’t promise any fixes.
data/pages/
directory. No database is required for core content./
in page names (e.g.,
docs/setup/installation
). Directories are created
automatically.--citeproc
) using
bibliography files (BibTeX, CSL JSON/YAML) and CSL styles.~~SIMILAR(N)~~
macro to display a list of N similar pages
based on TF-IDF cosine similarity.
is automatically resolved to
serve these files..bib
,
.csljson
, .yaml
).[[Page Name]]
,
[[Namespace/Page Name]]
, and
[[Namespace:Page Name|Display Text]]
style wikilinks.favicon.ico
.Prerequisites:
Clone the repository (if applicable).
Create a virtual environment:
Install Dependencies:
Configuration:
config.py
if needed.FLASK_SECRET_KEY
config.py
for development only):
MAIL_SERVER
MAIL_PORT
MAIL_USE_TLS
MAIL_USERNAME
MAIL_PASSWORD
MAIL_DEFAULT_SENDER
Initialize data files:
data/
directory with default values./auth/register
and
then ensure this username is added to the "admin_users"
list in data/acl_config.json
.Run the development server:
The application will typically be available at
http://127.0.0.1:5000/
.
/<page_name>
or
/<namespace>/<page_name>
./admin/acl
(for ACLs) and /admin/media
(for
media), /admin/bibliography
(for bib files) after logging
in as an admin user.I plan on testing this version of the app online and then possibly
trying to create (with AI assistance) plugins that emulate functions I
use with Dokuwiki, for instance a deck.js plugin, k-means clustering,
and a page inclusion plugin. A fun idea would be to learn how to use
Javascript fetch()
to interact with Flask endpoints,
opening the possibility of perpetual scrolling, but then, who wants to
contribute to the gradual brainrot of the terminally online?
AI acknowledgement: This README was itself written by Google Gemini 2.5 Pro (preview) at the end of the development process. The introduction was expanded and the document was edited by the human creator. The cascading style sheets and favicon were also created in discussions with the same AI tool.
The earlier project was to create a command-line app that would convert Markdown text files and CSV files to pages and assignments and upload them to Canvas LMS using its API. What can I say? I love learning outcomes.↩︎
The full chat transcript is (for now) available here: https://g.co/gemini/share/8e3b3be23d77.↩︎
At some point, Pandoc was added as the core rendering engine because the human likes using Pandoc. He knows there’s a performance cost by launching a new process on every render.↩︎
The AI felt this was important to include and I let it have this one to avoid an argument.↩︎
tbh I think these plug-ins all depend on each other.
They were created in the same chat and that usually initiated several
changes to related files, and to app.py
. This was really at
the outer limits of my knowledge of software architecture.↩︎