r/lumo

▲ 26 r/lumo

Add support for file generation

It would be awesome if Lumo could generate files (PDF, word, excel, etc) and allow the user to download or store them in their Proton Drive.

reddit.com
u/CortaCircuit — 20 hours ago
▲ 55 r/lumo

Is it just me or is Lumo getting better lately?

When Lumo 2.0 was launched I was impressed at first. But after a while of using it extensively, I started to notice that it's not as good as I thought. I use it a lot for analysis and essays, and this is the part where I believe it was the weakest. It doesn't pull the correct information, it confabulates, and sometimes the answer it gives is just lacking. Since last week, I noticed that it's gotten better. I usually take the answer I get from Lumo and give it to Claude AI for review. Even Claude says that the answer are better than before. One important note: I changed my prompts so this might be the reason, but even a week ago it was still giving me bad answers, with the same new prompt.

Do you feel like Lumo is getting better? I wish Proton give us a clear update on any improvements for Lumo.

reddit.com
u/advancedsandwitch — 3 days ago
▲ 1 r/lumo

Correct Date and Time in Lumo

As probably many of you I had issues with Lumo referencing the correct time. That could be during the creation of to-do-lists, the search for cinema screening hours or whatever. I would like to share my approach towards a solution.
It involves a self-hosted website written in PHP that serves as a time reference for Lumo. The time comes from official NTP servers and is corrected with approximate values of network latency.
Then, in Lumo settings in the general behavior section there is a prompt added to regularly check the time reference. As you might expect from an AI Lumo doesn't always follow the instructions, but it greatly improved accuracy for time-critical queries.

The php code:

<?php
header('Content-Type: text/html; charset=utf-8');
date_default_timezone_set('UTC');

/**
 * Queries an NTP server.
 */
function ntp_offset($host, $port = 123, $timeout = 5) {
    $result = array(
        'success'   => false,
        'ntp_time'  => null,
        'offset_s'  => null,
        'rtt_s'     => null,
        'stratum'   => null,
        'error'     => null
    );

    $socket = u/fsockopen("udp://{$host}", $port, $errno, $errstr, $timeout);
    if (!$socket) {
        $result['error'] = "fsockopen failed (errno={$errno}, errstr={$errstr})";
        return $result;
    }
    stream_set_timeout($socket, $timeout);

    // Insert send timestamp into request packet (Bytes 40-47)
    $t1_wall = microtime(true);
    $t1_secs = (int)$t1_wall + 2208988800;
    $t1_frac = (int)(fmod($t1_wall, 1) * 4294967296);

    $packet = chr(0x1B) . str_repeat(chr(0x00), 39)
            . pack('N2', $t1_secs, $t1_frac);

    fwrite($socket, $packet);
    $response = fread($socket, 48);
    $t4_wall = microtime(true);
    fclose($socket);

    if ($response === false || strlen($response) < 48) {
        $result['error'] = "NTP response too short (" . strlen($response) . " bytes)";
        return $result;
    }

    $data = unpack('N12', $response);
    if (!$data) {
        $result['error'] = "unpack failed";
        return $result;
    }

    $stratum = ($data[1] >> 16) & 0xFF;
    $result['stratum'] = $stratum;

    // Kiss-o'-Death detection (Stratum 0)
    if ($stratum == 0) {
        $ref_bytes = unpack('C4', pack('N', $data[4]));
        $ref_id = '';
        for ($i = 1; $i <= 4; $i++) {
            $b = $ref_bytes[$i];
            if ($b >= 32 && $b <= 126) {
                $ref_id .= chr($b);
            }
        }
        $result['error'] = "Kiss-o'-Death (Stratum 0, RefID='{$ref_id}')";
        return $result;
    }

    $ntp_to_unix = 2208988800;

    // Transmit Timestamp (Word 11-12) = t3
    $trans_secs = $data[11];
    $trans_frac = $data[12] / 4294967296.0;
    $t_trans = ($trans_secs - $ntp_to_unix) + $trans_frac;

    // Receive Timestamp (Word 9-10) = t2
    $recv_secs = $data[9];
    $recv_frac = $data[10] / 4294967296.0;
    $t_recv = ($recv_secs - $ntp_to_unix) + $recv_frac;

    // Originate Timestamp (Word 7-8) = t1 (reflected by server)
    $orig_secs = $data[7];
    $orig_frac = $data[8] / 4294967296.0;
    $t_orig = ($orig_secs - $ntp_to_unix) + $orig_frac;

    if ($trans_secs == 0) {
        $result['error'] = "Transmit Timestamp is zero";
        return $result;
    }

    if ($orig_secs == 0) {
        // Workaround: PTB does not fill Originate field
        $offset_estimate = $t_recv - (($t1_wall + $t4_wall) / 2);
        $rtt_estimate = $t4_wall - $t1_wall;
        $result['success'] = true;
        $result['ntp_time'] = $t_trans;
        $result['offset_s'] = $offset_estimate;
        $result['rtt_s'] = $rtt_estimate;
        $result['originate_zero'] = true;
        return $result;
    }

    // Full NTP offset calculation
    $offset = (($t_recv - $t1_wall) + ($t_trans - $t4_wall)) / 2;
    $rtt    = ($t4_wall - $t1_wall) - ($t_trans - $t_recv);

    $result['success'] = true;
    $result['ntp_time'] = $t_trans;
    $result['offset_s'] = $offset;
    $result['rtt_s'] = $rtt;
    return $result;
}

