196 karma · joined November 4, 2021
(I'm active here under an alias, I only use this account for activity that I specifically want to attach my name to.)
It turns out that the challenge with launching a freemium product is that you need something that's both useful as a free tool while also having a compelling value-add for paid users. That's a lot for one person to build. I don't think I'll be aiming for that monetization strategy with future projects.
I have to confess that I'm (barely) missing the qualifying income bracket - some kind soul is supporting me for $5/mo on buymeacoffee.[3]
[1] https://news.ycombinator.com/item?id=29106581
By popular demand, or at least popular inquiry, I've decided to open-source the project at its current state. It's useful in its current state (I used it every week as GM), but some of the really cool features lie on the horizon. I'm now inviting contributors to help me make that a reality.
Previous submission: https://news.ycombinator.com/item?id=29106581
I'm gratified to hear that. It occurred to me early on in development that this could either be fantastic or an absolute disaster from an accessibility standpoint, so I made a particular point of getting the aria tags correct. However, I'll confess that I haven't actually tested it with a screen reader yet, so perhaps it's better to say that it's not entirely accidental.
You're right that there's plenty of scope creep in what you're suggesting, and it's probably beyond what I'll be able to handle. However, you've given me a strong motivation for open-sourcing the frontend. It's an absolute disaster from a code standpoint, but it's very simple and could be used as a jumping-off point for just about anything that simulates a screen reader experience.
I currently have no plans for D&D Beyond integration, or maybe more to the point they have no interest in integrating with me.
I don't expect my character generators to surpass the many resources that are out there already. The one way in which they might be superior is that they'll offer suggestions that make more sense given the current setting, as well as being readily available. I do want the app to help with stage management, since I don't have the attention to spare for picking out music or managing lighting as I'm trying to tell a story.
Definitely agree about Roll20 being too heavy. I just want to drag tokens around on a map. Unfortunately, that's also a very different project from the one I'm building. I haven't used it at the table, but Schmeppy[1] might be closer to what you're looking for. I look forward to trying out the Dynamic Dungeons Editor once I'm back to playing in-person, too.[2]
[0] https://github.com/5e-bits/5e-database
[2] https://store.steampowered.com/app/1694430/Dynamic_Dungeons_...
That said, I definitely intend to add relationships (initially hierarchical, which will be reflected in the journal view). It seems like it would be valuable to support arbitrary user-defined relationships between entities, although syntax and interpretation start to get fuzzy the more user-provided terms you throw into the mix. If you tell me "nick is at war with rocky", does that define a relationship between Nick and Rocky or does it tell me that Nick is at a place called "War With Rocky"?
* This use case involves tons of string parsing and concatenating, which vanilla Rust does not make intuitive. A garbage-collected language would also probably handle this more efficiently than I can, given that Rust is doing exactly what I tell it and I don't have the time or inclination to microoptimize piles of parsing code.
* Generally, the work is sufficiently high-level to require large swaths of the standard library and a fair number of dependencies despite my best efforts.
* I've built a brick wall between myself and my data store. Ultimately persistence happens in IndexedDB with a JS shim, but currently the application loads the entire contents of your IndexedDB database into memory and runs based on that.
The WASM binary weighs in at 1.6 MB (500 kB over the wire). The source, without excluding tests, comes in at 580 kB (estimate 400 kB of actual code). If it were Typescript, I could probably minify that down to 200 kB or less, and that would still be plain text and achieve a better compression ratio than my WASM binary.
Mind you, I haven't put in a huge amount of work to stripping down the binary. But that's more or less the point: choosing Rust/WASM ended up having a lot of down sides without much in the way of up side, save for one: it's been a lot of fun to do, and I probably wouldn't have made it this far in a language I didn't enjoy as much.
Edit: Fixed now.
I do have plans to build out integrations, starting with webhooks triggered on events like creating characters, advancing time, or moving between places. I've also heard some requests for a bona fide command-line binary, which I might do if the demand is there. The maintenance overhead is not insignificant, though.
I use Caith[0] to handle dice parsing and rolling, although if this is a learning project you may want to reimplement that part yourself.
I set out to build something that I could use as a game master at the table without having to put the game on hold as I navigated through menus and bookmarks for the various references and generators I use. My general design principle is that everything in the app should be available at any time, with no need to navigate menus on one extreme, or read documentation on the other.
The core is written entirely in Rust with a couple of hundred lines of JS glue. I was running it as a command-line app for the first month of development, and it still works as such. However, since I added autocomplete to the web interface, the web version is now more feature-complete than the command line. I don't see much value in the extra work of backporting features to the command line at this point. (Turns out Rust was the wrong choice for this particular project, but the die is cast for the moment, and it has been fun.)
I've barely scratched the surface of the feature that I'm most excited by, namely context. Soon it will be possible to tell the app where the party is and what they're doing, and the demographics of suggestions (and ultimately music, lighting, and other integrations) will be updated accordingly. In a seedy bar in the docks district? You're more likely to run into sailors down on their luck. Pick a fight? Cue the epic music. Sun sets? Dim the lights.
More details are available on my blog:
https://mikkel.ca/blog/introducing-initiative-sh/
I do have plans to monetize this project in the future, charging for the server-side features (integrations and cloud sync) while keeping the client-side features free. Everything that is currently implemented will always be free.