<?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>Forem: Levminer</title>
    <description>The latest articles on Forem by Levminer (@levminer).</description>
    <link>https://forem.com/levminer</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F556740%2F38a681df-7e87-4700-8f3b-e7e928bba1c7.png</url>
      <title>Forem: Levminer</title>
      <link>https://forem.com/levminer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/levminer"/>
    <language>en</language>
    <item>
      <title>It's time to kill your GPG agent - Git SSH code signing</title>
      <dc:creator>Levminer</dc:creator>
      <pubDate>Wed, 31 Aug 2022 07:59:31 +0000</pubDate>
      <link>https://forem.com/levminer/its-time-to-kill-your-gpg-agent-git-ssh-code-signing-25ka</link>
      <guid>https://forem.com/levminer/its-time-to-kill-your-gpg-agent-git-ssh-code-signing-25ka</guid>
      <description>&lt;p&gt;Last week GitHub finally released &lt;a href="https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/"&gt;SSH code signing&lt;/a&gt;. Git introduced signing with an SSH key almost a &lt;a href="https://github.blog/2021-11-15-highlights-from-git-2-34/#tidbits"&gt;year ago&lt;/a&gt;. Technically you could use SSH code signing before, but GitHub just displayed a scary "Unverified badge".&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages of code signing
&lt;/h2&gt;

&lt;p&gt;If you contribute to big open source projects most of them make code signing required. Why? &lt;/p&gt;

&lt;p&gt;You can impersonate &lt;strong&gt;anyone&lt;/strong&gt; with Git, by design. 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;git -c user.name='Linus Torvalds' -c user.email='torvalds@linux-foundation.org' commit -m "hi"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you commit something on GitHub it will show up as something Linux Torvalds committed. Check out this &lt;a href="https://dev.to/martiliones/how-i-got-linus-torvalds-in-my-contributors-on-github-3k4g"&gt;article&lt;/a&gt; for more information on this topic. Why is this not dangerous? Because of code signing, if you sign your code others can be 100% sure it was you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SSH over GPG?
&lt;/h2&gt;

&lt;p&gt;There are a couple of valid points I think.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On Windows GPG signing is &lt;em&gt;terrible&lt;/em&gt;, you can find countless StackOverflow threads about errors and bugs. My GPG agent likes to die at least once a week. Then I have to kill the agent, restart it, try committing again, it still doesn't work, restart it again and finally, it works. It's &lt;strong&gt;VERY&lt;/strong&gt; annoying.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can use the same SSH key for authentication and signing, so you don't have to deal with two separate keys.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;These commands &lt;em&gt;should&lt;/em&gt; work on Windows, Linux and macOS if you use Git Bash (If you have trouble with &lt;strong&gt;~&lt;/strong&gt; on Windows, use relative paths).&lt;/p&gt;

&lt;p&gt;Let's generate a new key (you can use existing SSH keys):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "email@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can choose where you want to save the file and the file name, I recommend the defaults. And you will be prompted for a password. If you accepted the default options your key should be in &lt;code&gt;~/.ssh&lt;/code&gt;. Now add your new key to the ssh-agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see an error your ssh-agent might not be running, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval "$(ssh-agent -s)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's configure the Git integration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global gpg.format ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now copy the contents of the &lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt; public key file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.signingkey 'ssh-ed25519 AAAAC3... email@example.com'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Uploading the key to GitHub
&lt;/h2&gt;

&lt;p&gt;Now navigate to your &lt;a href="https://github.com/settings/keys"&gt;GitHub settings&lt;/a&gt;. Click add New SSH key. Make sure you select &lt;strong&gt;Signing key&lt;/strong&gt;. And paste in the contents of the public key file.&lt;/p&gt;

&lt;p&gt;Now push a commit to a repo, click on the commit and you will se a nice verified badge. You can verify the fingerprint with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-lf&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Revoking the old GPG key
&lt;/h2&gt;

&lt;p&gt;If you want you can revoke your old GPG easily.&lt;/p&gt;

