Skip to main content

postcraftin

AI-powered LinkedIn post generator using local LLMs via Ollama. Personalized ghostwriter with 6-module profile system, modular onboarding, and CLI interface. A default profile is auto-created on first use via bootstrap.

Features

  • Local LLMs — runs fully on your machine via Ollama, no API costs, no data leaks
  • 6-Module Profile System — Identity, Voice, Audience, Content Strategy, Post History, Technical Preferences
  • Modular Onboarding — Update individual modules with --module flag
  • Few-Shot prompting — provide example posts to calibrate the output to your voice
  • Post length control — kurz (150–500), mittel (1.200–1.500), lang (1.900–2.500 Zeichen)
  • Multiple profiles — manage different personas or clients
  • Dynamic Model Selection — List and select from available Ollama models
  • Config Management — Global and profile-specific settings
  • Folder-Based Profiles — Organized storage with drafts/, published/, brandguide/, templates/, history/
  • 10 Storytelling Templates — Verlierer→Gewinner, AHA-Moment, Weg der Veränderung, and more (use --template <name> in generate, list with profile templates list)
  • Brand Guide Generator — Auto-generates voice.md, vocabulary.md, anti-patterns.md
  • YAML Frontmatter — Posts include metadata (topics, status, word count, LinkedIn URL)

Requirements

  • Python 3.10+
  • Ollama running locally
  • Node.js 18+ (for Web UI)

Installation

CLI

pip install postcraftin

Web UI (optional)

# Install API dependencies
pip install postcraftin[api]

# Start the FastAPI backend
postcraftin-api

# In a separate terminal, start the Next.js frontend
cd frontend
npm install
npm run dev

Open http://localhost:5173 in your browser.

Ports: Frontend dev server defaults to :5173, API server to :8080. Both configurable via env vars (PORT, NEXT_PUBLIC_API_URL, POSTCRAFTIN_API_PORT, POSTCRAFTIN_CORS_ORIGINS).

Usage

# Create a profile (interactive wizard - 6 modules)
postcraftin onboard --name myprofile

# Update specific module only
postcraftin onboard --name myprofile --module voice

# Generate a LinkedIn post with template
postcraftin generate --topic "The future of AI" --template verlierer-gewinner

# List available templates
postcraftin profile templates list

# Initialize templates to profile folder
postcraftin profile templates init --name myprofile

# Manage posts (drafts/published)
postcraftin profile posts list
postcraftin profile posts show <filename>
postcraftin profile posts publish <filename>
postcraftin profile posts set-topics <filename> --topics "AI,Future"

# Generate/regenerate brand guide
postcraftin profile brandguide --name myprofile --regenerate

# List available Ollama models
postcraftin models

# Select model interactively
postcraftin config model --select

# Show global config
postcraftin config

# Set profile-specific model
postcraftin profile set myprofile model gemma4:e2b

# List all profiles
postcraftin list-profiles

Default Model

gemma4:e2b — the default model for LinkedIn post generation.

First time? Pull the model with:

ollama pull gemma4:e2b

Want a different model? Browse all available models at: https://ollama.com/library

Configuration

Setting Location Description
Global Model ~/.postcraftin/config.json Default model for all profiles
Profile Model ~/.postcraftin/profiles/{name}/config.json Profile-specific model (optional)
Profiles ~/.postcraftin/profiles/{name}/ Folder-based profile storage
Drafts ~/.postcraftin/profiles/{name}/posts/drafts/ Draft posts with frontmatter
Published ~/.postcraftin/profiles/{name}/posts/published/ Published posts with LinkedIn URL
Templates ~/.postcraftin/profiles/{name}/templates/ Custom storytelling templates
Brand Guide ~/.postcraftin/profiles/{name}/brandguide/ voice.md, vocabulary.md, anti-patterns.md
History ~/.postcraftin/profiles/{name}/history/ Post statistics and analytics

Environment Variables

The data directory is resolved at runtime — on every path access, never at import time — using this priority:

Priority Variable Description
1 (primary) POSTCRAFTIN_HOME Overrides the whole data directory (tests, CI, portable installs)
2 (alias) POSTCRAFTIN_DATA_DIR Existing alias, kept for e2e tests, scripts and CI
3 (default) — ~/.postcraftin — unchanged default, no data migration
POSTCRAFTIN_HOME=/tmp/postcraftin-data postcraftin generate --topic "Your topic"

License

MIT

Contributing

Contributions welcome! Open an issue or PR.

Thank you to all contributors!

Built with ❤️ for the LinkedIn community.

Open source forever.

Metadata

Release files for postcraftin 2.51.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for postcraftin 2.51.0
File Size Uploaded
postcraftin-2.51.0.tar.gz 87.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for postcraftin 2.51.0
File Interpreter ABI Platform
postcraftin-2.51.0-py3-none-any.whl Python 3 none any Details

Total release size: 202.0 kB

Release files / postcraftin-2.51.0.tar.gz

Download URL postcraftin-2.51.0.tar.gz
Size 87.0 kB
Tags Source
SHA-256 checksum
How to use checksums
3460e1270b45e6ad7d68cdb5b7207dc2efa6f1116a3b3668fee7a0c0e946ffcf
BLAKE2b-256 checksum
How to use checksums
36bba7e0a06d96b85009dac1907d246c6b54f489c23aa46c0a13537ae4b542e2
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 Oct 8, 2026.

Transparency log

Release files / postcraftin-2.51.0-py3-none-any.whl

Download URL postcraftin-2.51.0-py3-none-any.whl
Size 114.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
feb58e7027655d431d664817b01ab65c0895ac9f67656975aad572b58f77c338
BLAKE2b-256 checksum
How to use checksums
095e0852bf75f5838e2cb35eb25dbab21df706b338c2b4c3d2b663a8feb13d56
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 Oct 8, 2026.

Transparency log

Release history Release notifications | RSS feed

2.53.0

2 release files

This release

2.51.0 This release

2 release files

2.47.0

2 release files

2.46.0

2 release files

2.45.0

2 release files

2.44.0

2 release files

2.43.0

2 release files

2.42.0

2 release files

2.41.0

2 release files

2.40.0

2 release files

2.39.0

2 release files

2.38.1

2 release files

2.37.1

2 release files

2.37.0

2 release files

2.36.0

2 release files

2.35.1

2 release files

2.35.0

2 release files

2.33.0

2 release files

2.32.0

2 release files

2.23.0

2 release files

2.22.0

2 release files

2.21.0

2 release files

2.20.0

2 release files

2.19.0

2 release files

2.18.1

2 release files

2.18.0

2 release files

2.15.0

2 release files

2.14.0

2 release files

2.13.1

2 release files

2.13.0

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.3

2 release files

2.3.1

2 release files

2.1.0

2 release files

2.0.2

2 release files

2.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page