Destinations
X and LinkedIn
One review queue, with publishing behavior that respects each channel.
Deep-dive case study
Nothing reaches a public account without a person reviewing it and choosing to publish. This dashboard turns AI-generated candidates into a clear, human-owned queue for X and LinkedIn.
It is also built for the uncomfortable moment when a system crashes or times out. A second run cannot send the same thing twice, and an uncertain result tells your team what to verify before they try again.
At a glance
The dashboard is not the generator. It is the dependable place where a suggested post becomes reviewed, confirmed, and traceable public work.
Destinations
X and LinkedIn
One review queue, with publishing behavior that respects each channel.
Human approval
Required
Nothing reaches a public account until a person reviews the words and chooses publish.
Reliable record
Neon-backed
Every post keeps its draft, review, status, error, and confirmed destination history.
Scheduled intake
Daily sync
A protected routine checks for new source content at 09:00 without blocking the review screen.
The problem
A good draft can still lose its review decision in a chat thread or inbox.
A timeout at the send step creates the worst ambiguity: the post may already be public.
Multiple tabs, background checks, and external responses can compete to change the same post.
The approach
The dashboard keeps an operational record separate from the generator.
A person edits and explicitly starts a channel-specific publish action.
The public result counts only when the destination confirms it with a real link.
What your team experiences
AI can make the first draft faster. Your team still has a calm, visible process for deciding what represents the business publicly—and for knowing exactly what happened when a channel has a problem.
The lifecycle
A post moves through a small set of durable states. The labels show whether it needs review, has one send underway, is confirmed, needs recovery, or was deliberately set aside.
pendingNew content waits in the active review queue. It is a candidate, not an approval.
postingThe system temporarily gives one publish attempt ownership, so another tab cannot send the same post too.
postedThe record changes only after the publisher returns the actual destination link.
failedThe draft and review work remain available, together with a message explaining what to check before retrying.
skippedA person can remove an item from the active queue without losing the record of that decision.
The Neon-backed lifecycle is pending, then posting, then posted, with failed and skipped as durable alternate states. The active publishing backlog uses pending; it does not invent an invisible approval record.
reviewed_text is stored separately from the generated draft. It is promoted to the recorded published copy only after the publisher confirms a destination URL; a confirmed posted record is terminal and later synchronization cannot downgrade it.
A reviewer can skip a pending item, preserving that local decision unless a later upstream response confirms the item actually published. The saved ledger includes status, created and updated times, sent and posted times, error text, and live destination URLs.
How it works
Every step spells out who owns the work, what gets saved, and what the system does when a channel does not respond cleanly.
When
A daily schedule, a refresh action, or a background check finds source content.
What happens
The dashboard shows its saved queue first, then looks for new material in the background.
Your result
Reviewers can keep working even when the content source is slow.
If something goes wrong
A source problem cannot erase or hide posts already saved for review.
When
A source post arrives from the shared content service.
What happens
The system matches the source item to one durable record and refreshes only what is safe to refresh.
Your result
One post retains its draft, edits, status, links, and useful context across repeated checks.
If something goes wrong
A partial source response cannot wipe details that the dashboard already knows.
When
A reviewer opens an item that is ready or needs another attempt.
What happens
The reviewer can change the proposed copy, check it for the selected channel, and save that review work before any public action starts.
Your result
The final words are human-owned and survive a refresh or later retry.
If something goes wrong
An old browser view cannot save over a post that has already moved into an active send.
When
A reviewer presses the publish control.
What happens
The system checks access and target, then records that one send owns this post before making an outside request.
Your result
A double-click, second browser, or overlapping sync cannot create a second send.
If something goes wrong
A competing publish attempt gets a clear conflict instead of releasing duplicate content.
When
The channel publisher replies with a successful destination URL.
What happens
The dashboard records the URL and time, then promotes the reviewed words into the recorded published copy.
Your result
A published status means a real public destination was confirmed, not merely that someone clicked a button.
If something goes wrong
A timeout or server problem is preserved as an uncertain failure and asks the reviewer to verify the account before retrying.
When
A channel callback or companion destination reports an outcome.
What happens
The system checks the response before recording it and keeps distinct destinations in their own fields.
Your result
A team can see what happened on X and LinkedIn without confusing a company page, article, or thread.
If something goes wrong
Unexpected callback data has no shortcut into a confirmed public state.
The important promise
The system never treats a button click as proof of publication. It waits for the public destination to confirm success, and it refuses to let a crash or second run silently create the same public post twice.
The publish route confirms authorization, validates the selected target, and atomically changes only pending or failed rows to posting before the outbound request begins. This atomic claim prevents another browser or concurrent sync from releasing the same draft.
The exact reviewed copy is passed to the corresponding channel publisher. Before a review save or publish is accepted, the dashboard validates non-empty text and the selected channel character limit. A second publish request receives a conflict. Saving review text accepts only pending or failed rows, and a stale client cannot save into a row that has moved out of a reviewable state.
The record behind the queue
A content generator is good at creating candidates. It is not automatically a trustworthy record for editorial decisions, public confirmation, or recovery from a network problem.
The same item remains traceable across intake, review, a failed attempt, recovery, and later reporting.
The dashboard shows what is waiting, sending, confirmed, failed, or intentionally skipped from saved records—not from a temporary browser view.
The review version is protected until a real publish confirmation arrives, so uncertainty cannot overwrite the original record.
If draft content changes, the system knows that earlier publishing advice may no longer fit.
A company-page post, an article, and a companion thread can each keep their own evidence.
The system records what was already written back to connected operations, avoiding repeated side effects during a retry.
The posts table uses post_id as its primary key. Sync uses post-ID upserts plus a SHA-256 content hash built from the channel and draft payload. The hash invalidates cached publishing-insight fields only when draft text, thread, or article content changes, so advice does not pretend to describe a different draft.
The update preserves terminal posted records, posting work, saved review work, in-flight research, and non-null enrichment fields when incoming data omits article, media, organization, or publishing information. Writes are batched to the database pool size, and downstream bookkeeping markers and attempt counts make write-back idempotent.
How the pieces fit together
Review experience
People see reviewable work and its status before they are asked to take a public action.
Durable record
The publishing history remains available when a browser, generator, or remote channel has a temporary problem.
Content intake
Generation stays separate while the dashboard owns review status and publishing evidence.
Destination controls
Each network gets the handling it needs without turning every post into an ad hoc manual process.
The review experience is built with Next.js and React, channel tabs, category groups, and a draft-rewrite workspace. The durable record uses Neon Postgres, a typed ledger model, post-ID upserts, and status indexes.
Content intake uses the shared skills API, a protected sync route, content hashing, and a Vercel Cron entry that calls the sync route daily at 09:00. X and LinkedIn use channel-aware publishing routes with validated callbacks.
Safeguards
A publish button is the last step, not the first. The software protects reviewed work, prevents duplicated intent, and makes uncertain remote outcomes visible.
Intake, edit, publish, skip, and external confirmation routes check permission before changing the saved record.
An action is accepted only when the post is in the right state, preventing an outdated tab from undoing in-progress work.
A late source update cannot quietly put a confirmed public post back into the active queue.
If a public channel times out or returns a server error, the reviewer keeps the draft and gets a verify-before-retry message.
The system validates the configured target and key details from external responses before it calls a post successful.
A background refresh preserves confirmed, in-progress, reviewed, and enriched information when the incoming source has less detail.
Why this is safer
If the channel does not answer cleanly, the dashboard does not guess. It keeps the exact review work, marks the attempt as recoverable, and tells the person to verify the destination before attempting another send.
The publish route gives the channel publisher room to respond, but a timeout or server-side outcome becomes a recoverable failed record carrying a verify-before-retry message. The reviewed text remains available; the system never silently assumes the post did not publish.
Callback handling validates the post, channel, destination URL, and timestamp before accepting outside evidence. LinkedIn organization-page publishing is tracked separately from the profile result, while native articles keep their own URL alongside companion-thread outcomes. X single-post mode and LinkedIn publishing each use channel-aware handling. Unexpected callback data has no free path into a published state.
What it replaces
Before
AI-generated drafts are scattered across email, chat, and temporary service responses.
After
One durable queue keeps the draft, human edit, status, error, timestamp, and confirmed destination together.
Before
A team can approve copy in theory but still lose the exact version that was intended to publish.
After
The reviewed version is stored separately and becomes the recorded published copy only after a confirmed public result.
Before
A network timeout leaves people guessing whether they should press publish again.
After
The record retains the review work and tells the reviewer to check the account before a safe retry.
Before
Repeated refreshes or extra browser tabs can overwrite decisions or send duplicate content.
After
Protected matching, in-progress claims, and confirmed-state protection make repeat runs safe by design.
What this means for your business
Every technical term used on this page, explained without jargon.
Need an AI-enabled workflow that stays human-owned?
Turn generation into a clear operating process with durable records, thoughtful recovery, and an explicit human decision before anything goes public.