<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[~stophe: Frontend x Design]]></title><description><![CDATA[[Developer, Designer, Dad].sort()]]></description><link>https://blog.stophe.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1625079534473/2csO1Ac0nz.png</url><title>~stophe: Frontend x Design</title><link>https://blog.stophe.com</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 06:53:23 GMT</lastBuildDate><atom:link href="https://blog.stophe.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to securely share a file?]]></title><description><![CDATA[Tl;dr: I created sharrr.com as a proof-of-concept - this service allows you to share a file up to 100GB (technically, there is no file size limit) following a zero-knowledge encryption scheme. All code is open source on GitHub.
Disclaimer: I am not a...]]></description><link>https://blog.stophe.com/how-to-securely-share-a-file</link><guid isPermaLink="true">https://blog.stophe.com/how-to-securely-share-a-file</guid><category><![CDATA[Cryptography]]></category><category><![CDATA[Share]]></category><category><![CDATA[File sharing]]></category><category><![CDATA[File Upload]]></category><category><![CDATA[end-to-end-encryption]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Sat, 11 Feb 2023 08:31:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1675927781991/eeef43f5-0f2b-412c-8d6c-47bc9e38eb0f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Tl;dr:</strong> I created <a target="_blank" href="https://sharrr.com">sharrr.com</a> as a <strong>proof-of-concept -</strong> this service allows you to share a file up to 100GB (technically, there is no file size limit) following a <strong>zero-knowledge encryption</strong> scheme. All code is <a target="_blank" href="https://github.com/stophecom/sharrr-svelte">open source on GitHub</a>.</p>
<p><strong>Disclaimer:</strong> I am not a security engineer or cryptographer. Use with caution. Feedback on security aspects or potential vulnerabilities is much appreciated.</p>
<p>Find me on <a target="_blank" href="https://twitter.com/stophecom">Twitter</a>, <a target="_blank" href="https://mastodon.social/@stophecom">Mastodon</a> or add a comment.</p>
<h2 id="heading-prerequisites-andamp-goal">Prerequisites &amp; Goal</h2>
<p>It is important to highlight the asynchronous aspect of the plan. Obviously, you could just send a file directly from A to B using FTPS or similar protocols. In my scenario, a sender <strong>(Alice) would upload a file and get a download link in return</strong>. She would then send the link to a recipient <strong>(Bob) who can download and decrypt the original file</strong>. This means the file has to be stored somehow, somewhere along the way.</p>
<p>One of the challenges was to <strong>prepare for a potential scenario</strong>, where all of the infrastructure, namely <strong>API, Database and S3 Storage, would be compromised</strong> at the same time. Even in such a case, it shall not be possible to decompile or reverse-engineer the original file, fulfilling the promise of zero-knowledge encryption.</p>
<p>Another challenge is that file encryption requires internal memory (RAM). This becomes a problem when you wanted to encrypt/decrypt <strong>a big file at once</strong>: You needed <strong>twice the file size reserved in memory</strong>. For huge files, this amount of memory is simply not available on many devices.</p>
<p>Since I wanted to support massive files (&gt;50GB) another factor to consider is the single file storage limitations many providers have. (Although, AWS supports up to 5TB)</p>
<p>And lastly, I wanted all traces to disappear after the file has been downloaded successfully.</p>
<p>Based on my background as a front-end engineer and because I believe in the open web, I also wanted to create a browser-based solution that is <strong>free, transparent and accessible</strong>.</p>
<h2 id="heading-here-is-how-it-works">Here is how it works</h2>
<p>The following schema shows a simplified version of the implementation:</p>
<p><img src="https://sharrr.com/images/about/about-overview.jpg" alt="Concept" /></p>
<h3 id="heading-memory-and-storage-limitations">Memory and storage limitations</h3>
<p>The solution is to break down the files into chunks and encrypt/decrypt them separately. Each chunk is saved individually to not only circumvent storage limitations but also to increase security. (From a storage perspective each chunk is just a bunch of binary data - it is not obvious which chunks make up a specific file.) Similar to the files stored on S3, the database only contains encrypted data. There is no way to reference database entries directly to files.</p>
<h3 id="heading-end-to-end-encryption">End-to-end encryption</h3>
<p>Only the client with a valid link is able to connect all the dots and access the original file. It is worth noting that the master key (and alias) <strong>never leaves the browser</strong>. Both strings will be added to the fragment identifier of the download link. This commonly referred to as the <strong>hash (#)</strong> or <strong>anchor</strong> part of the URL is never sent to the server. (You can check yourself in your browser's dev tools: When you access a link, this information will not be part of the request.)</p>
<p>Simplified illustration of the download link (in the final implementation there is also a <a target="_blank" href="https://en.wikipedia.org/wiki/Cryptographic_nonce">nonce</a> added to the hash):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675936486303/0ce620e6-0c8e-4d2b-af7d-2a70355dbd31.jpeg" alt class="image--center mx-auto" /></p>
<p><strong><em>Side note</em></strong>: In this proof of concept everyone with the download link can access the file (once). For advanced security, one could easily build a solution that requires an additional password. <strong>To increase security with the present implementation, you may manually split the link and send the encryption key separately.</strong></p>
<h3 id="heading-breakdown-file-upload">Breakdown: File Upload</h3>
<p>Encrypting the file is the easier part: First, a file is split into smaller chunks. Those chunks then get encrypted separately using the master key and stored on S3. A reference to each chunk, together with a signature and a public key is afterwards stored in the database.</p>
<p>Simplified schema of the file upload process:</p>
<p><img src="https://sharrr.com/images/about/about-encryption.jpg" alt="Encryption" /></p>
<h3 id="heading-breakdown-download">Breakdown: Download</h3>
<p>The download and decryption is the tricky part. Not only do we need to make sure the client is allowed to request a certain file (solved with a cryptographic signature, see blue box), but also, it is not possible to build back the file at once to save it into the download folder. (To be exact, for smaller files, one could download the file, decrypt it in memory and save it right away. But since we want to support large files, we need some magic from the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Streams_API">Streams API</a> and the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API">Service Worker API</a>.)</p>
<p>Simplified schema of the file download process:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675937648125/dccd07ce-76a2-44f8-a648-e338a42c07a9.jpeg" alt /></p>
<p>A service worker is something like a proxy within your browser. It has access to the network and can e.g. intercept requests or change responses. We can interact with it by sending messages back and forth, but it doesn't have direct access to the DOM.</p>
<p>Within our app the <strong>service worker is designed to intercept the initial file request</strong> (described above), then fetch and decrypt the chunks and finally <strong>stream the data back</strong> within the response (basically directly into your download folder).</p>
<p>We have to use the "request interception" approach, b/c of a limitation in most browsers: A user has to <strong>initiate a file download with a click</strong> on <code>&lt;a href="/path/to/file.txt" download&gt;</code>. (This will change with the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API">File System Access API</a> - which is unfortunately not widely available yet).</p>
<p>The role of the service worker:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1676025516202/656e77df-52a4-4264-9eb5-9b46ec48991a.jpeg" alt class="image--center mx-auto" /></p>
<p>If you want to learn more about how this works in detail, I recommend <a target="_blank" href="https://www.youtube.com/watch?v=SdePc87Ffik">this video</a>.</p>
<h2 id="heading-cryptography">Cryptography</h2>
<p>For encryption/decryption only built-in browser APIs are used, namely the <strong>Web Crypto API</strong>. As a side effect, this app won't run in legacy browsers or with older node versions. The following algorithms are being used:</p>
<ul>
<li><p><a target="_blank" href="https://en.wikipedia.org/wiki/Galois/Counter_Mode"><strong>AES-GCM</strong> (Advanced Encryption Standard - Galois/Counter Mode)</a> for symmetric encryption: This is used for the master key that encrypts/decrypts all file chunks and the data stored in the database.</p>
</li>
<li><p><a target="_blank" href="https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm"><strong>ECDSA</strong> (Elliptic Curve Digital Signature Algorithm)</a> for asymmetric encryption: This is used to sign the file chunk keys in order to make sure the later download request is allowed to access a specific chunk file.</p>
</li>
</ul>
<p>The Web Crypto API offers a set of low-level cryptographic primitives. On top of those, I created some <a target="_blank" href="https://github.com/stophecom/sharrr-svelte/blob/main/src/lib/crypto.ts">helper functions</a> that might be useful to others.</p>
<h2 id="heading-resources">Resources</h2>
<p>This project is heavily inspired by a great online community and amazing open-source projects:</p>
<ul>
<li><p><a target="_blank" href="http://hat.sh">hat.sh</a> - A client-side file encryption project</p>
</li>
<li><p><a target="_blank" href="https://proton.me/blog/protondrive-security">Proton Drive security model explained</a> (Blog)</p>
</li>
<li><p><a target="_blank" href="https://github.com/mozilla/send">Firefox Send</a> (Archived Repo)</p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/watch?v=SdePc87Ffik">Thomas Konrad on end-to-end encryption</a> (Video)</p>
</li>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API">MDN Docs about Web Crypto API</a></p>
</li>
<li><p>Sharrr is <a target="_blank" href="https://github.com/stophecom/sharrr-svelte">open source on GitHub</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Side projects]]></title><description><![CDATA[Side projects are somewhat comparable to child's play: There is no real purpose and there are no fixed rules. They offer a playground to explore ideas, learn new technologies and develop new skills. The best part: You may fail anytime. That is a bit ...]]></description><link>https://blog.stophe.com/side-projects</link><guid isPermaLink="true">https://blog.stophe.com/side-projects</guid><category><![CDATA[side project]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Sat, 19 Mar 2022 16:36:11 GMT</pubDate><content:encoded><![CDATA[<p>Side projects are somewhat comparable to child's play: There is no real purpose and there are no fixed rules. They offer a playground to explore ideas, learn new technologies and develop new skills. The best part: You may fail anytime. That is a bit misleading of course, since you yourself define what success or failure means. Important is what you can take away in the process. This blog post is a <strong>pamphlet for side projects</strong>, a call to stop working full time and start a side project in the time gained.</p>
<h2 id="heading-work-but-not-work">Work, but not work</h2>
<p><strong>Work projects</strong> are fundamentally different from side projects. This fact can be  summarized with three words: <strong>demands, dependencies, deadlines</strong>. In <em>work projects</em> there are usually many people involved and the requirements leave very little creative freedom. The influence you have on the timeline, the technology and the outcome is very limited. </p>
<p><strong>Side projects</strong> on the other hand are quite the opposite: It starts with just an idea and you are in charge of everything that comes from it. The only limit is your own curiosity. You do the research, choose the technology and the tools, define the timeline. There is no legacy code base, there are no stakeholders. It's a blank sheet of paper: For a developer, the perfect opportunity to explore the latest framework, design trend, or SaaS solution.</p>
<h2 id="heading-it-all-starts-with-a-domain">It all starts with a domain</h2>
<p>My domain registrar of choice (The one with the "No Bullshit" promise) had a great headline once. I can't recall the exact wording, but it was something along these lines: "<strong>Great things start here</strong>". I loved that heading - it perfectly captured that feeling when you have an idea on your mind and need the right (domain) name for it. Now, over the years, I visited that website many times, buying way too many domain names in the process. Full disclosure, most of them didn't last long 🤷. </p>
<p><strong>However, here is the list of my currently owned and active domains, aka. side projects</strong>: (Order of domain registration date, newest first)</p>
<h3 id="heading-sharrrcom">sharrr.com</h3>
<p>I bought this domain to test the file transfer functionality from scrt.link/files as a separate product. (This is work in progress)</p>
<h3 id="heading-sthttpsst"><a target="_blank" href="https://🤫.st">🤫.st</a></h3>
<p>I always wanted to own an emoji domain. This one is just an alternative domain for scrt.link</p>
<h3 id="heading-scrtlink">scrt.link</h3>
<p>With scrt.link you can share sensitive information online. End-to-end encrypted. One time. I wrote more on why I created scrt.link in another <a target="_blank" href="https://blog.stophe.com/why-i-created-scrtlink">blog post</a>.</p>
<h3 id="heading-klybeckwtfklybeckwtf"><a target="_blank" href="klybeck.wtf">klybeck.wtf</a></h3>
<p>Ok, this is more of a (insider) joke. This won't last.</p>
<h3 id="heading-santihanscom">santihans.com</h3>
<p>A couple years ago I created a company to have a legal framework for all my projects and consulting activities. Not much to see there.</p>
<h3 id="heading-madeinbaselorg">madeinbasel.org</h3>
<p>Started this initiative to support local businesses from Basel, Switzerland. Unfortunately this projects never took off due to lack of time and resources. </p>
<h3 id="heading-stophecom">stophe.com</h3>
<p>This is my personal website. You will find a showcase with many more side projects.</p>
<h3 id="heading-kingchillercom">kingchiller.com</h3>
<p>I just kept that domain because it was one of the first domains I bought 😄. The contents changed many times. Currently you can experience a brief "scroll story" experiment.</p>
<h2 id="heading-you-should-still-have-a-hobby">You should still have a hobby</h2>
<p>As you might have noticed until now, I love side projects. But I still want to add a note of caution. I'm not promoting side projects to be a replacement for hobbies - it can't replace recreational activities. At most, it is improving your general satisfaction you get from "work". Don't sacrifice personal time meant for family, friends, workouts or whatever - it's not worth it. Work part time if you can. Or ask your employer to provide a regular time slot for side projects within regular working hours. Or both.</p>
<h2 id="heading-everybody-wins">Everybody wins</h2>
<p>In the intro I compared side projects to child's play. If side projects were a game, it would be one where everybody wins. <strong>You win</strong> because you grow intellectually, are more satisfied, and more skilled.  <strong>Your employer wins</strong>, because you are not only a happier employee, but one that provides additional knowledge, inputs and insights to the whole team. Sometimes, a side project even becomes a real product.</p>
<h2 id="heading-tldr">Tl;dr:</h2>
<p>Side projects help you stay up-to-date with latest technology, make you happier and more creative. Stop writing down your ideas on lists - start a side project now.</p>
]]></content:encoded></item><item><title><![CDATA[Scrt.link for Slack]]></title><description><![CDATA[It's a very common scenario: A coworker asks you for some access token, API key or password on Slack. You feel the sudden unease because you are aware of the potential security implications, but eventually, you still reply. Because "what the hell", b...]]></description><link>https://blog.stophe.com/scrtlink-for-slack</link><guid isPermaLink="true">https://blog.stophe.com/scrtlink-for-slack</guid><category><![CDATA[Productivity]]></category><category><![CDATA[slack]]></category><category><![CDATA[Security]]></category><category><![CDATA[privacy]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Wed, 15 Dec 2021 21:36:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1639602822283/g9Ha2FgWZ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It's a very common scenario: A coworker asks you for some access token, API key or password on Slack. You feel the sudden unease because you are aware of the potential security implications, but eventually, you still reply. Because "what the hell", better than email, right? Well, not really. It's important to understand that Slack conversations are never fully private. A system administrator (or your boss) can potentially access and read all your Slack messages, even the private ones. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639602527397/AGpbWcoKq.png" alt="slack-interface-illustration.png" /></p>
<p>We have a very simple and convenient solution for this problem: With the  <a target="_blank" href="https://scrt.link/slack">Scrt.link Slack App</a> you can create one-time secrets right from within your conversations. Only a reference link stays in your chat history. After the secret link has been clicked once, it self destructs and is not accessible anymore. The secret is destroyed for good and a 🔥 emoji is added automatically to indicate that.</p>
<h2 id="heading-how-to-use">How to use</h2>
<p>👉 <a target="_blank" href="https://slack.scrt.link/slack/install">Install the Slack App</a> </p>
<p>After you have installed the app, there is not much more to do. </p>
<h3 id="heading-slash-commands">Slash Commands</h3>
<p>You can now create secrets via Slash Commands. Where ever you are, just type:</p>
<pre><code class="lang-js">    /scrt <span class="hljs-comment">//opens a dialog to create a secret.</span>
    /scrt [secret goes here…] <span class="hljs-comment">//creates a secret link instantly (of type Text).</span>
    /scrt [text|link|neogram] <span class="hljs-comment">//opens a dialog to create a specific type of secret.</span>
    /scrt help <span class="hljs-comment">//opens a help dialog.</span>
</code></pre>
<h3 id="heading-shortcuts">Shortcuts</h3>
<p>Just click the ⚡️ icon and choose <strong>Scrt.link</strong>. If you are inside a conversation you can also use the context menu (3 dots) and select <strong>Reply with a secret</strong>. After that, just use the form.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639602936572/tYhKx10Sv.png" alt="slack-screenshot-create.png" /></p>
<h4 id="heading-important-information-about-security-limitations-of-the-slack-app">Important information about security limitations of the Slack App</h4>
<p><em>Due to the nature of how Slack apps are designed, full end-to-end encryption is not possible. We take a number of steps to make sure your secrets are safe, including encrypted connections, sandboxed application server, limited access to infrastructure, etc. In 99% of use cases this is fine and a risk worth taking - still, Slack is proprietary software where we don't have control over. In other words, if you need advanced protection, create secrets on the website instead.</em></p>
<h2 id="heading-spread-some-love">Spread some Love</h2>
<ul>
<li><a target="_blank" href="https://scrt.link/slack">Learn more about the Slack App</a> </li>
<li><a target="_blank" href="https://www.producthunt.com/posts/scrt-link-for-slack">Upvote on ProductHunt</a></li>
<li><a target="_blank" href="https://twitter.com/scrtLink">Follow on Twitter</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Scrt.link vs. One-Time Secret]]></title><description><![CDATA[When it comes to sharing sensitive information online you will sooner or later come across https://onetimesecret.com. In fact, One-Time Secret ranks #1 for many Google search queries related to sharing secrets online. According to their website over ...]]></description><link>https://blog.stophe.com/scrtlink-vs-one-time-secret</link><guid isPermaLink="true">https://blog.stophe.com/scrtlink-vs-one-time-secret</guid><category><![CDATA[Security]]></category><category><![CDATA[privacy]]></category><category><![CDATA[server]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Mon, 13 Dec 2021 22:49:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1639435647128/37z4rVGiZ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to sharing sensitive information online you will sooner or later come across https://onetimesecret.com. In fact, One-Time Secret ranks #1 for many Google search queries related to sharing secrets online. According to their website <em>over 50,000 secrets a month</em> are being shared via the platform. And just for context, as of 2021, the site has been <strong>up and running for over a decade</strong>. Sounds great, right? Yes, but there is a catch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639429776675/CyWisj4vl.png" alt="image.png" />
<em>Screenshot from 2011 via <a target="_blank" href="http://web.archive.org/web/20111220213636/https://onetimesecret.com/">Archive.org</a></em></p>
<p>Now, for many years the site has been my go-to tool whenever I had to send a password to a coworker. But then, one day, I decided to create my own version of such a tool. (For context, there is a blog post that describes in detail <a target="_blank" href="https://blog.stophe.com/why-i-created-scrtlink">why I created scrt.link</a>.)</p>
<h2 id="heading-a-great-source-of-inspiration">A Great Source of Inspiration</h2>
<p>When you visit https://onetimesecret.com for the first time, it becomes obvious that the creators don't intend to follow web design trends. And I mean this in a positive way: The website is, above all, practical - it offers a simple interface to help you do one specific thing: Create one time secrets. It's a <strong>unpretentious, fast and responsive website without overhead, distraction or ads</strong>. It's clearly a project run by idealists not incentivized by selling out its users. To me, it is also a reminder that the web is (still) a great place.</p>
<h2 id="heading-the-one-big-caveat">The One Big Caveat</h2>
<p>Now, after digging  the topic of secure disposable messaging and analyzing the website from a security perspective, I came to notice <strong>one big flaw</strong>: Messages are not end-to-end encrypted.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639431540499/9JwHfbAPd.png" alt="onetimesecret-1.png" /></p>
<p>As you can see in the screenshot. A secret is <strong>sent in plain text</strong> to the server. That doesn't mean everybody in the network can just eavesdrop on your message. The connection is still secured with HTTPS. But this fact opens the door for potential vulnerabilities. </p>
<p>What it means is that the backend (server) receives your secret in plain text - in other words, as a user you have to <strong>100% trust the service</strong>. And even if you do, a successful attack on the server may still compromise your confidential data. (It is noteworthy that One-Time Secret doesn't  <a target="_blank" href="https://onetimesecret.com/info/privacy">hide that fact</a>).</p>
<h2 id="heading-time-for-change">Time for Change</h2>
<p>I believe that <strong>no one, including the service provider, should be trusted</strong> when it comes to handling personal secrets. That's why we created our service not only 100% open source, but also in way that minimizes potential risk. We use <strong>end-to-end encryption</strong>, where a secret gets encrypted and decrypted in the browser (where you have full access to the code that runs the website).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639433851172/GyMZeEueV.png" alt="scrt-link.png" />
You will notice in the screenshot that the secret is already encrypted before it gets posted to the server. (You can check for yourself. Just open the network tab in the DevTools and checkout the POST request to the API) </p>
<p> <a target="_blank" href="https://scrt.link">Give it a try!</a> </p>
<h3 id="heading-other-alternatives">Other Alternatives</h3>
<p>To be transparent, scrt.link is only one among many tools that can be used as alternatives to One-Time Secret. Some of them have similar security features. Try for yourself.</p>
<ul>
<li>https://privatebin.info/</li>
<li>https://yopass.se/</li>
<li>https://1ty.me/</li>
<li>https://www.saltify.io/en/ </li>
<li>https://password.link/</li>
<li>https://privnote.com/</li>
<li>https://pwpush.com/</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Scrt.link is built for developers.]]></title><description><![CDATA[I previously wrote about why I created scrt.link - now here is a follow-up especially for developers who might be interested in the project. scrt.link was always open source, but it has been structured in a way that made it hard understand what's goi...]]></description><link>https://blog.stophe.com/scrtlink-is-built-for-developers</link><guid isPermaLink="true">https://blog.stophe.com/scrtlink-is-built-for-developers</guid><category><![CDATA[npm]]></category><category><![CDATA[Security]]></category><category><![CDATA[APIs]]></category><category><![CDATA[privacy]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Sat, 31 Jul 2021 19:15:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1627758211822/nPJtlvqxJ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I previously wrote about <a target="_blank" href="https://blog.stophe.com/why-i-created-scrtlink">why I created scrt.link</a> - now here is a follow-up especially for developers who might be interested in the project. scrt.link was always open source, but it has been structured in a way that made it hard understand what's going on behind the scenes (one big repo). As a first step towards better (code) accessibility I extracted core functionalities into a developer friendly npm package. Not only can everybody better understand how this product works, it also <strong>allows developers to use this service programmatically</strong> within their own projects.</p>
<p>For context, sharing information in a truly secure way is harder than you'd think. You can only guarantee confidentiality with <strong>end-to-end encryption</strong>. In other words, the information you want to transmit has to be encrypted and decrypted <strong>on the client</strong>. This means you can't just create a secure server infrastructure and offer a public API - you also need code executed on the client. The good news is, you can now just do that.</p>
<p><a target="_blank" href="https://www.npmjs.com/package/scrt-link-core">scrt-link-core</a> has just been published.  Use it in your project. It's free.</p>
<h2 id="heading-installation">Installation</h2>
<p>In any node based environment you can just install the package like this:</p>
<pre><code class="lang-bash">yarn add scrt-link-core
<span class="hljs-comment"># or: npm i scrt-link-core</span>
</code></pre>
<h2 id="heading-basic-usage">Basic usage</h2>
<p>The heart of the package is the <code>createSecret</code> function that handles the encryption of the secret, as well as the communication with the API. It returns an object containing <code>secretLink</code>.  (This package assumes that you use scrt.link as your backend, but it's not mandatory - feel free to create your own backend. See <a target="_blank" href="https://gitlab.com/kingchiller/scrt-link">scrt-link</a> for reference code.)</p>
<pre><code><span class="hljs-keyword">import</span> { createSecret } <span class="hljs-keyword">from</span> <span class="hljs-string">"scrt-link-core"</span>;

<span class="hljs-keyword">const</span> { secretLink } = <span class="hljs-keyword">await</span> createSecret(<span class="hljs-string">"Some confidential information…"</span>);
<span class="hljs-comment">// https://scrt.link/l#hLN8e0jd6xtLuxJqDxp1D/Q4rqaOWQtzFTZIB-7TXEYD2NgI9E1KQdeMXdfsvPykI</span>
</code></pre><h3 id="heading-via-hosted-es-modules">Via (hosted) ES Modules</h3>
<p><strong>Now wait</strong> - before you think it's too much trouble - you don't even need to install any package. With e.g. <a target="_blank" href="https://skypack.dev/">Skypack</a> it's possible to literally create a secret link with just two lines of code - wherever you need it. Just drop the following snipped into your HTML:</p>
<pre><code class="lang-js">&lt;script type=<span class="hljs-string">"module"</span>&gt;
  <span class="hljs-keyword">import</span> { createSecret } <span class="hljs-keyword">from</span> <span class="hljs-string">"https://cdn.skypack.dev/scrt-link-core"</span>;

  createSecret(<span class="hljs-string">"Some confidential information…"</span>).then(<span class="hljs-function">(<span class="hljs-params">{ secretLink }</span>) =&gt;</span> {<span class="hljs-built_in">console</span>.log(secretLink)});
<span class="hljs-comment">// https://scrt.link/l#hLN8e0jd6xtLuxJqDxp1D/Q4rqaOWQtzFTZIB-7TXEYD2NgI9E1KQdeMXdfsvPykI</span>
&lt;/script&gt;
</code></pre>
<p>For more information and examples read the <a target="_blank" href="https://www.npmjs.com/package/scrt-link-core">full documentation</a>.</p>
<p>All code is open source and on <a target="_blank" href="https://gitlab.com/kingchiller/scrt-link-core">Gitlab</a>.</p>
<p>Feedback is very welcome :)</p>
]]></content:encoded></item><item><title><![CDATA[Why I created scrt.link]]></title><description><![CDATA[It all started with the idea to send private messages (in a fun way). Messages that don't persist. Think Snapchat, but without giving away your user data. As with all ideas, after some research you realize - it's all there on the web: The first setba...]]></description><link>https://blog.stophe.com/why-i-created-scrtlink</link><guid isPermaLink="true">https://blog.stophe.com/why-i-created-scrtlink</guid><category><![CDATA[Web Development]]></category><category><![CDATA[webdev]]></category><category><![CDATA[privacy]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Chris]]></dc:creator><pubDate>Tue, 29 Jun 2021 20:36:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1624997958443/gQL4XLYUU.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It all started with the <strong>idea to send private messages</strong> (in a fun way). Messages that don't persist. Think Snapchat, but without giving away your user data. As with all ideas, after some research you realize - it's all there on the web: The first setback. Luckily, I wasn't satisfied entirely with what I found. Yes, all these products (<em>onetimesecret, yopass, privnote, privatebin</em>, etc.) are great. They all have something to offer and are inspiring in many ways: Some have great privacy or security concepts, others have great UI. However, I wanted the combination of all the good features. And, most importantly, I wanted the tool to be fun. UX might be the area, where I can add value.</p>
<p>The idea grew into a project that could be summarized as "<em>Sharing secrets as a service</em>". 
Like all side projects, the beginning is easy. In fact, the prototype was online after one weekend: A domain, a fully functional website, database, even the logo was there. </p>
<p>That's when you enter phase two. You start thinking about your project all the time: <em>This feature</em> would be fun, <em>that part</em> should be refactored - oh what about <em>monetization</em> - I want to cover the costs for the infrastructure. Wait a second, I need <em>user accounts</em> for that. Hm, now shouldn't I add <em>terms</em> and a proper <em>privacy policy</em>? Did I choose the right framework to start with? These thoughts are the reason, side projects hardly ever make it beyond the prototype :) I guess, thanks to the pandemic, I stayed focused: Three months later I felt comfortable to post the project on producthunt. Not that I expected much - I just wanted to get some early reactions. That's basically where we are today.</p>
<h2 id="heading-status-quo">Status quo</h2>
<p>The current status of the project:</p>
<p><strong>Scrt.link is a tool to share sensitive information online:</strong> End-to-end-encrypted messages that are shared with a one-time link. There are 3 secret <em>types</em> you can share (<em>secret files</em> are in consideration):</p>
<p><strong>Text</strong>: This is the standard mode. It's the preferred way to share passwords and similar kind of secrets. The recipient has the option to copy the secret.<br /><strong>Link</strong>: Think about it as a URL-shortener where the generated link only works once.<br /><strong>Neogram™</strong>: Digital letter-style message that automatically burns after reading. Use it for confidential notes, confessions or secret love letters.</p>
<p>There are <strong>browser extensions</strong> available for all major browsers and (free &amp; paid) user accounts for power users and/or supporters. There is a Twitter account. </p>
<p>At the point of writing 778 secrets have been created. 42 upvotes on producthunt. 1 paying customer.</p>
<h2 id="heading-whats-next">What's next?</h2>
<p>Since I created this project out of curiosity and with the only intention to learn something, it has been a great success. I've became knowledgeable in previously unfamiliar areas (backend, database, privacy, marketing). I'm still very much in love with this project and I believe it has value, maybe even potential to grow. However, looking only at the numbers, one would consider it a failure, leading to the conclusion that my time is better spent elsewhere. </p>
<p>I'd be happy for ideas, thoughts, wisdom, …</p>
<p>Best 
Chris</p>
]]></content:encoded></item></channel></rss>