Micro Matt

Micro thoughts and mini posts.

I’ve had a lot of trouble modeling the Team Member / Author roles I recently came up with to support everything we need to on collaborative blogs. Unlike Users, Posts, and Collections (blogs) that I can understand from one perspective, these new concepts need several perspectives to fully understand (and model correctly). At this point, I think I’ve finally worked it all out:

From a data perspective, these are distinct objects with a one-to-one relationship. A Member is (aside: always backed by one User, and) always associated with one Author — but an Author can exist without an associated Member (if the Member was removed from the team, the User was deleted, or it’s an outside collaborator).

From a user management perspective, team admins will always interact with either a Member-Author or just an Author object. But the complexity will be hidden and they’ll look the same to the end user — just in different states, really.

From a user (writer) perspective, a team writer will always interact with an Author object. They’ll only be concerned with who is authoring a post.

#dev #teams #authors

Author functionality is coming along! Now it’ll optionally display at the top of a post, if it has one or more authors set.

A screenshot of a new Write.as post, under the title it says 'By Matt Baer', followed by the date.

#dev #teams #authors

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:

Building a better web: first, giving people a choice

#audio #reading #web

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).

#suite #studio #WriteFreely #snapas #remarkas

This morning I chatted with Matthew Guay on Racket (a cool short-form audio service) about WriteFreely and what kinds of things I’m hoping to solve with it. You can listen to the 9-minute talk here:

“The WriteFreely story.”

#WriteFreely #audio #origins

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.

#dev #spam

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).

#dev #teams #ux

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:

A screenshot of a test blog home page, with simple text, headers, and links.

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.

Screenshot of an individual post, with a consistent header and the post title / date / body below.

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?

Enter your email to subscribe to updates.