Autonomous PM assistant for Telegram → Notion task capture with optional Tavily research enrichment.
PM work often gets buried in chat. Ghost PM converts unstructured conversation into a reliable task system without manual copy/paste. Unlike a human, which isn't always available, Ghost PM collects inputs from each member 24/7, removing the need for a human PM. Additionally due to it being built on Openclaw, you can integrate this with any platform of your choice.
Key benefits:
- Less admin overhead: tasks and dates are captured automatically.
- Better execution: every task requires a due date, so work is time-bound.
- Cleaner tracking: dedupe prevents duplicate entries.
- Faster research: researchable tasks are enriched with summary + links.
- Safer autonomy: asks clarifying questions when required data is missing.
Create this agent in its own workspace (for example ~/.openclaw/workspace-pm) so PM logic, memory, and tools stay isolated from your personal assistant (main).
This separation gives you:
- independent persona + instructions
- separate files/state for PM automation
- safer routing (only PM group goes to PM agent)
- cleaner repo structure for sharing/deploying
- Interprets task-like messages from a PM Telegram group
- Requires a due date (asks follow-up if missing)
- Parses natural dates (
tomorrow,in 3 days,next friday, etc.) - Writes clean task titles + raw message to Notion
- Deduplicates using
Dedup Key - Enriches research tasks via Tavily
- Optionally rewrites research into one coherent paragraph via OpenAI
skills/notion-pm/notion-client.py— Notion CRUD + schema-aware writesskills/notion-pm/pm_handler.py— decision logic, date parsing, pending clarification flowskills/notion-pm/run_ingest.py— wrapper entrypoint for inbound messagesskills/notion-pm/research_client.py— Tavily (+ optional OpenAI summarize)
mkdir -p ~/.openclaw/workspace-pm
openclaw agents add pm --workspace ~/.openclaw/workspace-pmThen route only your PM Telegram group to this agent (example in openclaw.json.example).
cd ~/.openclaw/workspace-pm
python3 -m venv .venv
source .venv/bin/activate
pip install notion-clientcp .env.example .envFill in Notion/Tavily/OpenAI keys in .env.
Open your Notion DB → ... → Connections → add your integration.
- Go to https://www.notion.so/profile/integrations/internal
- Create a new Internal integration
- Copy the API token (
ntn_.../secret_...) - Put it in
.env:NOTION_API_KEY=your_notion_token
Create a database (for example: PM Inbox) and include this schema:
Required properties:
Task Name(Title)Message(Rich text)Status(Select:New,In Progress,Done)Received At(Date)Due Date(Date)Dedup Key(Rich text)Priority(Select:High,Medium,Low)
Optional (recommended for research enrichment):
Research Summary(Rich text)Research Links(Rich text)
In the Notion DB page:
- Click
...(top-right) - Open Connections
- Add your integration
Without this connection, API calls will fail with access errors.
Open your database page URL and copy the database UUID, then set:
NOTION_DATABASE_ID=your_database_idpython skills/notion-pm/notion-client.py pingIf this succeeds, your Notion token + DB access are configured correctly.
Required properties:
Task Name(Title)Message(Rich text)Status(Select:New,In Progress,Done)Received At(Date)Due Date(Date)Dedup Key(Rich text)Priority(Select:High,Medium,Low)
Optional properties for research enrichment:
Research Summary(Rich text)Research Links(Rich text preferred)
cd ~/.openclaw/workspace-pm
source .venv/bin/activate
# 1) Notion auth
python skills/notion-pm/notion-client.py ping
# 2) Research client
python skills/notion-pm/research_client.py "best AI tools for PM roadmap planning" --max-results 3
# 3) Ingest task with due date
python skills/notion-pm/run_ingest.py --message "task: ship onboarding copy by tomorrow high" --chat=-100123 --message-id=1 --source=telegram
# 4) Missing due date flow
python skills/notion-pm/run_ingest.py --message "task: research competitor pricing" --chat=-100123 --message-id=2 --source=telegram
python skills/notion-pm/run_ingest.py --message "next friday" --chat=-100123 --message-id=3 --source=telegram- Set
RESEARCH_CONFIDENCE_THRESHOLDto control when research runs. - If
OPENAI_API_KEYis missing, summaries fall back to Tavily output.