&lt;p&gt;List your current keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --list-keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need your public key id in the first line, something like: &lt;code&gt;ABCD1234&lt;/code&gt;, then revoke your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --output revoke.asc --gen-revoke key 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the revoke certificate you saved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --import revoke.asc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have successfully revoked your key in your keyring, now you have to delete the &lt;em&gt;same&lt;/em&gt; GPG key in your GitHub account and upload it again. If you did everything right take a look at an old commit and you will see a nice orange "Revoked" badge.&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Tauri VS. Electron - Real world application</title>
      <dc:creator>Levminer</dc:creator>
      <pubDate>Mon, 22 Aug 2022 11:43:00 +0000</pubDate>
      <link>https://forem.com/levminer/tauri-vs-electron-real-world-application-eah</link>
      <guid>https://forem.com/levminer/tauri-vs-electron-real-world-application-eah</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This was originally published on &lt;a href="https://www.levminer.com/blog"&gt;my blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article I'm going to compare Electron and Tauri using a real world app: &lt;a href="https://authme.levminer.com"&gt;Authme&lt;/a&gt;. Authme is a Simple cross-platform two-factor authenticator app for desktop. It's not a big app and not very complex, perfect for a little comparison. You can take a look at the source code of the Electron app &lt;a href="https://github.com/Levminer/authme"&gt;here&lt;/a&gt; and the Tauri app &lt;a href="https://github.com/Levminer/authme-v4"&gt;here&lt;/a&gt;. My goal it that the Tauri app eventually replaces the Electron one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Electron app architecture
&lt;/h3&gt;

&lt;p&gt;What is Electron?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Electron is a framework for creating native applications with web technologies like JavaScript, HTML, and CSS. It takes care of the hard parts so you can focus on the core of your application. If you can build a website, you can build a desktop app. - electronjs.org&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;App architecture&lt;/p&gt;

&lt;p&gt;The Electron app is written in plain-old HTML and JavaScript. For styling I'm using TailwindCSS and a costume stylesheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tauri app architecture
&lt;/h3&gt;

&lt;p&gt;What's Tauri?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tauri is a framework for building tiny, blazingly fast binaries for all major desktop platforms. Developers can integrate any front-end framework that compiles to HTML, JS and CSS for building their user interface. The backend of the application is a rust-sourced binary with an API that the front-end can interact with. - Tauri GitHub&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Architecture&lt;/p&gt;

&lt;p&gt;The Tauri app is using more modern staff. The build tool is Parcel, the framework is Svelte, and of course TypeScript instead of JavaScript. The styling is done with TailwindCSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;

&lt;p&gt;This is not a head-to-head comparison, but the app is basically the same.&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bundle&lt;/li&gt;
&lt;li&gt;Startup time&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;App backend&lt;/li&gt;
&lt;li&gt;Rendering your app&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Auto update&lt;/li&gt;
&lt;li&gt;Developer experience&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Bundle
&lt;/h3&gt;

&lt;p&gt;We have a clear winner here: Tauri&lt;/p&gt;

&lt;p&gt;The Tauri app installer is around ~2,5MB (!!!), while the Electron app installer is around ~85MB.&lt;/p&gt;

&lt;p&gt;Full bundle size:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ucZc92vZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/tauri-bundle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ucZc92vZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/tauri-bundle.png" alt="Tauri bundle" width="880" height="352"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Viw-LETn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/electron-bundle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Viw-LETn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/electron-bundle.png" alt="Electron bundle" width="880" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One major advantage that Tauri has: The app is compiled to a binary, which means you have to be an expert at reverse engineering to be able to de-compile the app. With Electron you can unpack the app with a simple &lt;a href="https://medium.com/how-to-electron/how-to-get-source-code-of-any-electron-application-cbb5c7726c37"&gt;NPM command&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if your user has the correct runtime for the webview used by Tauri you can just send them a single executable, they don't have to install anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Startup time
&lt;/h3&gt;

&lt;p&gt;This is not a scientific test but running the apps and timing the startup yields a clear winner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Tauri: ~ 2 seconds&lt;/li&gt;
&lt;li&gt;  Electron: ~ 4 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Performance
&lt;/h3&gt;

&lt;p&gt;This is not a scientific test again, just a rough comparison. These tests are from my PC: i5-4570 CPU, 16GB RAM, GTX 1660 and Windows 11&lt;/p&gt;

&lt;p&gt;Tauri (Windows)&lt;br&gt;
| Test | CPU | RAM     | GPU |&lt;br&gt;
| -----| --- | ------- | --- |&lt;br&gt;
| Idle | 1%  | ~ 80MB  | 0%  |&lt;/p&gt;

