Recommended Free Tools
iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
The safest way to republish a DEV.to tutorial on Medium is to import it as a draft, then compare the Medium editor with the published DEV.to source before you publish anything. The browser workflow described by the open-source publish-agents project can automate the repetitive import, but it cannot prove that headings, code fences, links, metadata, or images survived unchanged.
Use automation to create a starting draft, not as a substitute for editorial verification. This guide covers the prerequisites, the documented medium-publisher setup, the publish-devto import route, a block-by-block formatting check, repair and recheck procedures, and the rights and canonical-URL decisions that should happen before publication.
What you need before starting
Prepare these items before opening the terminal:
- A published DEV.to tutorial whose URL is publicly accessible. The import method reads the public article through DEV.to’s API; it is not designed to retrieve a private draft.
- A Medium account that is able to create stories and leave the imported story unpublished while you review it.
- Node.js 20 or newer.
- A terminal that can run npm commands and the browser-installation step required by the package.
- The rights to republish the article and its images, code, screenshots, and other embedded material.
Keep the DEV.to article open in a separate browser tab. You will use it as the source of truth while checking the Medium draft, rather than trusting an import summary.
Free tools Windows power users keep installed
One-click scans. No signup required.
Why the first Medium version should remain a draft
A successful import only means that the automation reached Medium and inserted content. It does not establish that Medium rendered every block as the source author intended. A draft gives you a reversible checkpoint: you can inspect the editor, correct a local problem, and decide whether to publish only after the comparison is complete.
#1 Best Overall
The tutorial behind this workflow describes Medium-specific behavior through its import route and editor interaction. Medium’s interface and import behavior can change, so treat button names, page locations, and editor responses as changeable implementation details. If the editor no longer matches the documented flow, stop the automated sequence and inspect the story manually instead of allowing it to publish blindly.
Set up the documented browser-automation example
The tutorial uses the open-source publish-agents project and its medium-publisher package. It references release v0.2.3; use that as a dated example from the tutorial, not as a promise that it is the newest release when you follow the guide.
- Install or verify Node.js 20 or later, then make sure npm is available in the same terminal.
- Follow the tutorial’s setup instructions to obtain the
publish-agentsproject, build the@paladini/medium-publisher-mcppackage, and link it as documented there. Do not substitute an unbuilt package if the tutorial’s workflow expects the local build. - Run the package’s interactive login flow. Complete the sign-in in the browser window it opens and allow the tool to save the browser session. The saved session is what lets later runs reach the Medium editor without repeating the entire sign-in process.
- Confirm that the browser can open both the public DEV.to article and the Medium story editor before starting an import.
The release number and package names identify the tutorial’s example. They do not guarantee compatibility with a later Medium interface, a different Node.js version, or a changed login flow.
Import the DEV.to article without publishing it
Use the tutorial’s publish-devto route for the actual transfer. In the described sequence, the route reads the public DEV.to source through the DEV.to API and then opens Medium’s import route. Select the draft behavior so the resulting story stays unpublished.
- Provide the public DEV.to article URL to the
publish-devtoworkflow. - Choose the option that creates or leaves the Medium story as a draft. If the current interface offers a publish action beside the import action, do not select it.
- Wait for the browser automation to finish inserting the title, body, and available metadata.
- Open the resulting story in Medium’s editor and keep that editor window available for the verification pass.
Do not treat the end of the automation run as the end of the job. The important work begins when the draft is visible: compare the actual editor blocks with the source article.
Run a block-by-block formatting check
Read the DEV.to page and the Medium draft in parallel. Check the following in order; this sequence catches structural errors before you spend time polishing metadata.
1. Title and opening text
- Confirm that the Medium title has the same meaning and wording as the DEV.to title.
- Check that no Markdown markers, HTML tags, or escaped characters appear in the title field.
- Compare the first paragraph and any introductory subtitle. A subtitle that was present on the source should not be silently replaced by an unrelated sentence.
2. Heading hierarchy
Scroll through the source and match every section heading to the corresponding Medium heading block. A heading should render as a heading, not as literal text containing Markdown symbols. DEV’s editor documentation supports Markdown heading levels 1 through 6 and recommends beginning article sections at level 2 because the article title already functions as level 1. Preserve that outline when you inspect the destination.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
- Check that each section starts at the intended level.
- Look for a heading that was converted into a paragraph or bold text.
- Look for a run of headings whose levels were flattened or shifted.
- Verify that a code sample or list was not accidentally absorbed into the preceding heading block.
3. Code blocks and language labels
Code is the highest-risk part of a technical tutorial because a damaged fence can change several blocks at once. Compare every fenced example with the source.
- Make sure each example is one continuous code block, with no explanatory paragraph inserted in the middle.
- Check the first and last lines of every block for missing or extra characters.
- Confirm that the language label, when supplied by the source, is still associated with the block.
- Inspect the content immediately after the first code block. Fence damage often becomes visible when the next paragraph, list, or second code sample is merged into the wrong block.
- Compare indentation, punctuation, shell prompts, and quotation marks; these can change meaning even when the block looks visually similar.
4. Lists, links, and paragraph order
Read the article from top to bottom rather than checking only whether all words appear somewhere. Verify that ordered steps remain in sequence, unordered lists retain their bullets, and nested items remain attached to the correct parent.
- Open representative links and compare their destinations with the DEV.to source.
- Check that link text was not separated from its link or converted into a raw URL.
- Look for a paragraph moved above or below a list, image, or code block.
- Check block quotations, emphasis, and inline code for accidental loss of formatting.
5. Images and hero artwork
Compare every image, not just the cover image. Confirm that the hero image is the intended asset, that inline images appear in the right location, and that captions or surrounding explanatory text remain attached to the correct image. An imported image can look present while still pointing to an unexpected or inaccessible source.
6. Metadata and topics
- Check the subtitle, if the story uses one.
- Review topics or tags for relevance and spelling.
- Remove any value that looks private, secret-like, or environment-specific. A public tutorial should not expose a token, private endpoint, local file path, or unpublished URL merely because it was present in an imported field.
- Confirm that the story’s publication state is still draft.
Repair only the localized problem, then recheck
When the comparison finds a mismatch, make the smallest repair that restores the source structure. For example, replace one malformed code block instead of reformatting the entire article, or restore one missing heading level instead of changing every heading.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitches- Record the exact source block that differs from the draft.
- Apply the correction in Medium’s editor.
- Save the draft and run the extraction or checking step again if the tutorial’s workflow provides one.
- Compare the repaired block and its neighbors with the DEV.to source.
- Stop for manual inspection if the editor layout has changed, the repair does not match the source, or a second issue appears in an unrelated block.
A check that passes after one repair proves only that the inspected draft now matches your source in those locations. It does not prove that a future import, a different article, or a later Medium editor version will preserve every detail.
Rights and canonical URLs before publication
DEV Community’s official writing help says authors may cross-post work from a blog or Medium “as long as you have the rights you need to do so.” Apply that rule in both directions: verify that you own or are licensed to republish the DEV.to tutorial and every asset it contains, and do not assume that a public URL grants permission to copy someone else’s work.
Decide which page should be treated as the canonical original before publishing the Medium story. The canonical destination should identify the intended original version, not an accidental redirect, a staging page, or an outdated URL.
DEV’s controls depend on the editor and import method:
| DEV.to workflow | Where the canonical value is controlled | Related behavior |
|---|---|---|
| Rich + Markdown editor | Canonical URL field in the gear/settings area | Set it to the intended original URL before publishing. |
| Basic Markdown editor | canonical_url in front matter |
Keep the field’s URL aligned with the original version. |
| RSS or Atom import | Canonical-source setting in RSS import configuration | When enabled, the feed link is mapped into canonical_url. |
These DEV settings matter when you later move or syndicate content through feeds. DEV’s RSS workflow converts feed HTML to Markdown, uses the first four feed categories as tags, and maps the feed link to canonical_url only when the canonical-source setting is enabled. That conversion path is separate from the browser import described above, but it explains why a feed-based copy can differ from the original editor output.
Manual import versus browser automation
Choose the method based on how often you republish and how much review you can provide. The comparison below describes workflow trade-offs, not measured performance results.
| Criterion | Manual copy and import | Browser-automation workflow |
|---|---|---|
| Draft control and human review | Human control is present throughout; it is easy to leave the story unpublished. | Strong when the draft option is selected, but the operator must verify that the automation did not reach a publish action. |
| Code and heading fidelity | Depends on careful block-by-block pasting and editor knowledge. | Provides a repeatable starting point, yet still requires inspection of fences, levels, and ordering. |
| Metadata visibility | Every field is entered or checked directly. | Imported fields are convenient but can hide stale, private, or misplaced values until reviewed. |
| Sensitivity to platform changes | Less dependent on selectors, but manual instructions still change when the editor changes. | More sensitive to Medium UI changes, login changes, and altered import behavior. |
| Repair and recheck effort | More initial labor, with no automated extraction step. | Less repetitive work when it succeeds; a failed or changed flow requires manual takeover and a fresh comparison. |
For an occasional article, manual transfer may be simpler than maintaining a browser setup. For a series of similar tutorials, automation can reduce repetitive work as long as every story remains a draft until the same verification checklist is complete.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Troubleshoot common failure modes
The package cannot start
Verify Node.js is 20 or newer, npm is available, and the package was built and linked exactly as the tutorial specifies. A missing browser installation or a failed local link can look like an import problem even though the editor was never reached.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchLogin repeatedly appears
Run the interactive login again and allow the browser session to be saved. If the browser profile was moved, deleted, or blocked from writing, the tool may have no usable session on the next run.
The source article cannot be read
Open the DEV.to URL without authentication and confirm that the article is published and publicly reachable. The described route relies on the public source and will not solve a private-page permission problem.
The story publishes unexpectedly
Stop using the automated flow until you identify which option triggered publication. Reopen the Medium editor manually, verify the story state, and make draft creation an explicit step on the next run. Never assume that a prior draft choice remains selected after a UI change.
Headings or code are malformed
Do not repair the entire article by repeatedly reimporting it. Identify the first divergent block, correct it locally, and compare the surrounding blocks again. If the editor has changed enough that selectors or block behavior are unclear, finish the review manually.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Metadata contains an unexpected value
Remove the value from the draft, then check the DEV.to source and the automation inputs for a private URL, token-like string, local path, or stale topic. Review the final story fields once more before publication.
Best Value
Accessibility and maintenance checks
Use useful alt descriptions for images and keep a clear heading outline on DEV.to, as recommended in DEV’s editor guidance. Those practices also make the Medium copy easier to navigate, even when the two editors expose different controls.
Keep a short record of the package release used, the date of the import, and any manual corrections. This is not a guarantee of reproducibility, but it makes a later discrepancy easier to diagnose when Medium changes its editor or the automation package changes its behavior. Re-run the full comparison for every article; do not assume that a previous successful import establishes a permanent compatibility guarantee.
Frequently asked questions
Can I publish the Medium story immediately after the import finishes?
No. The workflow is intentionally draft-first. Publication should follow the title, structure, code, links, images, metadata, rights, and canonical checks.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Does the import preserve every Markdown feature?
It may preserve much of the article, but the tutorial does not claim proof that every detail will survive. Verify the rendered Medium blocks against the DEV.to source, especially code fences and heading levels.
Is release v0.2.3 guaranteed to be current?
No. It is the release referenced by the tutorial. Check the project’s current instructions when you run the workflow and treat any version difference as a possible compatibility change.
What should I do if Medium’s interface no longer matches the tutorial?
Pause the automation, leave the story unpublished, and inspect the editor manually. Continue only when you can identify the draft and verify each imported block without relying on an outdated selector or screen sequence.
Does a public DEV.to URL prove that I can republish the article?
No. DEV Community permits cross-posting when you have the rights needed to do so. Confirm rights for the text, code, images, and any third-party material before copying it to Medium.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

