<?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: Aero</title>
    <description>The latest articles on DEV Community by Aero (@aerocyber).</description>
    <link>https://dev.to/aerocyber</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%2F794663%2F00ad16ec-b951-4f86-b873-1725e18b973b.png</url>
      <title>DEV Community: Aero</title>
      <link>https://dev.to/aerocyber</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aerocyber"/>
    <language>en</language>
    <item>
      <title>It's 2025 - Why Is Offline File Sharing Still So Broken?</title>
      <dc:creator>Aero</dc:creator>
      <pubDate>Sat, 28 Jun 2025 02:24:11 +0000</pubDate>
      <link>https://dev.to/aerocyber/its-2025-why-is-offline-file-sharing-still-so-broken-1nij</link>
      <guid>https://dev.to/aerocyber/its-2025-why-is-offline-file-sharing-still-so-broken-1nij</guid>
      <description>&lt;p&gt;AI is writing code, smartphones rival space shuttles and we are streaming 8K from our wrists. But sharing a 200MB file with someone in the same room? Still broken. It's 2025. Why does offline file sharing still feel like a road left untouched?&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Most file sharing tools assume you are online&lt;/li&gt;
&lt;li&gt;In offline scenarios (classrooms, hackathons, outages), they fall apart&lt;/li&gt;
&lt;li&gt;Airdrop isn't cross platform, cloud tools require logins and USBs are unreliable - especially when transfers are between smartphones&lt;/li&gt;
&lt;li&gt;We need local first, P2P, open source solutions - built for real world collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Illusion of Cloud Convenience
&lt;/h2&gt;

&lt;p&gt;The "cloud-first" mindset is taking over the world. We have VS Code in cloud, Web mail, Web apps and even fully operational OS in cloud (looking at you Windows - how do you do that?!).&lt;br&gt;
It is cool, I get it. But not every interaction requires pushing your files to the cloud.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not every interaction requires the cloud.&lt;/li&gt;
&lt;li&gt;You shouldn't have to sign up just to send a file across the table.&lt;/li&gt;
&lt;li&gt;You shouldn't be forced to sign up for a service just to share one folder.
This shouldn't be happening. This shouldn't be complicated. Yet here we are.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  "But existing solutions just work!"
&lt;/h2&gt;

&lt;p&gt;Picture this: you are in the middle of a team sprint - maybe in a classroom, maybe a startup garage. You've got notes, screenshots, source code, and maybe some videos over 200 MB.&lt;br&gt;
You need to share it with your teammates. And the chaos just unfolds. So here is what happens next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone tries Airdrop. It fails as two of them use Windows.&lt;/li&gt;
&lt;li&gt;Someone pulls out a USB. Are you sure your other ports are free - with that wireless keyboard, mouse and other accessories? Or do you even have the right port?&lt;/li&gt;
&lt;li&gt;Someone tried Google Drive. Your teammate waits for it to sync. And boom, you hit the storage limits.&lt;/li&gt;
&lt;li&gt;Then comes Whatsapp. Your screenshots and videos get distorted beyond recognition.&lt;/li&gt;
&lt;li&gt;Then WiFi goes out.
Now what?
At this point, your team spends more time thinking how to share those files than work on the project. Why?
### Modern file sharing solutions assume you are always online. You are not. And you shouldn't be.
And that's a broken assumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Internet Isn't Always A Given
&lt;/h2&gt;

&lt;p&gt;Whether it's a college campus, a hackathon with 50 people on the same WiFi or a power outage in the hostel - you cannot count on internet access. But you &lt;em&gt;can&lt;/em&gt; count on LAN, mobile hotspot or ad-hoc WiFi.&lt;br&gt;
Yet most tools don't use that. They don't let you share device to device without a server or cloud between them. This is 2025. And that, is embarrassing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaboration Deserves Better
&lt;/h2&gt;

&lt;p&gt;We share more than ever - code, documents, media, designs - but our tools are stuck assuming we are always online. The truth? Many of us are not. Or just don't want to share online. Even when we are online, the process should be simple, fast, and privacy respecting - not mining our data for profit.&lt;br&gt;
We need a tool that is local first, internet optional. One that supports P2P file transfer or over WiFi, doesn't require sign ups or logins or cloud dependencies, works across platforms, all open source and auditable and optional encryption for peace of mind - especially in an enterprise workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Notes
&lt;/h2&gt;

&lt;p&gt;It's 2025. Offline collaboration is as broken as ever. We need something - something that fills this gap. Because right now, we aren't just living with broken tools - we're building on broken assumptions. We cannot assume people in the same room needs to be connected to the internet in order to share files.&lt;/p&gt;

