Artur Piszek's WordPress Personal OS
Table of content

Artur Piszek is a software engineer at Automattic, where he builds experimental AI features for WordPress.com and Tumblr. Based in Poland, he writes about remote work, productivity, and technology in his newsletter Deliberate Internet. He holds degrees in both software engineering and psychology.
Piszek built PersonalOS as a WordPress plugin that transforms a self-hosted site into a complete productivity system. Use WordPress as your task manager, note-taking app, and AI-ready knowledge base—all on your own server.
Why WordPress
| Concern | WordPress Solution |
|---|---|
| Data ownership | Self-hosted, full database access |
| Longevity | 20+ years of backwards compatibility |
| API access | REST API built-in, extensible |
| AI integration | Any AI can read/write via API |
| Mobile | Native apps, responsive admin |
| Backup | Standard MySQL dumps, file exports |
WordPress has 20+ years of backwards compatibility. Your data stays accessible.
Core Features
PersonalOS adds these capabilities to WordPress:
personalos/
├── todos/ # GTD-style task management
├── notes/ # Private CPT with block editor
├── bucketlist/ # Custom taxonomy for life goals
├── sync/ # Readwise, Evernote integration
└── transcribe/ # Audio to text via AI
TODO Management
Tasks live as a custom post type with GTD-inspired workflow:
// Task status taxonomy
register_taxonomy('task_status', 'todo', [
'labels' => ['name' => 'Status'],
'hierarchical' => false,
]);
// Statuses: inbox, next, waiting, someday, done
Daily workflow:
- Dump everything into Inbox
- Weekly review: move to Next, Waiting, or Someday
- Daily: work from Next list
- Archive to Done
The WordPress admin becomes your task dashboard.
Notes System
Notes use the WordPress Block Editor (Gutenberg) with enhanced features:
// Private notes CPT
register_post_type('note', [
'public' => false,
'show_ui' => true,
'supports' => ['title', 'editor', 'revisions'],
'capability_type' => 'private_page',
]);
Embeddable note linking:
Type [[ to search and embed other notes inline: [[note:meeting-notes-jan-15]]. Links are bidirectional.
Quick Links Autocomplete
Piszek extended WordPress’s link autocompleter to include notes:
// Custom completer for notes
const noteCompleter = {
name: 'notes',
triggerPrefix: '[[',
getOptions: async (search) => {
const response = await apiFetch({
path: `/wp/v2/notes?search=${search}`
});
return response.map(note => ({
value: `[[note:${note.slug}]]`,
label: note.title.rendered
}));
}
};
Sync Engines
PersonalOS syncs with external services using WP-Cron background jobs:
Readwise Integration
// Hourly cron job
add_action('personalos_sync_readwise', function() {
$highlights = fetch_readwise_highlights();
foreach ($highlights as $highlight) {
wp_insert_post([
'post_type' => 'note',
'post_title' => $highlight['book_title'],
'post_content' => $highlight['text'],
'meta_input' => [
'source' => 'readwise',
'source_id' => $highlight['id']
]
]);
}
});
Evernote Two-Way Sync
Syncing with Evernote requires careful handling to avoid infinite loops:
// Push to Evernote on save
add_action('save_post_note', function($post_id) {
// Skip if this save was triggered by sync
if (get_post_meta($post_id, '_sync_in_progress', true)) {
return;
}
// Mark as syncing
update_post_meta($post_id, '_sync_in_progress', true);
// Push to Evernote
$evernote_id = push_to_evernote($post_id);
// Store reference
update_post_meta($post_id, '_evernote_id', $evernote_id);
// Clear sync flag
delete_post_meta($post_id, '_sync_in_progress');
});
Audio Transcription
Upload an MP3, get a note:
add_action('add_attachment', function($attachment_id) {
$file = get_attached_file($attachment_id);
if (pathinfo($file, PATHINFO_EXTENSION) !== 'mp3') {
return;
}
// Queue for transcription
wp_schedule_single_event(
time(),
'personalos_transcribe',
[$attachment_id]
);
});
add_action('personalos_transcribe', function($attachment_id) {
$file = get_attached_file($attachment_id);
// Send to Whisper API
$transcript = transcribe_audio($file);
// Create note from transcript
wp_insert_post([
'post_type' => 'note',
'post_title' => 'Transcript: ' . basename($file),
'post_content' => $transcript,
]);
});
AI-Friendly Architecture
PersonalOS exposes everything via REST API:
# Get all tasks
curl https://your-site.com/wp-json/wp/v2/todos \
-H "Authorization: Bearer YOUR_TOKEN"
# Create a note
curl -X POST https://your-site.com/wp-json/wp/v2/notes \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"title": "Meeting Notes", "content": "..."}'
# Search notes
curl https://your-site.com/wp-json/wp/v2/notes?search=project
AI agents can read your tasks and notes for context, create new tasks from conversations, update existing notes, and search across your knowledge base.
# Example: Claude Code accessing PersonalOS
import requests
def get_context_from_personal_os():
response = requests.get(
"https://your-site.com/wp-json/wp/v2/notes",
headers={"Authorization": f"Bearer {TOKEN}"},
params={"per_page": 10, "orderby": "modified"}
)
return response.json()
# Include in Claude's context
notes = get_context_from_personal_os()
context = "\n".join([n['content']['rendered'] for n in notes])
Data Views for Modern UI
Piszek uses WordPress Data Views API for task management:
import { DataViews } from '@wordpress/dataviews/wp';
function TaskDashboard() {
const [tasks, setTasks] = useState([]);
return (
<DataViews
data={tasks}
fields={[
{ id: 'title', header: 'Task' },
{ id: 'status', header: 'Status' },
{ id: 'due_date', header: 'Due' },
]}
view={{
type: 'table',
layout: { primaryField: 'title' }
}}
/>
);
}
The Stack
| Component | Technology |
|---|---|
| Platform | WordPress 6.x |
| Editor | Gutenberg Block Editor |
| Data | Custom Post Types + Taxonomies |
| API | WordPress REST API |
| Sync | WP-Cron background jobs |
| AI | External via REST API |
| Hosting | Any PHP host / self-hosted |
Methodologies
PersonalOS implements three proven productivity systems. Piszek wrote about his guilt-free productivity approach that shaped these choices:
- Getting Things Done: Inbox, Next Actions, Waiting For, Done
- Building a Second Brain: Interconnected notes with bidirectional links
- Write of Passage: Content creation workflow
Installation
# Clone the plugin
git clone https://github.com/artpi/personalos \
wp-content/plugins/personalos
# Activate in WordPress admin
# Or via WP-CLI
wp plugin activate personalos
# Run initial setup
wp personalos setup
Getting Started
Week 1: Tasks only
- Install PersonalOS
- Add 10 tasks to Inbox
- Do weekly review: categorize into Next/Waiting/Someday
- Work from Next list daily
Week 2: Add notes
- Create notes for active projects
- Use
[[linking between notes - Set up Readwise sync if you use Kindle
Week 3: AI integration
- Generate API credentials
- Connect to Claude Code via MCP or direct API
- Let AI read your tasks for context
Week 4: Expand
- Add audio transcription
- Set up Evernote sync if needed
- Customize workflows
Modify the PHP, add features, customize. It’s open source on your server. Piszek also built related tools like WP TODO, an iOS app that uses WordPress as a backend.
Next: Nat Eliason’s AI Productivity Stack
Get updates
New guides, workflows, and AI patterns. No spam.
Thank you! You're on the list.