writing-to-logseq
Expert in writing data to Logseq DB graphs via HTTP API. Auto-invokes when users want to create pages, add blocks, update content, set properties, or sync conversation notes to their Logseq graph. Provides CRUD operations with safety guidelines.
Best use case
writing-to-logseq is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Expert in writing data to Logseq DB graphs via HTTP API. Auto-invokes when users want to create pages, add blocks, update content, set properties, or sync conversation notes to their Logseq graph. Provides CRUD operations with safety guidelines.
Teams using writing-to-logseq should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/writing-to-logseq/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How writing-to-logseq Compares
| Feature / Agent | writing-to-logseq | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Expert in writing data to Logseq DB graphs via HTTP API. Auto-invokes when users want to create pages, add blocks, update content, set properties, or sync conversation notes to their Logseq graph. Provides CRUD operations with safety guidelines.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Writing to Logseq
## When to Use This Skill
This skill auto-invokes when:
- User wants to create new pages or blocks in Logseq
- Updating existing content in the graph
- Setting or modifying properties on entities
- Adding tags/classes to blocks
- Syncing conversation notes to Logseq
- User mentions "add to logseq", "create page", "update block"
**Write Operations**: See `{baseDir}/scripts/write-operations.py` for the API.
## Available Operations
| Operation | Description |
|-----------|-------------|
| `create_page(title, content)` | Create new page |
| `create_block(parent, content)` | Add block under parent |
| `update_block(uuid, content)` | Modify block content |
| `delete_block(uuid)` | Remove block |
| `set_property(uuid, key, value)` | Set property value |
| `add_tag(uuid, tag)` | Add tag/class to block |
| `append_to_page(title, content)` | Add content to existing page |
## Quick Examples
### Create a Page
```python
from write_operations import LogseqWriter
writer = LogseqWriter()
# Create simple page
page = writer.create_page("Meeting Notes 2024-01-15")
# Create page with initial content
page = writer.create_page(
"Project Alpha",
content="Project overview and tasks",
properties={"status": "Active", "priority": "High"}
)
```
### Add Blocks
```python
# Add block to a page
block = writer.create_block(
parent="page-uuid-or-title",
content="New task item"
)
# Add nested block
child = writer.create_block(
parent=block["uuid"],
content="Sub-task details"
)
```
### Update Content
```python
# Update block content
writer.update_block(
uuid="block-uuid",
content="Updated content here"
)
# Append to existing page
writer.append_to_page(
title="Daily Notes",
content="- New item added via API"
)
```
### Set Properties
```python
# Set single property
writer.set_property(
uuid="block-uuid",
key="status",
value="Complete"
)
# Set typed property
writer.set_property(
uuid="block-uuid",
key="rating",
value=5,
type="number"
)
# Set multiple properties
writer.set_properties(
uuid="block-uuid",
properties={
"author": "John Doe",
"rating": 5,
"published": "2024-01-15"
}
)
```
### Add Tags
```python
# Add tag to block
writer.add_tag(uuid="block-uuid", tag="Book")
# Add multiple tags
writer.add_tags(uuid="block-uuid", tags=["Important", "Review"])
```
## HTTP API Methods
### Create Page
```json
{
"method": "logseq.Editor.createPage",
"args": ["PageTitle", {"property": "value"}, {"createFirstBlock": true}]
}
```
### Insert Block
```json
{
"method": "logseq.Editor.insertBlock",
"args": ["parent-uuid", "Block content", {"sibling": false}]
}
```
### Update Block
```json
{
"method": "logseq.Editor.updateBlock",
"args": ["block-uuid", "New content"]
}
```
### Set Property
```json
{
"method": "logseq.Editor.upsertBlockProperty",
"args": ["block-uuid", "property-name", "value"]
}
```
### Delete Block
```json
{
"method": "logseq.Editor.removeBlock",
"args": ["block-uuid"]
}
```
## Safety Guidelines
### Best Practices
1. **Verify before delete** - Always confirm block exists before removal
2. **Use unique titles** - Avoid creating duplicate pages
3. **Validate properties** - Ensure property types match schema
4. **Handle errors** - Catch and handle API failures gracefully
### Common Pitfalls
- **Duplicate pages**: Check if page exists before creating
- **Invalid UUIDs**: Verify UUID format before operations
- **Property types**: Number properties need numeric values
- **Rate limiting**: Don't spam API with rapid requests
## Content Formatting
### Markdown Support
```python
# Logseq supports markdown in blocks
writer.create_block(
parent=page_uuid,
content="""
## Section Header
- Bullet point
- Another point
- Nested item
**Bold** and *italic* work too.
[[Link to Page]] and #tags
"""
)
```
### Property Syntax
```python
# Properties can be set in content
writer.create_block(
parent=page_uuid,
content="""
- Task item
status:: In Progress
priority:: High
due:: [[2024-01-20]]
"""
)
# Or via API (preferred for typed values)
writer.set_property(uuid, "rating", 5) # number
writer.set_property(uuid, "done", True) # checkbox
```
## Sync Conversation to Logseq
### Pattern for Saving Notes
```python
def sync_conversation_to_logseq(title, notes):
"""Sync conversation notes to Logseq page."""
writer = LogseqWriter()
# Create or get page
page = writer.get_or_create_page(f"Claude Notes/{title}")
# Add timestamp header
from datetime import datetime
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
writer.append_to_page(
title=f"Claude Notes/{title}",
content=f"""
## {timestamp}
{notes}
---
"""
)
return page
```
## Error Handling
```python
try:
page = writer.create_page("My Page")
except writer.ConnectionError:
print("Cannot connect to Logseq")
except writer.DuplicateError:
print("Page already exists")
except writer.ValidationError as e:
print(f"Invalid data: {e}")
```
## Reference Materials
- See `{baseDir}/references/write-operations.md` for all operations
- See `{baseDir}/references/safety-guidelines.md` for safety practices
- See `{baseDir}/templates/page-template.md` for page templatesRelated Skills
Copywriting
## Purpose
spec-writing
Execute this skill should be used when the user asks about "writing specs", "specs.md format", "how to write specifications", "sprint requirements", "testing configuration", "scope definition", or needs guidance on creating effective sprint specifications for agentic development. Use when appropriate context detected. Trigger with relevant phrases based on skill purpose.
blog-writing-guide
Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions "blog post," "blog draft," "write-up," "announcement post," "engineering post," "deep dive," "postmortem," or asks for help with technical writing for Sentry. Even if the user just says "help me write about [feature/topic]" — if it sounds like it could become a Sentry blog post, use this skill.
Writing Fuzzing Harnesses
A fuzzing harness is the entrypoint function that receives random data from the fuzzer and routes it to your system under test (SUT). The quality of your harness directly determines which code paths get exercised and whether critical bugs are found. A poorly written harness can miss entire subsystems or produce non-reproducible crashes.
user-guide-writing
Write clear and helpful user guides and tutorials for end users. Use when creating onboarding docs, how-to guides, or FAQ pages. Handles user-focused documentation, screenshots, step-by-step instructions.
technical-writing
Write clear, comprehensive technical documentation. Use when creating specs, architecture docs, runbooks, or API documentation. Handles technical specifications, system design docs, operational guides, and developer documentation with industry best practices.
postmortem-writing
Write effective blameless postmortems with root cause analysis, timelines, and action items. Use when conducting incident reviews, writing postmortem documents, or improving incident response processes.
plan-writing
Structured task planning with clear breakdowns, dependencies, and verification criteria. Use when implementing features, refactoring, or any multi-step work.
technical-blog-writing
Technical blog post writing with structure, code examples, and developer audience conventions. Covers post types, code formatting, explanation depth, and developer-specific engagement patterns. Use for: engineering blogs, dev tutorials, technical writing, developer content, documentation posts. Triggers: technical blog, dev blog, engineering blog, technical writing, developer tutorial, tech post, code tutorial, programming blog, developer content, technical article, engineering post, coding tutorial, technical content
writing-utils
Use this skill when you need to write utility functions for the Next.js app
writing-types
Use this skill when you need to write types and interfaces in `srs/types` for the Next.js app
writing-page-layout
Use this skill when you need to write code for a page layout in the Next.js