<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohamed AIT OUAARAB</title>
    <description>The latest articles on DEV Community by Mohamed AIT OUAARAB (@mohamed_aitouaarab_64fe6).</description>
    <link>https://dev.to/mohamed_aitouaarab_64fe6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2666500%2Fbd38b901-5bf6-43f2-a9cf-c391951737ff.jpg</url>
      <title>DEV Community: Mohamed AIT OUAARAB</title>
      <link>https://dev.to/mohamed_aitouaarab_64fe6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohamed_aitouaarab_64fe6"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source Alternative to OneTimeSecret - Here's How Blink Works</title>
      <dc:creator>Mohamed AIT OUAARAB</dc:creator>
      <pubDate>Tue, 01 Sep 2026 22:26:18 +0000</pubDate>
      <link>https://dev.to/mohamed_aitouaarab_64fe6/i-built-an-open-source-alternative-to-onetimesecret-heres-how-blink-works-4iih</link>
      <guid>https://dev.to/mohamed_aitouaarab_64fe6/i-built-an-open-source-alternative-to-onetimesecret-heres-how-blink-works-4iih</guid>
      <description>&lt;p&gt;At some point, almost every developer, system administrator, or security engineer has had to send something they probably shouldn't send through a normal chat.&lt;/p&gt;

&lt;p&gt;A password.&lt;/p&gt;

&lt;p&gt;An API key.&lt;/p&gt;

&lt;p&gt;A database credential.&lt;/p&gt;

&lt;p&gt;A recovery code.&lt;/p&gt;

&lt;p&gt;A configuration file.&lt;/p&gt;

&lt;p&gt;A private document.&lt;/p&gt;

&lt;p&gt;The usual workflow looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Hey, what's the password?"

"Sure, I'll send it to you."

        ↓

Slack / Discord / Email

        ↓

"Thanks!"

        ↓

The secret stays in the conversation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem isn't necessarily that the communication channel is insecure.&lt;/p&gt;

&lt;p&gt;The problem is that &lt;strong&gt;the secret now has a lifetime much longer than it needs to have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what made me build &lt;strong&gt;Blink&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Blink is an open-source secret-sharing platform designed around short-lived, self-destructing links.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://blink.malto.icu/" rel="noopener noreferrer"&gt;https://blink.malto.icu/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/MALTOisHERE/onlyonce" rel="noopener noreferrer"&gt;https://github.com/MALTOisHERE/onlyonce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with sharing secrets
&lt;/h2&gt;

&lt;p&gt;Imagine you're working with another developer.&lt;/p&gt;

&lt;p&gt;You need to send them an API key.&lt;/p&gt;

&lt;p&gt;You open Slack and send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_KEY=xxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They copy it.&lt;/p&gt;

&lt;p&gt;Everything works.&lt;/p&gt;

&lt;p&gt;But the message is still there.&lt;/p&gt;

&lt;p&gt;Tomorrow, next month, or a year from now, someone who has access to that conversation may still be able to retrieve the credential.&lt;/p&gt;

&lt;p&gt;The same problem can happen with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH credentials&lt;/li&gt;
&lt;li&gt;database passwords&lt;/li&gt;
&lt;li&gt;VPN configuration&lt;/li&gt;
&lt;li&gt;cloud credentials&lt;/li&gt;
&lt;li&gt;recovery codes&lt;/li&gt;
&lt;li&gt;temporary credentials&lt;/li&gt;
&lt;li&gt;private documents&lt;/li&gt;
&lt;li&gt;internal configuration&lt;/li&gt;
&lt;li&gt;sensitive notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if the communication channel itself is secure, &lt;strong&gt;permanent storage isn't always what you want.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you want:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Send it → let the recipient read it → destroy it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the idea behind one-time secret sharing.&lt;/p&gt;

&lt;p&gt;Services such as OneTimeSecret have been built around this concept: sensitive information is shared through links designed to be used once and then disappear.&lt;/p&gt;

&lt;p&gt;I wanted to build my own implementation with a modern interface, an open-source codebase, and the ability to self-host.&lt;/p&gt;

&lt;p&gt;That's where Blink came from.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Blink?
&lt;/h2&gt;

&lt;p&gt;Blink is a web application for sharing sensitive information through temporary links.&lt;/p&gt;

