md2linkedin 
md2linkedin converts Markdown text to LinkedIn-compatible plain text
by replacing bold, italic, and bold-italic markers with Unicode
Mathematical Sans-Serif characters. This preserves visual formatting
when pasting into platforms like LinkedIn that do not support Markdown
natively.
Installation
| Package Manager | Installation Command |
|---|---|
| pip | pip install md2linkedin |
| uv | uv add md2linkedin |
Tip: Run the CLI without installing it with
uvx md2linkedin post.md.
Usage
Python API
# @pyodide
from md2linkedin import convert
md = """
# Exciting News
I'm thrilled to share that **we just launched** a new product!
Key highlights:
- **Performance**: *3x faster* than the previous version
- **Reliability**: ***zero downtime*** deployments
- **Developer UX**: clean, intuitive API
Check it out and let me know what you think.
"""
print(convert(md))
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
𝗘𝗫𝗖𝗜𝗧𝗜𝗡𝗚 𝗡𝗘𝗪𝗦
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
I'm thrilled to share that 𝘄𝗲 𝗷𝘂𝘀𝘁 𝗹𝗮𝘂𝗻𝗰𝗵𝗲𝗱 a new product!
Key highlights:
• 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲: 3𝘹 𝘧𝘢𝘴𝘵𝘦𝘳 than the previous version
• 𝗥𝗲𝗹𝗶𝗮𝗯𝗶𝗹𝗶𝘁𝘆: 𝙯𝙚𝙧𝙤 𝙙𝙤𝙬𝙣𝙩𝙞𝙢𝙚 deployments
• 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿 𝗨𝗫: clean, intuitive API
Check it out and let me know what you think.
CLI
# Convert a Markdown file (output: post.linkedin.txt)
md2linkedin post.md
# Specify output path
md2linkedin post.md -o linkedin_post.txt
# Pipe from stdin
echo "**Hello**, *world*!" | md2linkedin
# Keep link URLs in the output
md2linkedin post.md --preserve-links
# Disable monospace code rendering
md2linkedin post.md --no-monospace-code
Key Features
- Bold:
**text**or__text__→ Unicode Sans-Serif Bold (𝗯𝗼𝗹𝗱) - Italic:
*text*or_text_→ Unicode Sans-Serif Italic (𝘪𝘵𝘢𝘭𝘪𝘤) - Bold-italic:
***text***or___text___→ Unicode Sans-Serif Bold Italic (𝙗𝙤𝙡𝙙-𝙞𝙩𝙖𝙡𝙞𝙘) - Headers:
#/##/etc. styled with bold Unicode; H1 gets a━border - Code spans: backticks stripped, content rendered in Unicode
Monospace (𝚌𝚘𝚍𝚎) by default;
--no-monospace-codekeeps plain text - Fenced code blocks: fences stripped and content rendered in
Unicode Monospace by default;
--no-monospace-codepreserves verbatim - Links: stripped to display text by default;
--preserve-linksretains URLs - Images: replaced by alt text
- Bullet lists:
-/*/+→•; nested items get one marker per level (‣,◦,▪) - Blockquotes: leading
>stripped - HTML spans: unwrapped, inner text preserved
- HTML entities: decoded (
&→&, etc.) - Backslash escapes: resolved (
\*→*) - Windows line endings: normalised automatically
- Emojis & non-ASCII: pass through unchanged — no accidental corruption
Limitations
Converting Markdown to LinkedIn-friendly text relies on Unicode Mathematical Alphanumeric Symbols to simulate styling. This approach has notable limitations:
- Code Blocks: Monospace Unicode characters do not enforce true fixed-width alignment on proportional fonts (like LinkedIn’s default font). As a result, indentation and column alignment in code blocks will often break visually.
- Tables: Markdown tables are not converted — they pass through as
raw pipe syntax (
| col | col |), which LinkedIn does not render, producing unreadable output. - Accessibility: Screen readers often read Unicode mathematical characters aloud individually (e.g., “mathematical sans-serif bold b”) instead of as complete words, making the content difficult for visually impaired users to understand.
- Searchability: Text styled with these Unicode characters may not be indexed properly by LinkedIn’s search algorithm, meaning people searching for your keywords might not find your post.
- Markdown parsing: The converter is a pipeline of regular expressions, not a CommonMark parser. Ordinary posts convert faithfully, but constructs whose meaning depends on their surroundings — indented code blocks, nested blockquotes, link reference definitions, a thematic break indented inside a list item — are read more loosely than a real parser would read them. See Markdown parsing fidelity for the specifics.
For more examples, check out the package documentation at: https://www.indrapatil.com/md2linkedin/
See Also
- md2linkedin Web
App
— an interactive web interface for
md2linkedin, built by Yann Cohen.
License
This project is licensed under the MIT License.
Code of Conduct
Please note that the md2linkedin project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.
Acknowledgements
Hex sticker font is Rubik. Icons are sourced from
Flaticon:
Release files for md2linkedin 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| md2linkedin-0.4.0.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| md2linkedin-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.8 kB
Release files / md2linkedin-0.4.0.tar.gz
| Download URL | md2linkedin-0.4.0.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2510d714cf60283b89d5426e5fd5255f8a54f84cf78e60daabf47c6c6e99e5ca
|
|
BLAKE2b-256 checksum How to use checksums |
2ed7f5a478ac681263186a03979c8781f27be5766b7bf0b0131e2b4f466cafe2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / md2linkedin-0.4.0-py3-none-any.whl
| Download URL | md2linkedin-0.4.0-py3-none-any.whl |
|---|---|
| Size | 20.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7645caae5923fbb519b930ce5d83955e533837eb9a9ac311003a03453358e75e
|
|
BLAKE2b-256 checksum How to use checksums |
049b47e134ff43cb85842461ed82678f796de6843d06069474308740074929fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log