// --- Configuration ---
$ntp_host     = 'ptbtime1.ptb.de';
$http_lat_est = 0.050;

// --- Read Client Timestamp from Header OR Query Parameter ---
$client_ts = null;
$client_ts_source = null;
$client_ts_unit = 'seconds';

if (isset($_SERVER['HTTP_X_REQUEST_TIME']) && ctype_digit($_SERVER['HTTP_X_REQUEST_TIME'])) {
    $client_ts = $_SERVER['HTTP_X_REQUEST_TIME'];
    $client_ts_source = 'Header (X-Request-Time)';
} elseif (isset($_SERVER['HTTP_DATE']) && ctype_digit($_SERVER['HTTP_DATE'])) {
    $client_ts = $_SERVER['HTTP_DATE'];
    $client_ts_source = 'Header (Date)';
} elseif (isset($_GET['cts']) && ctype_digit($_GET['cts'])) {
    $client_ts = $_GET['cts'];
    $client_ts_source = 'Query Parameter (JavaScript)';
    $client_ts_unit = 'milliseconds';
}

$client_ts_available = $client_ts !== null;

$server_now_float = microtime(true);
$server_unix_raw = (int)$server_now_float;

// --- Calculate HTTP Round Trip Time ---
$http_rtt_s = null;
$http_latency_s = $http_lat_est;
$http_latency_source = 'Estimated value (50 ms)';

if ($client_ts_available) {
    $client_ts_seconds = ($client_ts_unit === 'milliseconds')
        ? intval($client_ts) / 1000.0
        : intval($client_ts);

    $http_rtt_s = $server_now_float - $client_ts_seconds;

    if ($http_rtt_s >= 0 && $http_rtt_s < 5) {
        $http_latency_s = max(0.001, $http_rtt_s / 2);
        $http_latency_source = $client_ts_source;
    } else {
        $client_ts_available = false;
        $http_rtt_s = null;
        $http_latency_source = 'Estimated value (Client TS implausible)';
    }
}

// --- Fetch NTP Offset ---
$ntp_result = ntp_offset($ntp_host);
$ntp_measured = $ntp_result['success'];
$ntp_offset_s = $ntp_measured ? $ntp_result['offset_s'] : 0;
$ntp_time_unix = $ntp_result['ntp_time'] ? (int)$ntp_result['ntp_time'] : null;
$nt_rtt_s = $ntp_result['rtt_s'];
$ntp_error = $ntp_result['error'];
$stratum = $ntp_result['stratum'];
$originate_zero = isset($ntp_result['originate_zero']) ? $ntp_result['originate_zero'] : false;

// --- Total Correction ---
$total_offset_s = $ntp_offset_s + $http_latency_s;
$corrected_unix = $server_unix_raw + $total_offset_s;

// --- Time Formatting (UTC) ---
$dt_utc    = new DateTime('@' . (int)$corrected_unix, new DateTimeZone('UTC'));
$dt_server_utc = new DateTime('@' . $server_unix_raw, new DateTimeZone('UTC'));

$dt_ntp_fmt = $ntp_time_unix
    ? gmdate('Y-m-d H:i:s', $ntp_time_unix)
    : '—';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Time Display with NTP Offset</title>
<script>
window.addEventListener('DOMContentLoaded', function() {
    var cts = document.getElementById('cts');
    if (cts && !cts.value) {
        cts.value = Date.now();
        cts.form.submit();
    }
});
</script>
</head>
<body>

<?php if (!isset($_GET['cts']) && !isset($_SERVER['HTTP_X_REQUEST_TIME']) && !isset($_SERVER['HTTP_DATE'])): ?>
<form method="GET" action="">
<input type="hidden" name="cts" id="cts" value="">
</form>
<p>Measuring network latency...</p>
<?php endif; ?>