&lt;p&gt;The basic workflow is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    CREATE

                     Secret
                       │
                       ▼
                ┌─────────────┐
                │    Blink    │
                └──────┬──────┘
                       │
                       ▼
                 Temporary URL
                       │
                       ▼
                    SHARE
                       │
                       ▼
                  Recipient
                       │
                       ▼
                     READ
                       │
                       ▼
                  DESTROY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of putting the secret directly into a permanent conversation, you create a temporary link.&lt;/p&gt;

&lt;p&gt;The recipient opens it.&lt;/p&gt;

&lt;p&gt;The secret is retrieved.&lt;/p&gt;

&lt;p&gt;After the configured conditions are met, it is no longer available.&lt;/p&gt;

&lt;p&gt;The goal is deliberately simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share something sensitive without leaving it sitting around forever.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why build another secret-sharing service?
&lt;/h2&gt;

&lt;p&gt;There are already several solutions for this problem.&lt;/p&gt;

&lt;p&gt;So the obvious question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why build another one?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For me, it came down to a few things.&lt;/p&gt;

&lt;p&gt;I wanted something that was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple to use&lt;/li&gt;
&lt;li&gt;open source&lt;/li&gt;
&lt;li&gt;self-hostable&lt;/li&gt;
&lt;li&gt;focused on ephemeral information&lt;/li&gt;
&lt;li&gt;useful for both text and files&lt;/li&gt;
&lt;li&gt;easy to deploy&lt;/li&gt;
&lt;li&gt;transparent about its security model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also wanted to use the project as an opportunity to explore the engineering challenges behind ephemeral data.&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Delete this after someone reads it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;sounds simple.&lt;/p&gt;

&lt;p&gt;It isn't always simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;At a high level, Blink consists of several components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌─────────────────┐
                 │     Browser     │
                 │                 │
                 │   Create Secret │
                 └────────┬────────┘
                          │
                          ▼
                 ┌─────────────────┐
                 │   Blink API     │
                 │                 │
                 │ Secret handling │
                 └────────┬────────┘
                          │
                          ▼
                 ┌─────────────────┐
                 │    Storage      │
                 │                 │
                 │ Temporary data  │
                 └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend is responsible for interacting with the user.&lt;/p&gt;

&lt;p&gt;The backend handles the application's business logic and secret lifecycle.&lt;/p&gt;

&lt;p&gt;The storage layer holds the data required by the application until the secret expires or is consumed.&lt;/p&gt;

&lt;p&gt;The exact implementation is available in the open-source repository:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/MALTOisHERE/onlyonce" rel="noopener noreferrer"&gt;https://github.com/MALTOisHERE/onlyonce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Encryption
&lt;/h2&gt;

&lt;p&gt;Encryption is one of the most important parts of a project like Blink.&lt;/p&gt;

&lt;p&gt;Simply saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We use AES-256."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;isn't enough to explain whether a system is secure.&lt;/p&gt;

&lt;p&gt;The important questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is encryption performed?&lt;/li&gt;
&lt;li&gt;Where is the encryption key generated?&lt;/li&gt;
&lt;li&gt;Where does the key live?&lt;/li&gt;
&lt;li&gt;Does the backend ever see plaintext?&lt;/li&gt;
&lt;li&gt;What exactly gets stored?&lt;/li&gt;
&lt;li&gt;How is the recipient able to decrypt the data?&lt;/li&gt;
&lt;li&gt;What happens if the database is compromised?&lt;/li&gt;
&lt;li&gt;What happens if the application server is compromised?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions are much more important than simply naming an encryption algorithm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blink's encryption flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;This section should describe the exact implementation used by Blink.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, if encryption happens in the browser, the architecture could look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                USER SECRET
                     │
                     ▼
              ┌─────────────┐
              │   Browser   │
              │             │
              │   Encrypt   │
              │ Generate key│
              └──────┬──────┘
                     │
                     │ ciphertext
                     ▼
              ┌─────────────┐
              │    Blink    │
              │     API     │
              └──────┬──────┘
                     │
                     ▼
              ┌─────────────┐
              │   Storage   │
              │             │
              │ ciphertext  │
              └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is being completely transparent about what Blink's server can and cannot see.&lt;/p&gt;

&lt;p&gt;This is also one of the reasons I made the project open source.&lt;/p&gt;

&lt;p&gt;Security shouldn't depend solely on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Trust me, it works."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The implementation should be available for people to inspect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Secret lifecycle
&lt;/h2&gt;

&lt;p&gt;A secret shouldn't exist forever.&lt;/p&gt;

&lt;p&gt;That's the whole point.&lt;/p&gt;

