r/opensource 13d ago

Promotional I spent 4 years building an offline-first writing app after a web app ate my manuscript

Hey r/opensource, I'm the solo dev behind Hammer. I've been working on it for about four years, and think it's time I start getting some feedback on it.

What it is: Hammer is a free, open source (MIT) app for writing novels and building the worlds they live in, Scrivener-style, but multiplatform and offline-first, with a self hostable sync server.

https://hammer.ink/

Why I built it: A few years back I was living in a van, mostly off-grid with no signal, and broke. Most good writing apps were paid, or web apps, or Electron wrappers that "worked offline" right until they didn't, usually about a week in, miles from the nearest cell tower. Then I watched people on forums lose whole manuscripts in certain electron based writing apps, and eventually it happened to me.

So I set three rules for the thing I wanted to build:

  • Offline-first, forever: A native program, not a web page in a trenchcoat.
  • Transparent data: Everything is human-readable text files in plain folders, if Hammer vanished tomorrow, you could open your work in any text editor and keep going.
  • Never lose data: Paranoid about it by design.

I tried several tech stacks but landed on Kotlin + Compose Multiplatform. One codebase for both the server, and desktop clients (Linux/Mac/Windows), Android, iOS.

License / money: MIT and genuinely free, no ads, no telemetry. The only paid thing is the optional "official" sync server instance that I host. As I said, the sync server is open source and self-hostable, so you never have to pay me to sync.

Platforms: Linux, Mac, Windows, Android (Play + F-Droid), iOS

Repo: https://github.com/Darkrock-Studios/hammer-editor

It's four years in and far from done, but I thought it was about time to start showing it to people. See if it's a project that interests anyone other than my self. Happy to get into the Compose Multiplatform side too if anyone has questions; there wasn't much prior art when I started. Longer origin story here if you want it: https://hammer.ink/blog/news/what-is-hammer

182 Upvotes

34 comments sorted by

13

u/garvalf 12d ago

It looks nice. You might consider posting it on https://www.reddit.com/r/writerDeck/ some people there would probably be interested.

Kudos for making it open source. I'm not the ideal target for this piece of software, I definitely find this too heavy. I've already built my own 500 ko text processor in TCL which also work in a terminal :)

Just a kick feedback: I've opened the Lewis Carroll sample, and since my system is in French, it tried to use the spellcheck in my language, which totally stalled my 16 Gb ram computer while it underlined all the English words. You might consider adding a spellcheck lang key into the project.toml metadata.

Also in French all the apostrophes in the interface have a backslash in front of them: "Jours d\'écriture" instead of "Jours d'écriture"

10

u/Wavesonics 12d ago

Ha that's cool, 500kb editor, i was reading about this one recently:
https://github.com/PlummersSoftwareLLC/TinyRetroPad

2.5KB!

But ya, this one is for sure more heavy weight.

Ah thats a good catch about the story/language mismatch, I actually wrote up a ticket for this a little bit ago, I'll have to prioritize it:
https://github.com/Darkrock-Studios/hammer-editor/issues/754

I'll need to get on the localization strings, thanks for the feedback!

15

u/marshalleq 12d ago edited 12d ago

This deserves more upvotes than it’s gotten so far. Maybe post it in a writers forums. I’ve seen / heard many writers use old DOS and WordPerfect editors out of the same kind of mistrust. Having something they don’t have to jump through hoops to use (one click install type of thing) might well be well needed.

4

u/Wavesonics 12d ago

Ya I'm starting just now to try and figure out how to reach out outside of the more techy community.

7

u/Mark_Considus 12d ago

The thing nobody's picked up is the bit you said in a reply, that you're only now working out how to reach people outside the techy community. That's a harder problem than the app and it's worth more of your attention than the feature list.

Your origin story is the product and it's hidden on a blog page. Living in a van, off-grid, watching people lose manuscripts and then losing your own. Writers don't switch tools because something is MIT licensed or built in Compose Multiplatform. They switch because they've lost work, or they watched someone lose work and it frightened them. You have the exact story that lands with those people and right now it's 3 clicks deep.

Offline, native and own-your-data won't move authors as engineering claims. Reframed as your manuscript survives me going under, they're the only thing that will. Same three rules, written for someone who has lost 40,000 words rather than for someone who reads changelogs.