<h1>Current Time (Corrected)</h1>
<table border="1" cellpadding="5" cellspacing="0">
<tr><th>Field</th><th>Value</th></tr>
<tr><td>UTC (Corrected)</td><td><?php echo $dt_utc->format('Y-m-d H:i:s'); ?> UTC</td></tr>
<tr><td>Unix Timestamp</td><td><?php echo (int)$corrected_unix; ?></td></tr>
</table>

<h2>Comparison: Raw vs. Corrected Time</h2>
<table border="1" cellpadding="5" cellspacing="0">
<tr><th>Base</th><th>UTC</th><th>Unix-TS</th><th>Difference</th></tr>
<tr><td><strong>Server Time (Raw)</strong></td><td><?php echo $dt_server_utc->format('Y-m-d H:i:s'); ?> UTC</td><td><?php echo $server_unix_raw; ?></td><td><strong>—</strong></td></tr>
<tr><td><strong>Corrected Time</strong></td><td><?php echo $dt_utc->format('Y-m-d H:i:s'); ?> UTC</td><td><?php echo (int)$corrected_unix; ?></td><td><?php echo number_format($total_offset_s * 1000, 2); ?> ms</td></tr>
</table>

<h2>Time Measurement Status</h2>
<table border="1" cellpadding="5" cellspacing="0">
<tr><th>Metric</th><th>Value</th></tr>
<tr><td>Client Timestamp Available</td><td><?php echo $client_ts_available ? 'Yes' : 'No'; ?></td></tr>
<tr><td>Client Timestamp (Source)</td><td><?php echo $client_ts_source ?: '—'; ?></td></tr>
<tr><td>HTTP RTT Measurable</td><td><?php echo $http_rtt_s !== null ? 'Yes' : 'No'; ?></td></tr>
<tr><td>HTTP Roundtrip</td><td><?php echo $http_rtt_s !== null ? number_format($http_rtt_s * 1000, 2) . ' ms' : '—'; ?></td></tr>
<tr><td>HTTP Latency Source</td><td><?php echo $http_latency_source; ?></td></tr>
<tr><td>HTTP Latency</td><td><?php echo number_format($http_latency_s * 1000, 2); ?> ms</td></tr>
<tr><td>NTP Server</td><td><?php echo htmlspecialchars($ntp_host); ?></td></tr>
<tr><td>NTP Stratum</td><td><?php echo $stratum !== null ? $stratum : '—'; ?></td></tr>
<tr><td>NTP Measurable</td><td><?php echo $ntp_measured ? 'Yes' : 'No'; ?></td></tr>
<tr><td>Originate Timestamp</td><td><?php echo $originate_zero ? 'Zero (PTB Workaround Active)' : 'Complete'; ?></td></tr>
<tr><td>NTP Reference Time</td><td><?php echo $dt_ntp_fmt; ?> UTC</td></tr>
<tr><td>NTP Offset</td><td><?php echo $ntp_measured ? number_format($ntp_offset_s * 1000, 2) . ' ms' : '—'; ?></td></tr>
<tr><td>NTP RTT</td><td><?php echo ($ntp_measured && $nt_rtt_s !== null) ? number_format($nt_rtt_s * 1000, 2) . ' ms' : '—'; ?></td></tr>
<?php if ($ntp_error): ?>
<tr><td style="color:red;">NTP Error Message</td><td style="color:red;"><?php echo htmlspecialchars($ntp_error); ?></td></tr>
<?php endif; ?>
<tr><td>Total Correction</td><td><?php echo number_format($total_offset_s * 1000, 2); ?> ms</td></tr>
<tr><td>Correction Source</td><td><?php
    if ($ntp_measured) { echo 'NTP + '; }
    echo ($http_rtt_s !== null) ? 'Measured HTTP RTT' : 'Estimated Latency';
    if ($originate_zero) { echo ' (PTB Workaround: Offset Estimated)'; }
?></td></tr>
</table>
</body>
</html>

The Lumo instructions:

**Check Web Access**

At the beginning of a chat or upon resumption, check the status of `web_search` and `web_extract`. If the information indicates that they are not active, this is often incorrect. Therefore, in such cases, explicitly test with a test URL to see if they are actually active. If not, issue a warning.

**Current Time Reference**

At the start and at regular intervals during the chat session, the current time and date must be retrieved via `web_extract` from 
**https://your_webserver.here/time.php?cache_buster=[Random number + existing Unix timestamp]**
. This must be done twice in immediate succession, but never simultaneously. If the comparison of the two values shows that the returned timestamps are identical, the random number value and the Unix timestamp must be incremented by 1 to bypass caching, and a new retrieval must take place. This must be repeated until the returned value deviates positively from the previous timestamp. For all time statements, deadlines, appointments, and date-related assertions, only this external reference shall be used—not the system's internal time indications.

