<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David Anyatonwu</title>
    <description>The latest articles on DEV Community by David Anyatonwu (@odogwu).</description>
    <link>https://dev.to/odogwu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4044439%2F4f380b41-ac16-405e-9fc5-ef238ae1f377.png</url>
      <title>DEV Community: David Anyatonwu</title>
      <link>https://dev.to/odogwu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/odogwu"/>
    <language>en</language>
    <item>
      <title>Launching Beacon: Durable Social Publishing You Can Trust</title>
      <dc:creator>David Anyatonwu</dc:creator>
      <pubDate>Mon, 27 Jul 2026 18:47:17 +0000</pubDate>
      <link>https://dev.to/odogwu/launching-beacon-durable-social-publishing-you-can-trust-2eh9</link>
      <guid>https://dev.to/odogwu/launching-beacon-durable-social-publishing-you-can-trust-2eh9</guid>
      <description>&lt;p&gt;Beacon is a social publishing workspace for individuals, teams, and agencies that need more than a simple “send post” button.&lt;/p&gt;

&lt;p&gt;Its purpose is straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Plan a post one time, publish with confidence, and keep each accepted delivery visible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That promise matters because social publishing is not a clean, predictable operation. Providers can reject requests, delay responses, or accept a post without returning usable publication evidence. Credentials can expire. Connections can fail after a provider has already published. If software responds by retrying blindly, the same content may be published twice.&lt;/p&gt;

&lt;p&gt;Beacon is built around those realities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Beacon is necessary
&lt;/h2&gt;

&lt;p&gt;Most publishing tools optimize for the happy path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a post.&lt;/li&gt;
&lt;li&gt;Select a destination.&lt;/li&gt;
&lt;li&gt;Choose a publication time.&lt;/li&gt;
&lt;li&gt;Send it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The difficult part starts after that sequence. Every accepted post target must remain visible and recoverable when an external provider becomes slow, unavailable, or uncertain.&lt;/p&gt;

&lt;p&gt;Beacon does not assume it controls a provider’s availability. Instead, it records durable evidence for each post target and handles uncertainty conservatively.&lt;/p&gt;

&lt;p&gt;The publishing foundation follows several trust-preserving rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL application tables are the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pg-workflows&lt;/code&gt; controls durable waits, recurrence, approvals, and outage recovery.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pg-boss&lt;/code&gt; controls bounded provider activities, concurrency, repair, and reconciliation.&lt;/li&gt;
&lt;li&gt;Provider adapters normalize limits, errors, and publication evidence.&lt;/li&gt;
&lt;li&gt;Beacon does not automatically repeat an uncertain external create operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That final rule is especially important. Suppose a provider receives a create request, publishes the post, and then the connection fails before Beacon receives a usable response. Automatically sending the request again might create a duplicate. Beacon preserves the uncertain result for reconciliation instead of pretending another attempt is always safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  A durable record for every destination
&lt;/h2&gt;

&lt;p&gt;A post sent to two social accounts is not one delivery operation. It is two independently observable targets, each with its own provider state and publication evidence.&lt;/p&gt;

&lt;p&gt;Beacon models that distinction directly. It keeps immutable post versions and tracks each accepted target until it reaches a visible terminal or recoverable state.&lt;/p&gt;

&lt;p&gt;This makes several operational questions answerable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which version of the content was scheduled?&lt;/li&gt;
&lt;li&gt;Which account was selected?&lt;/li&gt;
&lt;li&gt;When was that destination supposed to publish?&lt;/li&gt;
&lt;li&gt;Did provider dispatch begin?&lt;/li&gt;
&lt;li&gt;Did the provider return usable evidence?&lt;/li&gt;
&lt;li&gt;Is the result confirmed, recoverable, delayed, or uncertain?&lt;/li&gt;
&lt;li&gt;Can the operation be repaired safely without creating a duplicate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is not merely a calendar entry. It is an auditable delivery record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Beacon includes today
&lt;/h2&gt;