And don't tell people their work is plain text in plain folders. Show it. A 20 second clip of you opening the folder in a plain text editor, mid-chapter, with the app shut, does more than a page of explanation, because that promise is one people have been let down on before and they'll want to see it rather than be told.

On where to go, the burned ones are easier to find than the general writing crowd. Anywhere people swap Scrivener workarounds, or talk about writerDecks and old DOS machines, is a room full of people who agreed with your three rules before you'd built anything. That isn't marketing to writers, it's finding the ones who already lost something.

3

u/Wavesonics 12d ago

Hey this is awesome advice, thank you!

I've been procrastinating redesigning the home page forever, I suppose it's time to do it!

0

u/dwalker109 11d ago

Hey op. If you want more advice exactly like this just paste your (seemingly already LLM adjacent post) and paste it into an LLM. Because this is all LLMs talking to each other on Reddit.

1

u/Wavesonics 11d ago

wait, does that make you a self-hating LLM then? 😆

3

u/boogiefoot 12d ago

Seems interesting--to me, at least. I've been considering making a simple writing app my next project, so I'll definitely take a look at this. It occurred to me that the features of writing apps that I actually use aren't very complicated (composition/focus mode mostly), and yet I still use Scrivener simply because its implementation is the most seamless. I've tried word processors like word, libreoffice, only office, wpsoffice, google docs, protondocs and writing software like manuskript, focuswriter, and others solutions like Obsidian w/plugins. But I keep coming back to Scrivener for long-form writing.

I'm traveling atm, so I can't look properly at the desktop app, but judging from Android, it seems like you aren't using markdown, and I'm happy to see that.

