After last week’s interview, I’m starting to play around with Racket as a new publishing outlet. Here’s a new short clip about building a better web by first giving people a choice — inspired by Team Human, a book I’m about half-way through right now:
An idea occurred to me last month. All along, I’ve been pursuing this idea of “separate but connected apps.” But as I’ve started implementing them, and later with the release of WriteFreely, I’ve had to change my view on what that “connected” part meant. It turns out that they need to be not just connected, but highly integrated in some important ways, if I want to give people the best experience.
An easy example is the photo upload feature in our Classic editor. Previously you had to switch apps to upload a photo, then switch back to insert it into your blog post. Now it’s a part of the Write.as interface, and seamlessly powered by Snap.as behind the scenes. You don’t even have to know Snap.as exists to use it — but if you do, you can do things like manage your photos through this separate tool. Maybe that’s where the separation actually makes sense.
So this idea I had was: some sort of unifying interface. Open it and decide whether you’re writing (Write.as) or uploading photos (Snap.as) or reading (Read Write.as) or checking your inbox (Remark.as). Each action points you to the correct product, and each product contains elements of the others, where it makes sense. For anyone fully utilizing our ecosystem, this could fit them best, while not disturbing those who just need one tool or the other. Importantly, the model could also fit WriteFreely, so it’s no longer just a blogging platform, but actually a multi-application tool (kind of like Phabricator).
At the end of the day yesterday, I added another layer of spam prevention to user registrations, powered by Akismet. Over the last 15 hours, it’s blocked 18 bot signups that slipped through our own filters (which blocked 587 bots over the same time period).
To implement this, I forked a Go library for the Akismet API, and updated it with Go module support, unmerged PRs, docs improvements, and tagged releases. Soon, I’ll also add this spam prevention to WriteFreely — I think many open instances will appreciate it.
Continuing yesterday’s work on “outside contributors,” some new perspectives:
Now, there are three “person” concepts in Write.as: User, Team Member, and Author. The first two, User and Member, are private structures that primarily hold permission data and contextual settings (User: password + email for the platform; Member: role + email for the team).
An Author, however, is a public structure meant to hold publicly-known information, like a bio and post authorship. Most blogging platforms don’t make the distinction between an Author and a User like this. But this allows us to minimize data collection and eliminate unnecessary work for writers (a single-user blog doesn’t really need an author bio, because the blog is the bio).
I often think of our UX like various gentle slopes of increasing friction and weight — from simplicity to complexity, or zero to full data collection. With this new user structure, we can maintain a gentle slope from writing alone to writing with others. The experience for a single blog author doesn’t change at all — the added work only shows up at the precise moment someone decides they want to write with others, and specifically, that they want some kind of public authorship known to readers (that is, we’ll still enable you to have a multi-author blog that conceals the identity of individual writers).
Working on an “outside contributor” role for Write.as Teams that’ll support the new concept of an Author.
With multi-user blogs, the past idea of a [Write.as User] or [Team Member] as Post Author doesn’t fit quite right. We want to attribute posts to certain authors, but be able to revoke their publishing privileges if they leave the team. We also want to support Post Authors that aren’t necessarily regular contributors, and don’t need an entire Write.as account. So we need a new abstraction — and this lays the groundwork for that.
The only trouble so far, technically, is squaring our previous concept of one Post to one User with this new level and relationship: one Post to one-plus Authors (each the parent of zero-or-one User).
Doing a small experiment with alternative blog views this afternoon, as a study for a future upgrade to #WriteFreely’s theming abilities.
Originally inspired by “text-only” versions of news sites, plus a bit of Midnight.pub and Bear Blog, this one maintains consistent navigation between the index and post pages, and shows only the post title + dates on the index:
The design here is inspired by Riley’s theme. Titles are inferred from the post body when none is given, or changed to (Untitled) when none can be inferred. And of course it respects the chosen Blog Format, so you can hide dates or change the order of posts.
Besides helping me figure out what common backend elements we might need across themes, this is giving me a chance to see how we might simplify the base blog CSS and possibly restructure the HTML to improve accessibility.
I could also see this being useful for people who want to give their readers a lightweight way to read their blog (without a ton of CSS or custom fonts). So I might add it to Write.as Labs as an alternative way to access Write.as blogs once it’s looking solid.
Reading a forum thread about professional themes on Write.as, I’m mentally at an interesting fork in the road: cater to the people who make things for the love of it, or to those who do it as the means to some professional end?
I think there’s a middle road to take, somewhere in there.
So far, I really built Write.as for the casual writers and people who make things for no reason other than they love to. It’s pure, it’s simple; it’s the reason I personally write — and I think raw, human writing comes from people who do it for the same reasons.
The same goes for digital aesthetics — there’s a place for beautiful design, and there’s a place for raw creative output. One isn’t necessarily “better” or more “right” than the other in all cases, for all people. They’re just different, like the country vs. the city.
This platform’s growth (in all meanings of the word) depends, in part, on catering to some kind of “professional” user class. But instead of swinging us over to stodgy, uptight professionalism, I intend to keep the product in that gray area between hobby and profession, amateur and expert, as much as possible. The line between these categories is truly blurry, when you look at it. So why should our creative tools be drawing it for us?
Went back to the gym today, for the first time in over a year and a half. I’ve been slacking on my health throughout the pandemic, letting up on my cleaner diet, giving into the social pressures to drink and eat whatever is around. I suppose it gave me several months of carefree socialization; time with people I wouldn’t otherwise see. But it hasn’t improved much for me personally, besides serving as another reminder that I need to take these “breaks” from disciplined habits very rarely, and spend much more time taking care of my breath, my weakening wrists, my slowly ballooning midsection. For now, I’m satisfyingly exhausted — and ready for more.