Releases: juanmanueldaza/linkedin2md
Release list
v0.7.1
Fixes
-
Prefix matching in
_get_csv— LinkedIn appends user IDs to content CSV filenames (e.g.,Shares_26645013.csv). The parser layer now falls back to^{key}_\\d+$regex matching when exact lookup fails. Fixes 7 content parsers: posts, comments, reactions, reposts, votes, saved items, and member follows. ~950 records recovered. -
LAN ads dual-key — supports both
lan_ads_engagement(current LinkedIn export) andlinkedin_audience_network_ad_engagement(older format). 155 ad records recovered. -
Known-empty warning suppression — 4 new LinkedIn CSV types that are always empty no longer trigger WARNING noise.
Tests
- 7 new tests for prefix matching and known-empty key suppression
- 436 tests passing (ruff, pyright clean)
v0.7.0
What's New
- 17 new parsers/formatters — complete CSV coverage for profile extensions (causes, interests, courses, honors/awards, test scores, patents, organizations, publications, volunteer experience), network (groups), and privacy/account data
- SimpleListParser/SimpleListFormatter base classes for reducing boilerplate
- Unconsumed-CSV warning — detects CSV files in your export that no parser handles
Bugs Fixed
- LAN Ads parser now matches the actual filename ()
- Profile metadata: maiden name, public profile URL, and address are now extracted
- Education: Field of Study and Grade are now parsed and rendered
- Job applications: Status and Withdraw Date are now captured
Tests
- 121 new tests (430 total)
- Full E2E test updated with additional CSV types
v0.6.0 — Security Hardening & Architecture Cleanup
v0.6.0 — Security Hardening & Architecture Cleanup
11 issues fixed. 309 tests. Zero open issues.
Security
- URL sanitization wired into all formatters (was dead code)
- Markdown table injection fixed across 25+ formatters
- Per-CSV row limit (100k) for ZIP bomb protection
- Content length truncation with warnings
Architecture
- Monolithic parser.py/formatter.py removed (~2600 lines)
- ProfileFormatter contract fixed, converter special-case eliminated
- Registration decoupled from instantiation
- 47 redundant empty-data guards removed via BaseFormatter template method
Community
v0.5.0 — 304 Tests, Complete Content Coverage
What's New
Testing
- 304 tests (up from 189 in v0.4.0)
- 86 new tests for 8 content parser/formatter pairs: Posts, Comments, Reactions, Reposts, Votes, SavedItems, Events, Media
- 23 unit tests for PDF exporter covering ImportError, template structure, unicode, injection blocking, exceptions
- 10 CLI integration tests for
--pdfflag: section ordering, quiet mode, failure handling - All tests pass on Python 3.10–3.13
Milestones Complete
- ✅ v0.4.0 — Infrastructure & Quality (6/6)
- ✅ v0.5.0 — New Features & Tests (5/5)
Zero Open Issues
See CHANGELOG.md for full details.
v0.4.0 — Python 3.10+, JD Parser, 189 Tests
What's New
Python 3.10+ Support
Minimum Python version dropped from 3.13 to 3.10. Works on Ubuntu LTS, Debian stable, and older environments.
Job Description Parser
New JobDescriptionParser and JobDescriptionFormatter parse job posting CSV data from LinkedIn exports. Outputs structured Markdown with company, title, description, date, and status.
New Features
--quietflag to suppress file listing in CLI output (#6)--versionflag (linkedin2md --version)- Script and Articles parser/formatter for content exports
Testing
- 189 tests (up from 151), passing on Python 3.10–3.13
- CI matrix on 4 Python versions
- Dependabot, stale bot, welcome bot workflows
- Pre-commit hooks (ruff, pyright)
Infrastructure
- N3RV agent framework rename (nerv → n3rv)
- MCP server configuration overhaul
- GitHub MCP restored to auto-detecting wrapper
See CHANGELOG.md for full details.
v0.3.1 - PDF Resume Generator & NERV Framework
What's New in v0.3.1
📄 PDF Resume Generator
New --pdf flag converts your parsed LinkedIn profile into a beautiful, print-ready A4 PDF resume (profile.pdf). Uses WeasyPrint (optional dependency — zero-impact on core installs).
linkedin2md export.zip --pdf🤖 NERV Agentic Development
The repository now ships with full NERV framework configuration for Spec-Driven Development. Use /sdd-new <change> in opencode to coordinate autonomous subagents for exploration, design, coding, and auditing.
🌐 GitHub Pages Landing Page
Custom domain with structured data, OG meta tags, and GA4 Consent Mode v2.
Bug Fixes
- Fixed pyright type-checking errors for optional imports in
pdf.py - Fixed ruff 88-char line length compliance in
pdf.py - Full codebase formatting compliance with ruff standards
Full Changelog: v0.3.0...v0.3.1
v0.3.0
What's Changed
Added
- Extensible multilingual system:
BilingualText→MultilingualTextsupporting N languages LanguageDetector.supported_languagesproperty for detector introspection- Proper logging module integration (replaces print statements)
- Fallback chain support in
_get_text()for flexible language resolution
Changed
- Version now single-sourced from
pyproject.tomlviaimportlib.metadata - CLI errors now use structured logging to stderr
MultilingualTextuses**kwargsfor language flexibility while maintaining backward compatibility
Fixed
- Version mismatch between
__init__.pyandpyproject.toml
Full Changelog: v0.2.0...v0.3.0