&lt;p&gt;Beacon already contains the foundation of a serious social publishing workspace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspace identity, brands, and connected channels.&lt;/li&gt;
&lt;li&gt;Encrypted provider credentials.&lt;/li&gt;
&lt;li&gt;Posts, immutable versions, and destination-specific targets.&lt;/li&gt;
&lt;li&gt;Media, approvals, audit data, webhooks, and entitlements.&lt;/li&gt;
&lt;li&gt;A publish-attempt ledger that records provider activity and evidence.&lt;/li&gt;
&lt;li&gt;Provider health, incidents, circuit breakers, and rate gates.&lt;/li&gt;
&lt;li&gt;A workflow outbox, repair jobs, and reconciliation paths.&lt;/li&gt;
&lt;li&gt;Conservative recovery for uncertain provider results.&lt;/li&gt;
&lt;li&gt;A mobile-first React application.&lt;/li&gt;
&lt;li&gt;Access, onboarding, channel management, composer, and Dayboard surfaces.&lt;/li&gt;
&lt;li&gt;Local and production Docker profiles.&lt;/li&gt;
&lt;li&gt;Repeatable interface fixtures with original post images and recovery states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Provider foundations include X publishing and OAuth, LinkedIn member publishing, WordPress Application Password publishing, and configurable support for additional providers such as Facebook, Instagram, Threads, DEV Community, and Medium.&lt;/p&gt;

&lt;p&gt;Provider availability is controlled by a deployment allowlist. Credentials can configure an enabled adapter, but they cannot activate a provider that the deployment has disabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for modern agent workflows
&lt;/h2&gt;

&lt;p&gt;Beacon also provides a remote Streamable HTTP MCP endpoint. This allows supported AI clients to work with a Beacon workspace through scoped OAuth access.&lt;/p&gt;

&lt;p&gt;The user does not paste a Beacon secret into a conversation. Instead, the client opens Beacon in a browser, the user signs in, selects a workspace, and approves the requested scopes.&lt;/p&gt;

&lt;p&gt;Beacon’s MCP read tools can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List connected channels.&lt;/li&gt;
&lt;li&gt;Retrieve a post and its targets.&lt;/li&gt;
&lt;li&gt;Inspect scheduled and recent targets for a calendar range.&lt;/li&gt;
&lt;li&gt;Retrieve a provider’s composition and publication contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write tools can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create drafts.&lt;/li&gt;
&lt;li&gt;Schedule posts through the durable publishing path.&lt;/li&gt;
&lt;li&gt;Generate shared or provider-tailored post options.&lt;/li&gt;
&lt;li&gt;Generate and store media when a compatible image model is configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Provider contracts are important here. An agent can retrieve the selected provider’s required fields, character limits, supported formatting, media rules, and writing profiles before attempting to create a post. That keeps provider-specific requirements explicit instead of relying on guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Immediate publishing requires real approval
&lt;/h2&gt;

&lt;p&gt;An AI conversation cannot approve its own immediate publication request.&lt;/p&gt;

&lt;p&gt;For an immediate post, Beacon returns a short-lived approval URL. Beacon then displays the exact content, selected channels, provider settings, and media to the signed-in owner. Only the recorded approval permits the same request to continue.&lt;/p&gt;

&lt;p&gt;Drafts and scheduled posts follow their respective durable paths, while immediate publication receives this additional safety boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-assisted composition without automatic publishing
&lt;/h2&gt;

&lt;p&gt;Beacon uses the Vercel AI SDK and AI Gateway to produce editable post options when AI composition is configured.&lt;/p&gt;

&lt;p&gt;A user can choose shared copy or tailor content by destination. Provider contracts give the composer the correct character limits, native writing style, and media requirements. For example, a short-form provider can receive concise copy while a professional network can receive a more structured version.&lt;/p&gt;

&lt;p&gt;AI generation does not schedule or publish anything by itself. An applied option updates the editor state, where the user can review and revise it.&lt;/p&gt;

&lt;p&gt;Beacon can also generate a media plan containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A visual concept.&lt;/li&gt;
&lt;li&gt;A recommended format.&lt;/li&gt;
&lt;li&gt;An aspect ratio.&lt;/li&gt;
&lt;li&gt;An image prompt.&lt;/li&gt;
&lt;li&gt;Alternative text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a compatible image model and private storage adapter are configured, the generated image can be stored as a workspace-private Beacon media asset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technology behind Beacon
&lt;/h2&gt;

