ReviewOS

stacks/postline

The Open Times publishing: verify what ships, and add short-form as a real post type

#41
Open glennmichael123 opened this 9 days ago ·
9 days ago

Corrected after finding the code. This issue originally read as a greenfield build. It is not: The Open Times is this repo (Postline was renamed), and most of what the checklist asked for already ships. Rewritten to cover the gaps instead, so nobody rebuilds working features.

What already exists

Models: Publication, PublicationTier, PublicationSubscriber, PublicationSend, PublicationRecommendation, BlogPost, PostComment, DiscoverEntry.

BlogPost already carries title, slug, body, excerpt, status, access and previewChars — so paywalled posts with a free preview are modelled.

Actions under app/Actions/OpenTimes/:

AreaActions
PublicationPublicationGetAction, PublicationSaveAction
SubscribersSubscribeAction, SubscriberConfirmAction, SubscriberUnsubscribeAction, SubscribersListAction, ImportSubscribersAction
PaidCheckoutAction, StripeWebhookAction, TierSaveAction, TiersListAction, TierArchiveAction
Email sendsSendQueueAction, SendsListAction
CommentsCommentPostAction, CommentsThreadAction, CommentModerateAction, CommentQueueAction
DiscoveryDiscoverFeedAction, DiscoverReadAction, DiscoverEntryStatusAction
ImportImportPostsAction
Public readingPublicPostAction

Views: publication.stx, read.stx, discover.stx, inbox.stx, blog.stx. The marketing site already sells /features/publications, /features/newsletter, /features/paid-subscriptions, /features/discover, /features/comments, /features/import.

Double-opt-in is wired (/subscribe, /subscribe/confirm, /subscribe/unsubscribe, rate limited in routes/api.ts:112-114).

So the newsletter-competing half of the original checklist is built.

What is actually missing

  • Short-form as a first-class post type. BlogPost has no kind/format discriminator — every entry is a long-form post with a title and slug. Chris asked for short form too, and a news front page needs short items (a link with commentary, a quote, a correction) that are posts in their own right, not stubs with empty titles. This is the one real schema gap.
  • An edited front page. DiscoverEntry drives discovery, but there is no lead item / secondary ordering / pinning for the publication's own front page.
  • Open and click stats on sends. PublicationSend records the send; confirm whether opens/clicks are tracked, or decide explicitly not to.
  • Sections or desks, so short items group into something followable.
  • Corrections recorded rather than silently edited, with the updated timestamp shown.

What to verify rather than build

  • Run one post end to end: write → paywall preview → publish → email send → a subscriber reads it at a public URL → comment → appears in Discover
  • ImportPostsAction / ImportSubscribersAction against a real Substack export
  • CheckoutAction + StripeWebhookAction against Stripe test mode: subscribe, upgrade tier, cancel, and confirm access gating actually gates

Timing

Chris asked for the app finished and usable this week, publishing from next week. Given how much is already built, the honest version of this issue is a verification pass plus the short-form gap — not a build.

Sign in to comment on this issue.