&lt;p&gt;Electron (Windows)&lt;br&gt;
| Test | CPU | RAM     | GPU |&lt;br&gt;
| ---- | --- | ------- | --- |&lt;br&gt;
| Idle | 1%  | ~ 120MB | 0%  |&lt;/p&gt;

&lt;p&gt;Honestly I expected more from Tauri, sure it uses less RAM, but not by much. Let's take a look at what's up on the Linux side.&lt;/p&gt;

&lt;p&gt;Tauri&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lDnBexiO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/tauri-linux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lDnBexiO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/tauri-linux.png" alt="Tauri" width="880" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Electron&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gvBLJR5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/electron-linux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gvBLJR5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.levminer.com/blog/tauri-vs-electron/electron-linux.png" alt="Electron" width="880" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wow, thats a big win for Tauri!&lt;/p&gt;

&lt;h3&gt;
  
  
  4. App backend
&lt;/h3&gt;

&lt;p&gt;Now here comes one of the disadvantages of Tauri (or its biggest advantage, I guess it depends on you). In your Electron app you write your app backend in JavaScript, because Electron uses the Node.js runtime. Tauri on the other hand is written in Rust. Now if you know Rust your probably happy, but if you have to learn Rust from scratch (like me) you are going to face some issues.&lt;/p&gt;

&lt;p&gt;You have to rewrite your app's backend in Rust, so I think the winner in Electron here. For now. Alternative bindings for your backend are on Tauri's roadmap, like Python, C++, or Deno. Personally I'm exited for the Deno integration so I can write my app backend in JavaScript/TypeScript again.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Rendering your app
&lt;/h3&gt;

&lt;p&gt;Electron uses Chromium under the hood so your user sees the same on Windows, Linux and macOS. Tauri on the other hand uses the system webview: Edge Webview2 (Chromium) on Windows, WebKitGTK on Linux and WebKit on macOS. Now here comes the bad part, if you are a web developer you know that Safari (Based on WebKit) is always behind a step from every web browser. Just check out &lt;a href="https://caniuse.com/"&gt;Can I Use&lt;/a&gt;. There is always a bug that you are not seeing from Chrome, only your dear Safari users. The same issues exists in Tauri, and you can't do anything against it, you have include polyfills. The winner has to be Electron here.&lt;/p&gt;

&lt;p&gt;One issue I had while developing Tauri is that my CSS bundle didn't include &lt;code&gt;-webkit&lt;/code&gt; prefixes, so my app's CSS was very buggy.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Security
&lt;/h3&gt;

&lt;p&gt;Tauri is very secure by default, on the other hand I can't say the same about Electron. Tauri has many &lt;a href="https://tauri.app/about/security"&gt;security&lt;/a&gt; features built-in by default. You can even explicitly enable or disable certain APIs. With Electron you have full access to Node APIs, so a hacker could easily exploit the very powerful Node APIs. This not the case with Tauri, you have to explicitly expose the Rust functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Auto update
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y7EUectC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgs.xkcd.com/comics/update.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y7EUectC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgs.xkcd.com/comics/update.png" alt="Auto update comic" width="602" height="249"&gt;&lt;/a&gt; xkcd.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Shipping an app without auto update in 2022 is a no go. If your user has to manually download every update I don't think they are going to be happy.&lt;br&gt;
Both Electron and Tauri has a built-in auto updater, but the Tauri one is so much simpler.&lt;br&gt;
So the winner is Tauri here.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Developer experience
&lt;/h3&gt;

&lt;p&gt;In Tauri you get the whole package just by installing the Tauri CLI: Hot reload, building your app for all platforms, generating app icons. Electron gives you nothing, just the framework itself. You have setup hot reloading, bundling your app etc... Tauri takes care of everything for you. And here comes the best: Tauri is compatible with every web framework on earth. It just expects a localhost url or a folder where all your bundled code lives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Electron is being replaced? Yes, Tauri is way better, but it still misses a lot. In a couple of years I'm sure the Tauri team will catch app to Electron.&lt;/p&gt;

&lt;p&gt;Thanks for reading my first article! I'm not a native english speaker, so sorry for mistakes.&lt;/p&gt;

