Artur Piszek's WordPress Personal OS

Table of content
Artur Piszek's WordPress Personal OS

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

ConcernWordPress Solution
Data ownershipSelf-hosted, full database access
Longevity20+ years of backwards compatibility
API accessREST API built-in, extensible
AI integrationAny AI can read/write via API
MobileNative apps, responsive admin
BackupStandard 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:

  1. Dump everything into Inbox
  2. Weekly review: move to Next, Waiting, or Someday
  3. Daily: work from Next list
  4. 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.

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

ComponentTechnology
PlatformWordPress 6.x
EditorGutenberg Block Editor
DataCustom Post Types + Taxonomies
APIWordPress REST API
SyncWP-Cron background jobs
AIExternal via REST API
HostingAny PHP host / self-hosted

Methodologies

PersonalOS implements three proven productivity systems. Piszek wrote about his guilt-free productivity approach that shaped these choices:

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

  1. Install PersonalOS
  2. Add 10 tasks to Inbox
  3. Do weekly review: categorize into Next/Waiting/Someday
  4. Work from Next list daily

Week 2: Add notes

  1. Create notes for active projects
  2. Use [[ linking between notes
  3. Set up Readwise sync if you use Kindle

Week 3: AI integration

  1. Generate API credentials
  2. Connect to Claude Code via MCP or direct API
  3. Let AI read your tasks for context

Week 4: Expand

  1. Add audio transcription
  2. Set up Evernote sync if needed
  3. 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

Topics: knowledge-management workflow open-source local-first