&lt;p&gt;The lifecycle is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE
  │
  ▼
STORE
  │
  ▼
WAIT
  │
  ├───────────────┐
  │               │
  ▼               ▼
EXPIRED         VIEWED
  │               │
  └───────┬───────┘
          ▼
       DESTROY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depending on the configuration, a secret can become unavailable because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The recipient has already accessed it.&lt;/li&gt;
&lt;li&gt;The expiration time has been reached.&lt;/li&gt;
&lt;li&gt;The secret has otherwise been invalidated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important property is that the secret has a &lt;strong&gt;finite lifetime&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The interesting engineering problem: deletion
&lt;/h2&gt;

&lt;p&gt;"Delete the secret after it is viewed."&lt;/p&gt;

&lt;p&gt;Sounds easy.&lt;/p&gt;

&lt;p&gt;But what happens if two people open the same link at almost exactly the same time?&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Secret
                │
        ┌───────┴───────┐
        │               │
        ▼               ▼
     Request A       Request B
        │               │
        ▼               ▼
       Read            Read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the application isn't designed correctly, both requests might succeed.&lt;/p&gt;

&lt;p&gt;That means the secret wasn't really "one-time."&lt;/p&gt;

&lt;p&gt;This is one of the reasons ephemeral applications need to think carefully about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;atomic operations&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;race conditions&lt;/li&gt;
&lt;li&gt;transaction boundaries&lt;/li&gt;
&lt;li&gt;cache behavior&lt;/li&gt;
&lt;li&gt;database consistency&lt;/li&gt;
&lt;li&gt;deletion timing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A security feature isn't really a security feature if its implementation can be bypassed under normal concurrent access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Files make things more complicated
&lt;/h2&gt;

&lt;p&gt;Sharing text is relatively straightforward.&lt;/p&gt;

&lt;p&gt;Files introduce another dimension.&lt;/p&gt;

&lt;p&gt;A file may be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Password.txt
backup.zip
.env
database.sql
certificate.pem
configuration.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the system has to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file size&lt;/li&gt;
&lt;li&gt;upload handling&lt;/li&gt;
&lt;li&gt;temporary storage&lt;/li&gt;
&lt;li&gt;download authorization&lt;/li&gt;
&lt;li&gt;expiration&lt;/li&gt;
&lt;li&gt;deletion&lt;/li&gt;
&lt;li&gt;object storage&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;caching&lt;/li&gt;
&lt;li&gt;access control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A temporary file needs to follow the same lifecycle as a temporary text secret.&lt;/p&gt;

&lt;p&gt;If the application says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This file expires in 10 minutes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then the underlying storage shouldn't accidentally keep an accessible copy forever.&lt;/p&gt;

&lt;p&gt;This is an important distinction between &lt;strong&gt;application-level deletion&lt;/strong&gt; and &lt;strong&gt;actual data lifecycle management&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Threat model
&lt;/h2&gt;

&lt;p&gt;One of the things I want to be very clear about with Blink is that no security system protects against everything.&lt;/p&gt;

&lt;p&gt;A useful threat model asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What are we actually trying to protect against?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secret remaining in chat history&lt;/td&gt;
&lt;td&gt;Prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret remaining indefinitely on the platform&lt;/td&gt;
&lt;td&gt;Prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expired link being used normally&lt;/td&gt;
&lt;td&gt;Prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unauthorized access to a secret&lt;/td&gt;
&lt;td&gt;Depends on implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database compromise&lt;/td&gt;
&lt;td&gt;Depends on encryption architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server compromise&lt;/td&gt;
&lt;td&gt;Depends on encryption architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recipient taking a screenshot&lt;/td&gt;
&lt;td&gt;Cannot prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recipient copying the secret&lt;/td&gt;
&lt;td&gt;Cannot prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compromised recipient device&lt;/td&gt;
&lt;td&gt;Cannot prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malicious browser extensions&lt;/td&gt;
&lt;td&gt;Cannot prevent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last part is important.&lt;/p&gt;

&lt;p&gt;If someone gives a secret to another person, &lt;strong&gt;you cannot make the recipient unsee or copy it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blink can control the lifetime of the link.&lt;/p&gt;

&lt;p&gt;It cannot control what the recipient does after seeing the information.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why open source?
&lt;/h2&gt;

&lt;p&gt;Blink is open source because I believe security-related software benefits from transparency.&lt;/p&gt;