&lt;p&gt;Beacon uses a focused modern stack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application runtime&lt;/td&gt;
&lt;td&gt;Bun 1.3.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Elysia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web&lt;/td&gt;
&lt;td&gt;React, Vite, TanStack Router, TanStack Query, and Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL 17 and Drizzle ORM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durable workflows&lt;/td&gt;
&lt;td&gt;pg-workflows 0.14.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activity queues&lt;/td&gt;
&lt;td&gt;pg-boss 12.25.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Better Auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local Node tooling&lt;/td&gt;
&lt;td&gt;Node.js 22.16.0 through NVM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A production installation has two required services: the Beacon application and PostgreSQL.&lt;/p&gt;

&lt;p&gt;The separation between durable workflows and provider activities is deliberate. Workflow timing retries are not the same as activity crash retries, and neither should be confused with repeating an uncertain external create operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering rules that protect user trust
&lt;/h2&gt;

&lt;p&gt;Beacon’s engineering boundaries are shaped by the cost of getting publishing wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not derive organization scope from a convenient default.&lt;/li&gt;
&lt;li&gt;Do not put secrets or raw provider response bodies in queues, workflows, attempts, logs, or customer APIs.&lt;/li&gt;
&lt;li&gt;Do not repeat a provider create operation after dispatch may have started.&lt;/li&gt;
&lt;li&gt;Keep workflow timing retries separate from activity crash retries.&lt;/li&gt;
&lt;li&gt;Keep immutable post versions and provider-attempt evidence.&lt;/li&gt;
&lt;li&gt;Track every accepted post target until it has a visible terminal or recoverable state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not cosmetic architecture decisions. They make the system explainable when a provider behaves unexpectedly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why durable publishing matters
&lt;/h2&gt;

&lt;p&gt;Publishing is a trust-sensitive workflow.&lt;/p&gt;

&lt;p&gt;A missed scheduled post matters. A duplicate post matters. A post marked as published without evidence matters. An unexplained provider failure matters. A recovery operation that creates a second public post matters.&lt;/p&gt;

&lt;p&gt;Users should be able to see what Beacon attempted, what the provider confirmed, and what remains uncertain. Operators should have enough durable evidence to repair failures without guessing.&lt;/p&gt;

&lt;p&gt;That is the problem Beacon is designed to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;Beacon is in active development and should not yet be used for a public production launch.&lt;/p&gt;

&lt;p&gt;Provider checks, security work, failure tests, load tests, and operations tests remain release requirements. The repository’s engineering handover records the implementation inventory, known gaps, verification evidence, and recommended work.&lt;/p&gt;

&lt;p&gt;The existing foundation is substantial: durable scheduling, provider health, post targets, approvals, media handling, channel management, AI composition, recovery states, and MCP access.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The next phase focuses on hardening and verification:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expand provider checks.&lt;/li&gt;
&lt;li&gt;Complete security and failure testing.&lt;/li&gt;
&lt;li&gt;Run load and operations tests.&lt;/li&gt;
&lt;li&gt;Strengthen repair and reconciliation paths.&lt;/li&gt;
&lt;li&gt;Improve deployment and recovery evidence.&lt;/li&gt;
&lt;li&gt;Continue refining the composer, Dayboard, and failure-recovery experiences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beacon’s goal is not merely to publish content. Its goal is to make publishing auditable, recoverable, and safe.&lt;/p&gt;

&lt;p&gt;If you have ever wondered whether a scheduled post actually went out, whether retry logic might duplicate it, or whether your publishing tool can explain what happened during a provider incident, Beacon is being built for that exact problem.&lt;/p&gt;

&lt;p&gt;Plan once. Publish with confidence. Keep every accepted delivery visible.&lt;/p&gt;

&lt;p&gt;That is Beacon.&lt;/p&gt;

</description>
      <category>product</category>
      <category>saas</category>
      <category>software</category>
      <category>startup</category>
    </item>
    <item>
      <title>A befitting title</title>
      <dc:creator>David Anyatonwu</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:43:12 +0000</pubDate>
      <link>https://dev.to/odogwu/a-befitting-title-381n</link>
      <guid>https://dev.to/odogwu/a-befitting-title-381n</guid>
      <description>&lt;p&gt;A befitting body for a post&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A befitting title</title>
      <dc:creator>David Anyatonwu</dc:creator>
      <pubDate>Thu, 23 Jul 2026 20:20:44 +0000</pubDate>
      <link>https://dev.to/odogwu/a-befitting-title-127e</link>
      <guid>https://dev.to/odogwu/a-befitting-title-127e</guid>
      <description>&lt;p&gt;This is post will be made to both devto accounts. Hopefully. This is special to odogwus account&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