&lt;p&gt;That assumption is broken. And it's holding us back&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Isar Database - Record Deletion in Flutter</title>
      <dc:creator>Aero</dc:creator>
      <pubDate>Sun, 28 Jan 2024 11:37:25 +0000</pubDate>
      <link>https://dev.to/aerocyber/isar-database-record-deletion-in-flutter-12fd</link>
      <guid>https://dev.to/aerocyber/isar-database-record-deletion-in-flutter-12fd</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;I have been doing a small project in Python for a while now. It's been called &lt;a href="https://github.com/aerocyber/sitemarker" rel="noopener noreferrer"&gt;Sitemarker&lt;/a&gt;. It is live in the &lt;a href="https://flathub.org/apps/io.github.aerocyber.sitemarker" rel="noopener noreferrer"&gt;Flathub &lt;/a&gt; app store. It's been fun and all but recently, I've been busy getting it rewritten in Flutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Flutter?
&lt;/h2&gt;

&lt;p&gt;I've been trying to get the entire program run on different platforms. First I tried web technologies to get it done. Sadly enough, my experience on the Web was not enough for the task. And, I was interested in learning Flutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core things
&lt;/h2&gt;

&lt;p&gt;I could get the entire code written in a few weeks. The UI was fine, and routings were doing good, until&lt;/p&gt;

&lt;h2&gt;
  
  
  Deletion of records
&lt;/h2&gt;

&lt;p&gt;Any insertion must have a deletion. It's a thing. However, in my case, every insertion &lt;em&gt;did&lt;/em&gt; have a deletion until the application closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issue
&lt;/h2&gt;

&lt;p&gt;Isar must have compaction to update the database to remove stale records. As with any great library, isar had &lt;em&gt;one&lt;/em&gt; issue on the topic. &lt;em&gt;Documentation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I'm not going to lie. Isar has good if not great, documentation. The issue I found though, is that there is literally &lt;em&gt;no guide&lt;/em&gt; for compacting an isar database. And I am new to local databases. MySQL did a good job making me comfortable with it. And I was practically close to completing the entire code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workaround.
&lt;/h2&gt;

&lt;p&gt;The workaround is a trick of sorts. When the deletion is called, it first deletes from the application runtime records. Then, said records that did &lt;em&gt;not&lt;/em&gt; have the record to be deleted were copied to a new variable. The database now is closed, with deletion enabled on database closure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deleteRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DBRecord&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;isar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;isar&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;writeTxn&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;isar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dBRecords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;_records&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="n"&gt;deleteWorkaround&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deleteWorkaround&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;recs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_records&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Get records.&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;isar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;isar&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;deleteFromDisk:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Close the db. Delete the db.&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;isarTemp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;openDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DBRecord&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;localRecords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="n"&gt;isarTemp&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;txn&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dbrecordCollection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isarTemp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dBRecords&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;localRecords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dbrecordCollection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;recs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;isarTemp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeTxn&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;isarTemp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dBRecords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="n"&gt;localRecords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;isarTemp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;notifyListeners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;notifyListeners();&lt;/code&gt; function is part of the &lt;code&gt;provider&lt;/code&gt; package for state management.&lt;/p&gt;

</description>
      <category>isar</category>
      <category>flutter</category>
    </item>
    <item>
      <title>Creating assertions for snap</title>
      <dc:creator>Aero</dc:creator>
      <pubDate>Mon, 17 Jan 2022 11:08:04 +0000</pubDate>
      <link>https://dev.to/aerocyber/creating-assertions-for-snap-4o8o</link>
      <guid>https://dev.to/aerocyber/creating-assertions-for-snap-4o8o</guid>
      <description>&lt;h2&gt;
  
  
  To the point: Question
&lt;/h2&gt;

&lt;p&gt;How to create assertions for snap to be saved in .assert file?&lt;/p&gt;

&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;For a Linux developer, snaps allows easy distribution of apps to multiple Linux distributions. But, there is a downside of the lack of ability to host snap stores by the developers themselves. So, I am trying to create a tool for the same. However, I encountered a dead end when I tried searching for a way to create assert file for snaps. I could not find any article regarding that.&lt;br&gt;
I could go ahead with the project without the assert file leaving the responsibility of creating assert file to store hosts. But if I don't have an answer to that question, how can &lt;em&gt;I&lt;/em&gt; answer that question if someone asks? So for the time being, I used the &lt;code&gt;--dangerous&lt;/code&gt; flag which I am not comfortable in using.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tries
&lt;/h2&gt;

&lt;p&gt;For getting an answer myself, I tried several Google searches. Needless to say, there was nothing related to creating assertions. So, I would be really happy if someone can help me with this.&lt;/p&gt;

&lt;p&gt;If you want to checkout the source code of the project I'm working on, feel free to!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aerocyber"&gt;
        aerocyber
      &lt;/a&gt; / &lt;a href="https://github.com/aerocyber/snap-it"&gt;
        snap-it
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A program for sideloading snaps in Linux.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>help</category>
      <category>python</category>
      <category>linux</category>
      <category>snap</category>
    </item>
  </channel>
</rss>
