AI-powered LinkedIn post generator using local LLMs via Ollama
Project description
postcraftin
AI-powered LinkedIn post generator using local LLMs via Ollama. Personalized ghostwriter with 6-module profile system, modular onboarding, and CLI interface.
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
--moduleflag - 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
- 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 |
License
MIT
Contributing
Contributions welcome! Open an issue or PR.
Thank you to all contributors!
Built with ❤️ for the LinkedIn community.
Open source forever.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file postcraftin-2.19.0.tar.gz.
File metadata
- Download URL: postcraftin-2.19.0.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfcdd758856d57685dc13c02b66bad2c4e42204ab73b24eb1c159b08ecc6a057
|
|
| MD5 |
ff76ebeabcbfae9d36be0df0ab88978a
|
|
| BLAKE2b-256 |
e6bc252de0a721dddb60d3c517ad41692a9686f7ae8f45f8c073f710eb593527
|
Provenance
The following attestation bundles were made for postcraftin-2.19.0.tar.gz:
Publisher:
release.yml on EmreDuelger/postcraft
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postcraftin-2.19.0.tar.gz -
Subject digest:
cfcdd758856d57685dc13c02b66bad2c4e42204ab73b24eb1c159b08ecc6a057 - Sigstore transparency entry: 1546831012
- Sigstore integration time:
-
Permalink:
EmreDuelger/postcraft@f32f6b39cfe28922102c2bbc275ab35a40393767 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/EmreDuelger
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f32f6b39cfe28922102c2bbc275ab35a40393767 -
Trigger Event:
push
-
Statement type:
File details
Details for the file postcraftin-2.19.0-py3-none-any.whl.
File metadata
- Download URL: postcraftin-2.19.0-py3-none-any.whl
- Upload date:
- Size: 35.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b580c63caf8034fc3bf330ff352331cde87edda36440b8d5a6cc6135ea1b5e7
|
|
| MD5 |
434d8062294487465f1325c49ea4700e
|
|
| BLAKE2b-256 |
bb66cb5e255e257d52e067f824be06cd070734618068260948d1ba1ab11e7c70
|
Provenance
The following attestation bundles were made for postcraftin-2.19.0-py3-none-any.whl:
Publisher:
release.yml on EmreDuelger/postcraft
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postcraftin-2.19.0-py3-none-any.whl -
Subject digest:
1b580c63caf8034fc3bf330ff352331cde87edda36440b8d5a6cc6135ea1b5e7 - Sigstore transparency entry: 1546831048
- Sigstore integration time:
-
Permalink:
EmreDuelger/postcraft@f32f6b39cfe28922102c2bbc275ab35a40393767 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/EmreDuelger
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f32f6b39cfe28922102c2bbc275ab35a40393767 -
Trigger Event:
push
-
Statement type: