<?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: Roman Rashkovskiy</title>
    <description>The latest articles on DEV Community by Roman Rashkovskiy (@romka2x).</description>
    <link>https://dev.to/romka2x</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%2F3994713%2F463f10ca-fff5-4954-9e70-3ff269241a8b.jpg</url>
      <title>DEV Community: Roman Rashkovskiy</title>
      <link>https://dev.to/romka2x</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/romka2x"/>
    <language>en</language>
    <item>
      <title>What closed testing changed in my Android automation app</title>
      <dc:creator>Roman Rashkovskiy</dc:creator>
      <pubDate>Thu, 20 Aug 2026 15:55:47 +0000</pubDate>
      <link>https://dev.to/romka2x/what-closed-testing-changed-in-my-android-automation-app-4lc5</link>
      <guid>https://dev.to/romka2x/what-closed-testing-changed-in-my-android-automation-app-4lc5</guid>
      <description>&lt;p&gt;ScriptTap has moved from Google Play closed testing to a public open beta. The current public build is Code 20.&lt;/p&gt;

&lt;p&gt;That milestone did not come from adding one final headline feature. It came from rebuilding the parts users normally notice only when they fail: state ownership, persistence, lifecycle closure, rotation, imports, and permission handling.&lt;/p&gt;

&lt;p&gt;ScriptTap is a no-root Android automation app. Users create scripts that can perform taps and gestures, inspect visible UI states, use OCR and image or pixel checks, work with variables and conditions, and run through overlays, routines, and shortcuts.&lt;/p&gt;

&lt;p&gt;That combination makes ordinary Android lifecycle and state-management mistakes visible very quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  One authority is better than synchronized copies
&lt;/h2&gt;

&lt;p&gt;One of the largest changes was moving the Script Library, active Editor, and running script state around one canonical authority.&lt;/p&gt;

&lt;p&gt;Other screens now work from stable IDs and retained projections instead of maintaining competing copies of the same script data.&lt;/p&gt;

&lt;p&gt;The practical lesson was simple: synchronization code is often evidence that ownership is unclear. Removing extra owners eliminated entire categories of refresh, selection, and stale-state problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  RAM first, persistence second
&lt;/h2&gt;

&lt;p&gt;Normal user actions now update resident state immediately.&lt;/p&gt;

&lt;p&gt;Persistence receives immutable work through one background writer queue. The UI does not wait for storage, and the writer does not call back into UI state.&lt;/p&gt;

&lt;p&gt;This separation made the app feel more responsive, but the larger benefit was predictability. A user action has one immediate RAM result and one ordered persistence path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing has to be real lifecycle behavior
&lt;/h2&gt;

&lt;p&gt;Floating Android applications make “close” more complicated than hiding a window.&lt;/p&gt;

&lt;p&gt;ScriptTap’s close path now stops ordinary activity immediately, gives the writer one bounded drain, removes active overlays, and leaves only the idle permission holder running.&lt;/p&gt;

&lt;p&gt;This became an important rule during testing: if a user closes the active application surface, no visible or mutating work should continue afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rotation can become a data-correctness problem
&lt;/h2&gt;

&lt;p&gt;For screen-aware automation, rotation is not merely a layout event.&lt;/p&gt;

&lt;p&gt;Screen-capture sessions need to survive valid configuration changes, while scripts containing literal coordinates must not run against the wrong orientation.&lt;/p&gt;

&lt;p&gt;Recent builds added orientation protection for existing scripts and coordinate transposition during supported imports. This keeps a portrait-authored workflow from silently becoming incorrect when imported or opened under a different orientation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Import compatibility should fail selectively
&lt;/h2&gt;

&lt;p&gt;Script packages may come from older builds, newer builds, cloud storage, or another device.&lt;/p&gt;

&lt;p&gt;Rejecting an entire package because one newer command is unsupported is unnecessarily destructive. The importer can now preserve compatible content while allowing unsupported newer commands to be skipped deliberately.&lt;/p&gt;