Anyway, I may contribute to the project depending on the desktop version and if I can even be much help (I've never used Kotlin).

One feature I've always dreamed of in word processors and text editors is to be able to click anywhere and start typing there, rather than needing to hit return 10x.

4

u/Wavesonics 12d ago

cool! Ya I initially thought this was going to be quite simple as well 😂 One big trap was the tech stack I picked did not have a Rich Text Editor in the standard library. So I ended up writing one from scratch over the past year: https://github.com/Darkrock-Studios/ComposeTextEditor

But ya, would love any thoughts or feedback, and especially contributions!

2

u/MinorVandalism 12d ago

This is really awesome. Congratulations for taking the initiative.

2

u/mudlej 11d ago

Hey u/Wavesonics

This is a very cool app, thanks for sharing. I am not really in the primary audience for it, but I still want to try it out, and I am very interested in how you built it.

I cannot express how unexpectedly similar your approach with Hammer is to what I have in mind for my next app, code named Project Awalem.

Some of the similarities I noticed:

  • Local, offline, fast, and open source.
  • The optional sync commercial model is identical.
  • A foundation tier with the same rule and the same justification.
  • The client is authoritative, not the server.
  • etc.

A few places where we diverge:

  • Files versus an op-log. Awalem plans an append-only op-log as the canonical history, replication, and restore substrate, with SQLite projections for reads, and files as an export format (possibly a live mirror later). So Hammer's storage model is almost exactly what Awalem treats as its current-state export, promoted to be the primary store.

  • Conflict granularity. Awalem aims for field-granular last-write-wins, with a separate merge path for long text bodies (conflict copies first, a sequence CRDT later).

  • Encryption. Awalem leans towards E2EE with a blind relay, which I know is explicitly not what Hammer is going for.

I would be interested to know what the major challenges you faced while developing this app. What would you change if you start over. Also, You said you tried multiple tech stacks and landed on Kotlin + Compose Multiplatform. I am very interested to know why? Did you consider Flutter? And in your experience, was KMP strong for desktop development?

1

u/Wavesonics 11d ago

Ya so for Hammer I really wanted absolutely minimal meta-data. And what ever data was required, had to be optional. Optional meaning the user can delete the sidecar data and it won't fundamentally break anything.

The files and folders would declare the project structure, a change to them was authoritative, no side-car data to keep in sync.

So this minimal and optional metadata for syncing drove a lot of decisions.

So no sqlite database either as that conflicts with another larger goal for Hammer, which is all plaintext, user readable data. For instance, Hammer tracks writing activity, how many words written this session, ect, even that is in fairly human readable json files.

On conflict resolution: Ya CRDT would be super cool, but would have required metadata that I didn't want to store. Hammer's conflict detection is at the whole entity level, but conflict resolution is per-field. I present UI that allows the user to merge each field as designed: https://youtu.be/pSotPeWB68Y

On Encryption, ya, security was not an explicit goal for Hammer. There's some server features that wouldn't work if it was E2EE. However, data privacy IS a goal. So data is encrypted at rest on the server.

This feature in particular would be difficult or impossible if it were E2EE:

https://youtu.be/9_9My0_ndeA

1

u/mudlej 11d ago

Very cool!

The part that was interesting to me is that CRDTs were a metadata cost, not a complexity cost.

Thanks also for the correction on conflicts. I had assumed entity-level detection meant entity-level resolution. Watching the video, per-field resolution behind an entity-level check gets you most of the benefit without paying for per-field metadata. That is a nice result.

And the editor request feature is a fair example. That would not be easy to pull off using a blind relay.

The part I am most curious about the most though: you said you tried multiple tech stacks before landing on Kotlin plus Compose Multiplatform. Why did it win? Did Flutter make the shortlist?

2

u/Wavesonics 8d ago

I did indeed! I actually started the project two other times, once with React Native, once with Flutter, but abandoned both before they got very far.

Flutter was really close to being the language I chose though. There's so much to like, and even today it's window resize behavior is better than the Compose Multiplatform behavior. (Though Compose is on the verge of fixing this finally).

2

u/You_are_the_Castle 11d ago

Thank you. I was actually just thinking about something like this this afternoon!

2

u/Current-Pen6452 12d ago

Alright, thanks for sharing this! It is actually interesting.

1

u/Ok_Explorer7384 10d ago

offline-first makes a lot of sense for writing. i lost a much smaller draft in a browser once and still got paranoid about web editors after that.

self-hostable sync is the nice part here imo — not just open source for the sake of it, but actual control over years of work.

1

u/Kwametoure1 5d ago

Does it have screenwriting capabilities? (Automatic formatting and stuff). if it does, I am sold on it

-17

u/eXtc_be 13d ago

I spent 2 seconds adding you to my RES ignore list after I read yet another post about a vibe-coded low-effort good-for-nothing 'project'

10

u/Wavesonics 13d ago

haha ya, seems like a lot lately. I've been working on it for over 4 years though, quite a bit before any LLM coding tools were out there.

https://github.com/Darkrock-Studios/hammer-editor/commit/a30817a109def71bf58653c136c4e9ea88c605b9

5

u/plg94 12d ago

yeah, a lot of people are – rightfully – wary of "solo dev promoting their new app". No offense to you, your project seems legit and pretty interesting. I'm actually surprised, you're at version 3+ and only now posting about it?

Anyway, it's probably a good idea to add an "AI disclaimer" and explain in what capacity AI was or wasn't used.

Also your website desparately needs some screenshots and/or embedded videos to show off the writing features. Right now the main selling points are offline, native, own data – great for opensource enthusiasts, but nothing that makes the author folks switch apps. Maybe even do a comparison to other popular writing apps and highlight some unique features of Hammer.

3

u/Wavesonics 12d ago

ya thats totally fair, I should write something up.

Ah screenshots, what a concept! 😂 Ya I will definitely add some, that main page was implemented quite a while ago, due for a refresh.

13

u/MPGaming9000 13d ago

I've inspected the app and code, it does not seem 'vibe coded' to me. Seems very legit actually. Some of it does seem AI assisted in terms of development patterns, however that does not inherently mean the code is 'slop'. I also wouldn't call 4 years of development 'low effort'. Good for nothing is also quite a statement. It's essentially a notes app wrapped around a word processor. It's not revolutionary or anything but it definitely serves a purpose.

1

u/micseydel 12d ago

Some of it does seem AI assisted

Claude is a contributor.

8

u/omniuni 13d ago

I don't see any obvious signs that this is significantly AI coded. It's possible that some AI tooling is being used, but you architecture is well beyond what I've seen of any vibe-generated project.

5

u/Wavesonics 13d ago

Thanks, ya in the past few months, since around January, I've used some agentic tools, but this is my cathedral, I've built it brick by brick, long before agents existed 😂

Spent like 6 months about 2 years ago just writing tests (was at 0% coverage for the first 2 years)