&lt;p&gt;Anyone should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect the source&lt;/li&gt;
&lt;li&gt;understand the architecture&lt;/li&gt;
&lt;li&gt;run their own instance&lt;/li&gt;
&lt;li&gt;identify bugs&lt;/li&gt;
&lt;li&gt;propose improvements&lt;/li&gt;
&lt;li&gt;contribute&lt;/li&gt;
&lt;li&gt;challenge the security assumptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository is available here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/MALTOisHERE/onlyonce" rel="noopener noreferrer"&gt;https://github.com/MALTOisHERE/onlyonce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you find a security issue, please report it responsibly rather than publicly exposing an active vulnerability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Self-hosting
&lt;/h2&gt;

&lt;p&gt;One of the goals of Blink is that you shouldn't have to trust my hosted instance if you don't want to.&lt;/p&gt;

&lt;p&gt;That's one of the biggest advantages of open-source infrastructure.&lt;/p&gt;

&lt;p&gt;You can run the software yourself and control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the infrastructure&lt;/li&gt;
&lt;li&gt;the domain&lt;/li&gt;
&lt;li&gt;the storage&lt;/li&gt;
&lt;li&gt;the deployment&lt;/li&gt;
&lt;li&gt;the logs&lt;/li&gt;
&lt;li&gt;the network&lt;/li&gt;
&lt;li&gt;the operational environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful for teams that don't want sensitive information passing through a third-party hosted service.&lt;/p&gt;

&lt;p&gt;The self-hosting experience is also something I want to keep improving.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned building Blink
&lt;/h2&gt;

&lt;p&gt;The biggest lesson wasn't about encryption.&lt;/p&gt;

&lt;p&gt;It was that &lt;strong&gt;ephemeral data is surprisingly difficult to make truly ephemeral.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You have to think about the entire lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input
  ↓
Encryption
  ↓
Transmission
  ↓
Storage
  ↓
Retrieval
  ↓
Decryption
  ↓
Expiration
  ↓
Deletion
  ↓
Backups / Logs / Caches
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deleting a database row doesn't necessarily mean every trace of the data has disappeared.&lt;/p&gt;

&lt;p&gt;You have to understand your entire infrastructure.&lt;/p&gt;

&lt;p&gt;That's one of the areas I'm continuing to explore with Blink.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Blink is still evolving.&lt;/p&gt;

&lt;p&gt;Some areas I'm interested in improving include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better self-hosting documentation&lt;/li&gt;
&lt;li&gt;stronger security documentation&lt;/li&gt;
&lt;li&gt;more deployment options&lt;/li&gt;
&lt;li&gt;improved file handling&lt;/li&gt;
&lt;li&gt;additional integrations&lt;/li&gt;
&lt;li&gt;API support&lt;/li&gt;
&lt;li&gt;better observability&lt;/li&gt;
&lt;li&gt;security reviews&lt;/li&gt;
&lt;li&gt;community contributions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd also like to see people challenge the project's assumptions.&lt;/p&gt;

&lt;p&gt;If you are a security engineer, developer, privacy enthusiast, or self-hosting enthusiast, I'd genuinely like to hear what you think is missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try Blink
&lt;/h2&gt;

&lt;p&gt;If you want to try it:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://blink.malto.icu/" rel="noopener noreferrer"&gt;https://blink.malto.icu/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in the implementation:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/MALTOisHERE/onlyonce" rel="noopener noreferrer"&gt;https://github.com/MALTOisHERE/onlyonce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in contributing, opening an issue or pull request is probably the best place to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I didn't build Blink because I think the world necessarily needs another secret-sharing application.&lt;/p&gt;

&lt;p&gt;I built it because I wanted to explore a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if sharing sensitive information didn't have to mean storing it permanently?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A password doesn't need to live forever in a Slack conversation.&lt;/p&gt;

&lt;p&gt;An API key doesn't need to remain in an email thread.&lt;/p&gt;

&lt;p&gt;A temporary credential doesn't need a permanent home.&lt;/p&gt;

&lt;p&gt;Sometimes you just need to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;share it → read it → forget it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind Blink.&lt;/p&gt;

&lt;p&gt;If you try it, I'd love to hear what you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blink:&lt;/strong&gt; &lt;a href="https://blink.malto.icu/" rel="noopener noreferrer"&gt;https://blink.malto.icu/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MALTOisHERE/onlyonce" rel="noopener noreferrer"&gt;https://github.com/MALTOisHERE/onlyonce&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>privacy</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