&lt;p&gt;Compatibility is more useful when the boundary is explicit and narrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Powerful permissions need concrete explanations
&lt;/h2&gt;

&lt;p&gt;No-root input automation depends on Android Accessibility. Screen-aware commands may separately request Android screen capture.&lt;/p&gt;

&lt;p&gt;Those permissions should not be described as harmless, but vague warnings are not useful either. The explanation needs to state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why the permission is needed&lt;/li&gt;
&lt;li&gt;what user-created scripts can do with it&lt;/li&gt;
&lt;li&gt;which capabilities are separate&lt;/li&gt;
&lt;li&gt;what ScriptTap does not bypass&lt;/li&gt;
&lt;li&gt;when the user should decline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closed testing reinforced that trust is not produced by softer wording. It comes from specific behavior and specific boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What public beta means
&lt;/h2&gt;

&lt;p&gt;Open beta does not mean the application is finished or proven stable across every Android device.&lt;/p&gt;

&lt;p&gt;It means anyone can now install it without joining a tester group, and the next phase can focus on broader device behavior, onboarding clarity, real automation workflows, and the failures that only appear outside a controlled tester pool.&lt;/p&gt;

&lt;p&gt;For developers working on stateful Android apps: which caused more trouble in practice—state ownership, persistence ordering, configuration changes, or lifecycle shutdown?&lt;/p&gt;




&lt;p&gt;Disclosure: I used an AI assistant to help organize and edit this article. I reviewed the technical claims and stand behind them.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a no-root Android automation app taught me that trust is harder than features</title>
      <dc:creator>Roman Rashkovskiy</dc:creator>
      <pubDate>Sun, 21 Jun 2026 00:20:13 +0000</pubDate>
      <link>https://dev.to/romka2x/building-a-no-root-android-automation-app-taught-me-that-trust-is-harder-than-features-2acn</link>
      <guid>https://dev.to/romka2x/building-a-no-root-android-automation-app-taught-me-that-trust-is-harder-than-features-2acn</guid>
      <description>&lt;p&gt;I’m building ScriptTap, a no-root Android automation app for user-controlled phone workflows.&lt;/p&gt;

&lt;p&gt;The app lets people create scripts with taps, swipes, routines, screen-aware checks, OCR/text detection, image/pixel checks, variables, logic, and AI-assisted script creation.&lt;/p&gt;

&lt;p&gt;The technical side is hard, but the trust side may be harder.&lt;/p&gt;

&lt;p&gt;ScriptTap needs Android Accessibility permission because user-authored input automation requires it. That is a powerful permission. I do not want to minimize it, hide it behind vague onboarding copy, or expect people to click through without understanding what they are enabling.&lt;/p&gt;

&lt;p&gt;That creates a product-design problem.&lt;/p&gt;

&lt;p&gt;If the copy is too soft, it feels dishonest.&lt;/p&gt;

&lt;p&gt;If the copy is too warning-heavy, a legitimate automation tool can feel suspicious before the user even understands what it does.&lt;/p&gt;

&lt;p&gt;The explanation I am trying to make clear is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScriptTap is no-root.&lt;/li&gt;
&lt;li&gt;Scripts are created and controlled by the user.&lt;/li&gt;
&lt;li&gt;Screen capture is user-controlled.&lt;/li&gt;
&lt;li&gt;It does not bypass Android permissions, lock screens, app security, or consent flows.&lt;/li&gt;
&lt;li&gt;Accessibility is required for overlay/input automation, so users should understand why it is being requested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The short version I keep coming back to is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ScriptTap uses Accessibility so your scripts can interact with the screen the way you tell them to. This is a powerful permission. You should only enable it if you understand and trust what the app is doing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For developers who have built apps with sensitive permissions:&lt;/p&gt;

&lt;p&gt;How did you explain the permission without either hiding the risk or scaring users away from a legitimate feature?&lt;/p&gt;

</description>
      <category>android</category>
      <category>a11y</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