**Retrieval Triggers — Perform time check if at least one of the following criteria applies:**

1. 
**Session Start**
: At the beginning of every new chat session.
2. 
**Session Resumption**
: Upon continuing a session after an interruption/break.
3. 
**Time Cycle**
: 5–10 minutes have elapsed since the last retrieval.
4. 
**Dialogue Cycle**
: After every 15th dialogue (customer input + response) since the last retrieval.
5. 
**Uncertainty**
: In case of uncertainty regarding the current time or date indications.
6. 
**Explicit Time Statements**
: Before every statement that includes a date, time, deadline, or temporal reference.
7. 
**Time-Sensitive Topics**
: In discussions containing time-critical elements (deadlines, appointments, historical time points, current events).
8. 
**Before Time-Related Statement**
: If no time retrieval occurred within the last 5 minutes 
**and**
 the timeframe of the intended statement tolerates an inaccuracy of ≥ 1 hour.

**Procedure:**
1. 
**First Call**
: At the beginning of every new chat session, the time page is retrieved.
2. 
**Regular Updates**
: Further retrievals occur depending on the trigger criteria.
3. 
**Usage**
: All temporal statements refer to the most recently retrievable time from this reference page.
4. 
**Labeling**
: For time indications critical to deadlines or appointments, the reference time is briefly stated, e.g., "As of: 14:32 UTC (according to website)."

**Fault Tolerance:**

If the page is unreachable, this must be explicitly reported, and internal time indications must be marked as such ("internal system time, unverified"). In this case, no time-critical statement requiring accuracy below 1 hour shall be made.
reddit.com
u/Top_S_poT — 2 days ago
▲ 7 r/lumo

Video upload for analysis

Hello