&lt;p&gt;This was originally published on &lt;a href="https://www.levminer.com/blog"&gt;my blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also follow me on &lt;a href="https://twitter.com/levminer92"&gt;Twitter&lt;/a&gt; if you liked this article.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Authme 3.0.0 released!</title>
      <dc:creator>Levminer</dc:creator>
      <pubDate>Thu, 30 Dec 2021 13:31:18 +0000</pubDate>
      <link>https://forem.com/levminer/authme-300-released-49a5</link>
      <guid>https://forem.com/levminer/authme-300-released-49a5</guid>
      <description>&lt;h3&gt;
  
  
  Authme
&lt;/h3&gt;

&lt;p&gt;Simple cross platform two-factor authentication app for desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mTjNSRin--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2cjgfa10lljrb0jaqbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mTjNSRin--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2cjgfa10lljrb0jaqbw.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Download
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://authme.levminer.com"&gt;Website&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/levminer/authme"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Release notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;2021.12.28. (Standard update)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Breaking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;#154 Deprecate old encryption method&lt;/li&gt;
&lt;li&gt;#155 Deprecate .txt import/export file format&lt;/li&gt;
&lt;li&gt;#158 New folder structure&lt;/li&gt;
&lt;li&gt;#172 Remove backup key restore&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Feature
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;#58 macOS support&lt;/li&gt;
&lt;li&gt;#141 Import from camera&lt;/li&gt;
&lt;li&gt;#152 Support .authme import/export file format&lt;/li&gt;
&lt;li&gt;#157 Auto update&lt;/li&gt;
&lt;li&gt;#159 New title bar&lt;/li&gt;
&lt;li&gt;#164 Default display&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Improvement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;#129 Accessibility improvements&lt;/li&gt;
&lt;li&gt;#156 Improved window content protection&lt;/li&gt;
&lt;li&gt;#160 Lock Authme when PC goes to sleep or locked&lt;/li&gt;
&lt;li&gt;#166 Faster 2FA code rendering&lt;/li&gt;
&lt;li&gt;#169 Remove splash screen&lt;/li&gt;
&lt;li&gt;#170 Improved startup speed&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Authme Web</title>
      <dc:creator>Levminer</dc:creator>
      <pubDate>Sat, 09 Jan 2021 19:55:33 +0000</pubDate>
      <link>https://forem.com/levminer/authme-web-340d</link>
      <guid>https://forem.com/levminer/authme-web-340d</guid>
      <description>&lt;h2&gt;
  
  
  What I built:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Authme Web. Authme Web is the Web/PWA version of my cross platform two-factor authentication desktop app &lt;a href="https://web.authme.levminer.com"&gt;Authme&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built for Business&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  App Link:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.authme.levminer.com"&gt;Authme Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Screenshots:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desktop: &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z9ceVFvU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wad8y5pnetuh4yp7jayg.jpg" alt="Authme Web" width="880" height="703"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mobile: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dRjIDls_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8lgauh8ll6cnz7j63wsk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dRjIDls_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8lgauh8ll6cnz7j63wsk.jpg" alt="Authme Web Mobile" width="399" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Description:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Web app for Authme the cross-platform two-factor authentication app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;See all of your 2FA codes in your web browser. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save your codes inside your browser secured by AES256 encryption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's a PWA so you can install it on your phone for better experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use this &lt;a href="https://github.com/Levminer/authme/blob/main/sample/authme_import_sample.zip?raw=true"&gt;Sample file&lt;/a&gt; or import from &lt;a href="https://github.com/Levminer/authme"&gt;Authme&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Link to Source Code:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Levminer/authme-web/"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Levminer/authme-web/blob/main/LICENSE.md"&gt;MIT&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I made Authme a while back, but I needed to see my codes on my phone or in a browser. So I made this Web/PWA version of my desktop app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It's built on top of Ionic framwork with Ionic components. I decided to use it with Vue because I alredy know some things about it. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Beacause it's a standard Vue app after build, I'm simple deploying it as a static site on App Platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For testing use this: &lt;a href="https://github.com/Levminer/authme/blob/main/sample/authme_import_sample.zip?raw=true"&gt;Sample file&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dohackathon</category>
      <category>showdev</category>
      <category>vue</category>
      <category>ionic</category>
    </item>
  </channel>
</rss>
