VERITAS — PROSPERIIUM Operations
PROSPERIIUM
VERITAS
  
Sync…
Energy
Today's Work
Syncing with ClickUp…
Revenue Snapshot
Active Clients
Pipeline Value
MTD Revenue
Brain Dump
No captures yet today.
Publishing Queue
Nothing scheduled yet.
Latest News
Open Intelligence →
Revenue Pipeline
Active Clients
Pipeline Value
MTD Revenue
Conversion Rate
%
Weighted Forecast (90d)
probability-adjusted pipeline
Expected Close This Month
committed + active
Leads in Funnel
lead + discovery + proposal
Revenue Target Tracker
€0 of €200,000
0%
Remaining
Days Left
Monthly Pace Needed
Clients Needed (4–6k)
Pipeline-confirmed revenue (Active + Complete stages): —
Revenue Log
No revenue logged yet.
Intelligence
Financial Markets
Awaiting refresh…
Alternative Investments
Awaiting refresh…
Leadership & Voice
Awaiting refresh…
Content Ideas — LinkedIn & Instagram
Click a button above to generate content ideas
Session Notes
New Note
All Notes
No notes yet. Record your first session note.
Content
Brain Dump
My Tasks
Appears in Today's Work
Content Ideas Queue
Idea Pool
Ideas queued in the Capture tab, or saved from Intelligence, land here automatically. Pick a date to schedule one.
No unscheduled ideas. Queue some in Capture, or save suggestions from Intelligence.
Scheduled
Nothing scheduled yet.
Configuration
Airtable
Settings → API → Personal Access Token
✓ Saved
ClickUp
Settings → My Apps → API Token
Right-click list → Copy link → extract ID from URL
✓ Saved
Anthropic (Intelligence)
console.anthropic.com → API Keys
✓ Saved
Access Password
✓ Password updated
Live News APIs — Finnhub & NewsData.io

These keys supply the Intelligence panel with real, verified, live articles — headlines and URLs that actually exist. Both are free with no credit card required. Anthropic (Claude) then adds a coaching commentary layer on top of the real articles.

Finnhub → powers Financial Markets and Alternative Investments panels with live market news. Sign up at finnhub.io — your key appears on the dashboard immediately.
NewsData.io → powers Leadership & Voice panel with live articles. Sign up at newsdata.io — key appears in your account dashboard.

Without these keys, the Intelligence panel falls back to AI synthesis (clearly labelled) which does not contain real article URLs.

finnhub.io → Sign Up → Dashboard → API Key
✓ Saved
newsdata.io → Register → Dashboard → API Key
✓ Saved
PHP Proxy Setup — Required for All Live APIs & Cross-Device Sync

ClickUp, Anthropic, Finnhub, and NewsData all block direct browser requests (CORS). Airtable is the only exception — it works directly. All other APIs must route through the WordPress PHP proxy below. This is why Intelligence panels may show errors without it installed. This snippet also powers cross-device sync — it stores your dashboard data (tasks, notes, captures, content calendar, revenue target, settings) in a WordPress option so it appears on every device you log into. If you're upgrading from an earlier version, re-paste this snippet to add the sync handler — the sync status pill in the topbar will read "Sync offline" until you do. Timeout raised to 55s (was 30s): longer Intelligence and Content Idea generations were hitting the old 30-second limit and failing with a cURL timeout error. If you've installed an earlier version of this snippet, re-paste it to pick up the higher limit. Install once and all live data features plus sync work. Two options:

Option A — WPCode (recommended): Install the free WPCode plugin → Code Snippets → Add New → paste the snippet below → set type to PHP Snippet → Activate.

Option B — functions.php: Appearance → Theme File Editor → functions.php → paste the snippet before the final ?> closing tag (or at the very end if there is none).

Note: the snippet is written for PHP 5.4+ and all WordPress versions. Do not add <?php — it is already in your file.

/**
 * VERITAS Dashboard - API Proxy
 * Compatible with PHP 5.4+ and all WordPress versions
 * In WPCode: paste as-is (leave "Run snippet" type as PHP)
 * In functions.php: paste as-is after the opening <?php line
 */

add_action( 'wp_ajax_veritas_proxy',        'veritas_proxy_handler' );
add_action( 'wp_ajax_nopriv_veritas_proxy', 'veritas_proxy_handler' );

function veritas_proxy_handler() {

    $raw     = isset( $_POST['payload'] ) ? stripslashes( $_POST['payload'] ) : '{}';
    $payload = json_decode( $raw, true );

    if ( empty( $payload ) || ! isset( $payload['url'] ) ) {
        wp_send_json_error( 'No URL provided' );
        return;
    }

    $url     = esc_url_raw( $payload['url'] );
    $method  = isset( $payload['method'] )  ? strtoupper( $payload['method'] )  : 'GET';
    $headers = isset( $payload['headers'] ) ? $payload['headers']                : array();
    $body    = isset( $payload['body'] )    ? $payload['body']                   : null;

    $args = array(
        'method'    => $method,
        'headers'   => $headers,
        'timeout'   => 55,
        'sslverify' => true,
    );

    if ( ! empty( $body ) ) {
        $args['body'] = $body;
    }

    $response = wp_remote_request( $url, $args );

    if ( is_wp_error( $response ) ) {
        wp_send_json( array( 'error' => array( 'message' => $response->get_error_message() ) ) );
        return;
    }

    $body_raw = wp_remote_retrieve_body( $response );
    $decoded  = json_decode( $body_raw, true );

    if ( $decoded !== null ) {
        echo json_encode( $decoded );
    } else {
        echo $body_raw;
    }

    wp_die();
}

/**
 * VERITAS Dashboard - Cross-Device Sync
 * Stores the full dashboard state as one WordPress option so any device
 * logging into the dashboard picks up the latest data. Single-tenant by
 * design (one option row) — matches this dashboard's single-user use case.
 */

add_action( 'wp_ajax_veritas_sync',        'veritas_sync_handler' );
add_action( 'wp_ajax_nopriv_veritas_sync', 'veritas_sync_handler' );

function veritas_sync_handler() {

    $option_name    = 'veritas_dashboard_state';
    $option_updated = 'veritas_dashboard_state_updated';
    $op             = isset( $_POST['op'] ) ? sanitize_text_field( $_POST['op'] ) : '';

    if ( $op === 'save' ) {

        $raw = isset( $_POST['state'] ) ? stripslashes( $_POST['state'] ) : '';

        if ( $raw === '' || json_decode( $raw, true ) === null ) {
            wp_send_json_error( 'Invalid state payload' );
            return;
        }

        update_option( $option_name, $raw, false );
        $now = time() * 1000; // milliseconds, to match JS Date.now()
        update_option( $option_updated, $now, false );

        wp_send_json_success( array( 'updated' => $now ) );

    } elseif ( $op === 'load' ) {

        $raw     = get_option( $option_name, '' );
        $updated = (int) get_option( $option_updated, 0 );

        wp_send_json_success( array( 'state' => $raw, 'updated' => $updated ) );

    } else {
        wp_send_json_error( 'Unknown sync operation' );
    }

    wp_die();
}
Test Connections