I like to upload political parties videos in various languages to translate what they are saying. Gemini allows this and it’s one of the only times I turn to Gemini. Can lumo have video analysis added to its model (🤞🤞

reddit.com
u/norsk_imposter — 2 days ago
▲ 10 r/lumo

GLM 5.2 in Lumo: Deutsche Grammatik und Eigennamen teils unzuverlässig

Nutze Lumo Max (GLM 5.2) jetzt seit rund einem Monat, hauptsächlich für deutsche Korrespondenz. Fällt mir zunehmend auf, dass die Sprachqualität im Deutschen nicht mitkommt, was man vom Modell in Benchmarks so hört. Konkret: chinesische Satzzeichen tauchen mitten im deutschen Text auf, teilweise wechselt ein Nebensatz einfach ins Englische, und bei Eigennamen wird's richtig problematisch – aus "Weißer Ring" wurde "Weiberring", aus einem Straßennamen ein anderer Fantasiename mit kaputtem Sonderzeichen. Für lockeren Chat wär's egal, aber bei Briefen, wo's auf Namen und Institutionen ankommt, muss ich am Ende alles selbst gegenlesen. Geht's noch jemandem so, oder hab ich Pech mit meinem Setup? Und falls hier jemand vom Proton-Team mitliest: wäre super, wenn da nochmal nachgeschärft wird, gerade bei Eigennamen und Sprachkonsistenz.

reddit.com
u/Frequent_Cash_5710 — 3 days ago
▲ 16 r/lumo

Faster Lumo?

I noticed that Lumo is responding faster both in terms of the delay before the response begins and the speed at which the response is complete. It is much faster, perhaps it is the topics that I am discussing…. has anyone else noticed a change?

reddit.com
u/Stealth_Privacy — 4 days ago
▲ 8 r/lumo

I asked Lumo how they would dress up as if proton let them dress up for Halloween

The second image is the image it generated from what it described would dress up as

u/Vee_Fan38083 — 3 days ago
▲ 0 r/lumo

No nudity at all in image generation?

I understand the need for guardrails when it comes to illegal content. However there are plenty of legitimate uses for nudity generation and they are all being blocked by the overzealous safety features.

For context, as a hobby I develop scenarios for Dungeons and Dragons campaigns. I've been using Lumo to generate stylized concept art for those campaigns. Sometimes the situation involves nudity. For example there was a scenario when after losing a bet in a tavern the character had to streak from one end of the village to the other without getting caught by the guards.

The image generator absolutely refused to generate that. It used to be able to do it before when I developed scenarios a month ago. Do I have to use another service now? I was very happy with Lumo's performance before. Yes, I am using Lumo plus.

I read the model's thinking output and it's clear that someone at Proton programmed it to refuse all nudity. Yes 100% block illegal content I support that but it's ridiculous that an episode of the Simpsons on network television is allowed to show more nudity than a premium service that I pay for as an adult.

reddit.com
u/FortyKnocks — 4 days ago
▲ 5 r/lumo

Error in input stream

Anybody elses lumo cutting out and having Error in input stream lately?

Has happened to me like 10 times today

reddit.com
u/Fun_Savings7690 — 4 days ago
▲ 9 r/lumo

Moving existing Chats into Projects

Hey everyone,

I wanted to point out that on Lumo you still can't move existing chats into a project. I just strated something prety interesting in a normal chat outside of a project but now wanted to put it into a newly created project so that I can better organize it. So my wish to the Lumo team would be to make it able to move existing Chats into Projects for better organization, structure and planning.

Thanks in Advance and interested to hear what others think about this!

reddit.com
u/Gamegyf — 4 days ago
▲ 15 r/lumo

Lumo Code

Is this something that will be a thing? Being able to develop with a complete promise on ZDR, for more discrete projects

reddit.com
u/murdogman — 5 days ago
▲ 107 r/lumo

AI Paper Trail lets you see how much Big Tech AI know about you, and the value of your data.

Your ChatGPT chats know more about you than your Google search history ever did.

AI Paper Trail reads your data from Big Tech AI and creates a detailed profile about everything it's learned about you: work, relationships, health, money, and how much your data is worth.

Here's how to check your exposure:

  1. Export your chat history from ChatGPT or Claude
  2. Upload the file to https://lumo.proton.me/aitrail
  3. Receive your scorecard in seconds

All scorecards and data is deleted after analysis, we never store it, and only you see the report.

u/Proton_Team — 7 days ago
▲ 13 r/lumo

What if Lumo had connectors?

So this is how it would work:
User:Check My Proton Calendar
Lumo:Alright!
Lumo:used proton calendar connector
Lumo:Your Events For Today Are:*calendar events you have here
Or Mail:
User:Summarize My Emails
Lumo:used proton mail connector
Lumo:Heres Your Latest Emails Summarized
Or Any Other That Proton Could Add, (etc) like GitHub, or other stuff

reddit.com
u/Vee_Fan38083 — 7 days ago
▲ 3 r/lumo

Drive based Knowledge Indexing metric?

Hey, Proton Team

Are there any metrics we can lean on to determine how long its going to take for files to be completely indexed in a Proton Drive folder being used as the source of Lumo project knowledge?

Its basically about 2MB of various .md and .ts files spread out across mulitple folders. Maybe 60 files in all.

No PDFs or images. Just text based stuff.

Just trying to get an idea because I uploaded the files over an hour ago and they still aren't indexed according to Lumo.....

I could simply paste them into the chat manually as required but that kinda defeats the point, right?

Any guidance would be helpful. Visionary account btw.

reddit.com
u/Kwatakye — 7 days ago
▲ 18 r/lumo

can i send data like personal chats to lumo and be ensured they are not gonna be shared with anyone in any meaning?

i need to process dates and times in a big chat (3 months long convo) to make one kind of statistics for myself. there might be some personal info and let's say passwords. am i safe to use proton's lumo for it?

reddit.com
u/whoishewtf — 8 days ago
▲ 29 r/lumo

So slow

Why is Lumo so slow when opening the app?

I go to type and I have wait for the cat to change colors so I can hit the submit button to run my prompt. Every competitor allows you to immediately enter, type and then run.

Can’t multitask and have the prompt run in the background or it will fail.

Sometimes it won’t even run the prompt and says “this message is empty. Sorry about that” then you retype the prompt but no send button pops up to rerun the prompt!

what am I paying for then?

reddit.com
u/Any-Shift1234 — 8 days ago
▲ 16 r/lumo

How do you use the advanced models?

I had the Proton Unlimited plan and now am on the Workspace Premium plan. The details say that Lumo now has Access to advanced AI models. I was already using Lumo 2.0 Max before the plan change. Where are the advanced models beyond Lumo 2.0 Max?

reddit.com
u/toss_and_ — 8 days ago
▲ 14 r/lumo

Am I imagining the greater accuracy Lumo+ compared to the free tier?

The paid tier of Max + Thinking mode has been miles and miles more accurate for me while working on building out a NixOS server compared to when I was trying on the free tier.

I thought the only difference was usage limits, but that doesn't seem to be the case to me based on recent experience.

reddit.com
u/I_SAID_RELAX — 7 days ago