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.