Portfolio
Writing
Permalink to “Writing”Novella
Permalink to “Novella”The Weight of a Torch
Permalink to “The Weight of a Torch”A Cursebind Novella
Permalink to “A Cursebind Novella”THE TORCH THAT WITHSTANDS THE DARKNESS WILL CONSUME THEM ALL.
In a world on the brink, heroes called Synchrony risk everything to protect the Five Great Cities. When Kaia uncovers dark secrets and ancient power, she must decide if the true threat lies within her society—or the monstrous Others beyond its crumbling borders.
The Weight of a Torch contains the three short stories (The Weight of a Torch, Synchrony, and Vigilant) as well as two additional chapters that are not available online.
Short Stories
Permalink to “Short Stories”- A Crystal Clockwork appears in Written in Blood Volume 1
- The Weight of a Torch @ The Arcanist
- Synchrony @ The Arcanist
- Titan
- The Cairnlands
- A bunch of Flash Fictions available on Cthonicstudios.com
Sites
Permalink to “Sites”Auth Omnibus
Permalink to “Auth Omnibus”Cthonic Studios
Permalink to “Cthonic Studios”Publishing / TTRPGs
Permalink to “Publishing / TTRPGs”You can find all of my work at cthos.itch.io and some of it on DrivethruRPG.
One Page Games
Permalink to “One Page Games”24XX SRD Games
Permalink to “24XX SRD Games”Shadowdark RPG
Permalink to “Shadowdark RPG”Icon Packs
Permalink to “Icon Packs”Software
Permalink to “Software”GW2 Assistant
Permalink to “GW2 Assistant”
GW2API
Permalink to “GW2API”GW2API is a nodeJS module designed to help facilitate communication with the excellent Guild Wars 2 API. It features several convenience methods that chain calls together in order to make more friendly results, as well as an internal storage mechanism to cache the results of calls without much effort.
Example
Permalink to “Example”import { GW2API, Memstore } from "@cthos/gw2-api";
const api = new GW2API();
// Set storage system to RAM if no access to localStorage
api.setStorage(new Memstore());
// Get daily pve achievement names:
const achievements = await api.getDailyAchievements(true); // the true is default, but this will translate the IDs to their objects directly
const achievementNames = achievements.map((a) => a.name);
// Get all character names associated with an account.
await api.setAPIKey("YOUR-TOKEN-GOES-HERE");
api.getCharacters().then(function (res) {
for (var i = 0, len = res.length; i < len; i++) {
// This API call just returns an array of string character names.
console.log(res[i]);
}
});
// Get Character Details
api.getCharacters("Zojja").then(function (res) {
console.log(res);
});cthos@localhost:/Documents/Code/gw2-api$ node example.js
Getting Daily PVE Achivements:
Daily Kryta Vista Viewer
Daily Queensdale Event Completer
Daily Fractal
Daily Frozen Maw
Daily Maguuma Jungle LumbererGitlab: https://gitlab.com/cthos/gw2-api
NPM: https://www.npmjs.com/package/@cthos/gw2-api
Atom-Gitbook
Permalink to “Atom-Gitbook”atom-gitbook is an Atom.io package which helps work with Gitbook by providing a sidebar that parses and displays the table of contents, and allows you to manipulate it from the editor.
Github: https://github.com/cthos/atom-gitbook
odt-to-pdf
Permalink to “odt-to-pdf”Because I needed a way to convert odt files to pdf files on the fly (and whenever they were updated in Dropbox), I wrote a quick Dockerfile to wrap up some common functionality in order to watch a mounted volume.
It uses fswatch to watch the filesystem (using the poll method since inotify generates around 12 calls per Dropbox file change) and a small shell script to invoke Libreoffice's command line.




