<?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: ming ming</title>
    <description>The latest articles on DEV Community by ming ming (@ming_ming_11212cd04685643).</description>
    <link>https://dev.to/ming_ming_11212cd04685643</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%2F4031228%2F5a83520f-39b9-4de2-be86-9397091b3f2d.png</url>
      <title>DEV Community: ming ming</title>
      <link>https://dev.to/ming_ming_11212cd04685643</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ming_ming_11212cd04685643"/>
    <language>en</language>
    <item>
      <title>Your Mac has been keeping a file on your family</title>
      <dc:creator>ming ming</dc:creator>
      <pubDate>Sun, 08 Nov 2026 14:02:23 +0000</pubDate>
      <link>https://dev.to/ming_ming_11212cd04685643/your-mac-has-been-keeping-a-file-on-your-family-3g7b</link>
      <guid>https://dev.to/ming_ming_11212cd04685643/your-mac-has-been-keeping-a-file-on-your-family-3g7b</guid>
      <description>&lt;h1&gt;
  
  
  Your Mac has been keeping a file on your family
&lt;/h1&gt;

&lt;p&gt;Since macOS 13 shipped in 2022, every Mac has run two daemons whose only job is to build a graph about you. Who you are, who you know, how those people relate to you and to each other, how you communicate, where you go, what you do and when. The daemons are called knowledgeconstructiond and intelligenceplatformd, and the closest thing Apple has ever documented about them is a two-sentence man page.&lt;/p&gt;

&lt;p&gt;A security duo going by The Bishop and The Knight took the system apart in October and published the anatomy. The graph lives in ~/Library/IntelligencePlatform, fifty-one plaintext SQLite databases protected by macOS's Full Disk Access permission. The core one, graph.db, is a triple store: 181 entity classes, 278 predicates, and a confidence score on every row. What goes into it is basically everything the OS can see. Contacts. Photos, with faces. Calendar titles and attendees. Family Sharing, including the age of every member. The emergency contact in your Medical ID. Events and people Siri Suggestions digs out of your mail and messages. Apps donated through App Intents. Beside the graph sit tables for who appears with whom in your photos, a communication log without content, location and movement, and a stream of device signals: screen locked, Wi-Fi, Bluetooth, charging, ambient light.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69kjujla56fr9qxuyk3v.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69kjujla56fr9qxuyk3v.gif" alt="Your Mac keeps a file on your family" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then there is the part the HN headline picked up: a pair of XGBoost classifiers, shipped as CoreML models, that decide who counts as family. They read 144 features and output a probability for seventeen relationship columns per person, recomputed every day. Twenty of the features are identity: same last name, shared home address, an iCloud Family flag, age difference. Forty are communication patterns. Eighty-four come from photographs.&lt;/p&gt;

&lt;p&gt;One shipped feature name is worth reading twice: photosPersonPosteriorProbabilityGivenSaturdayNight. A real input to a real classifier, and its job is deciding whether someone is your sister.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faw191msma8ari59xzws7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faw191msma8ari59xzws7.gif" alt="The scorecard, with one row nobody typed" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scores look mundane until you look at what produced them. A mother scored 0.960, the ceiling of that column. Nobody typed it. The post counts nine independent signals that land on the same person: the partner column, a composite score, a household entity, the Family Sharing token, an iCloud flag, top twelve-month contact, a Photos face cluster, a Contacts record, a reachable handle. The model joined them and concluded "partner" for someone the owner had never labeled.&lt;/p&gt;

&lt;p&gt;The joins are where it stops being about you. From one store, the authors worked out that there is a child in the household and roughly how old, which daycare the child attends along with both phone numbers, where the family will be and between which hours on a given Thursday, and which password manager is installed. A relationship is intelligence one level above the rows it was inferred from.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwzaz9asnfcpfhvtyynj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwzaz9asnfcpfhvtyynj.gif" alt="It never leaves your Mac" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deletion does not fully retract any of it. The live graph drops a contact, but a second table, expired_stable_graph, keeps the retracted rows with their confidence and sources, about forty-eight hours by the authors' measurement, longer on their own machines. The scorecard still scored two people a day after the graph had dropped them, people it knew only from a calendar invitation.&lt;/p&gt;

&lt;p&gt;The authors also run a thought experiment that applies to any personalized system: what happens when this file ends up in the wrong hands, paired with a local model that has had its guardrails stripped. They call the graph a privacy single point of failure, and they play the scenario out in a second post.&lt;/p&gt;

&lt;p&gt;To be fair to Apple: everything happens on device. The databases sit behind the Full Disk Access permission, so other apps cannot read them without the user approving it. Apple's researchers published a paper on the graph techniques back in 2023. And the same store exists on iOS, where a forensics tool called iLEAPP has been reading it since September.&lt;/p&gt;

&lt;p&gt;The fair criticism is narrower and harder to wave off. The depth of the inference is undocumented. The kinship classifier is mentioned nowhere. And the graph does not just hold your data; it holds data about everyone who has ever emailed you, appeared in your photos, or been invited to a calendar event, and none of those people were asked.&lt;/p&gt;

&lt;p&gt;The authors open-sourced a dashboard called iKnow that reads your own graph locally, if you want to see the file your Mac keeps on you.&lt;/p&gt;

&lt;p&gt;I made a 56-second film about how the graph and the family classifier work:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/0tnjq46Cxcs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;And if you want to cut a clip like this into a GIF, try the tool I used: &lt;a href="https://gif-master.com/en/tools/video-to-gif" rel="noopener noreferrer"&gt;https://gif-master.com/en/tools/video-to-gif&lt;/a&gt;&lt;/p&gt;

</description>
      <category>appleprivacymacosai</category>
    </item>
    <item>
      <title>Genie 4 vs. Genie 3 vs. Marble: What the Demos Show, and What They Hide</title>
      <dc:creator>ming ming</dc:creator>
      <pubDate>Wed, 28 Oct 2026 14:37:31 +0000</pubDate>
      <link>https://dev.to/ming_ming_11212cd04685643/genie-4-vs-genie-3-vs-marble-what-the-demos-show-and-what-they-hide-26a6</link>
      <guid>https://dev.to/ming_ming_11212cd04685643/genie-4-vs-genie-3-vs-marble-what-the-demos-show-and-what-they-hide-26a6</guid>
      <description>&lt;p&gt;Genie 4's demo starts with a man playing saxophone on a floating platform in the middle of a lake. The light, the water, and the plants look like a film shot. It takes a second to remember that this is a generated world.&lt;/p&gt;

&lt;p&gt;A demo is not a product. It is a selected scene, a selected prompt, and a selected take. It does not show the failed attempts, the latency, or what the world looks like after ten minutes.&lt;/p&gt;

&lt;p&gt;I have not run Genie 4. It is a research preview for trusted testers, with a waitlist for Project Genie and early access through the Gemini API and AI Studio. So this is a visual comparison of the official demo footage from Genie 4, Genie 3, and World Labs' Marble. The useful question is what each demo can actually tell you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Genie 4 is claiming
&lt;/h2&gt;

&lt;p&gt;Google DeepMind's announcement says Genie 4 is a real-time, interactive world model. It generates the scene, the ambient audio, and character dialogue together. It handles physics like aerodynamics and collisions, and it can be steered with text prompts while it runs.&lt;/p&gt;

&lt;p&gt;There is also a reasoning loop: Gemini 3.8 Flash watches the generated world, breaks goals into steps, and checks whether each step happened. That is a different claim from "the video looks real." It is a claim about causality over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4qwol1mv9nm1v69b0qj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4qwol1mv9nm1v69b0qj.gif" alt="Genie 4 official demo: a saxophonist on a floating island" width="520" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Genie 4 demo. The video has audio; this GIF does not. Source: Google DeepMind.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The saxophone clip is the best argument for the photorealism claim. The weakness is that it is exactly the kind of scene a demo team would pick: soft light, slow movement, no text, no crowd, no edge cases. The official post lists the current limits: object permanence can drift, details can shift over longer sessions, and complex physical interactions, audio accuracy, legible text, spatial accuracy, and long-term consistency are still being researched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Genie 3 is the baseline
&lt;/h2&gt;

&lt;p&gt;Genie 3, from August 2025, is the model Genie 4 is measured against in public. It generated interactive worlds at 720p and 24fps, with consistency for a few minutes. It could also accept promptable world events, not only movement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmfamhsh53qwc3wk3lw0t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmfamhsh53qwc3wk3lw0t.gif" alt="Genie 3 official demo: first-person house painting" width="520" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Genie 3 demo: first-person house painting. Source: Google DeepMind.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On paper, the jump is clear: 720p to 1080p demo footage, short sessions to a broader real-time experience, no native audio to generated audio and dialogue. In the footage, the difference is also visible. The Genie 3 house-painting clip is coherent and interactive, but the hands and the roller show their limits. It reads as a generated world, not a filmed one.&lt;/p&gt;

&lt;p&gt;That is not a knock. Genie 3 was already doing something unusual: generating a world while you move through it. Genie 4 is the same idea with more detail, more physics, and a voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marble is solving a different problem
&lt;/h2&gt;

&lt;p&gt;World Labs' Marble is also called a world model, but it does not generate a live video feed. It creates persistent 3D worlds from text, images, video, or coarse layouts. You can edit and expand those worlds, then export them as Gaussian splats, meshes, or videos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F36zeucn7divaqni6wc7h.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F36zeucn7divaqni6wc7h.gif" alt="Marble official demo: a 3D courtyard" width="520" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Marble demo: a 3D courtyard. Source: World Labs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Marble courtyard is the strongest still image of the three. The stone, the vegetation, and the light hold up when the camera moves. But it is not trying to simulate a person playing saxophone while the world responds in real time. It is trying to give you a reusable 3D space.&lt;/p&gt;

&lt;p&gt;That difference matters for developers. Genie 4 and Genie 3 generate an experience. Marble generates an asset. They can both be useful, but they do not replace each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the demos show, side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Genie 4&lt;/th&gt;
&lt;th&gt;Genie 3&lt;/th&gt;
&lt;th&gt;Marble&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time interaction&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Explorable 3D, not live video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native audio / dialogue&lt;/td&gt;
&lt;td&gt;Yes, per Google&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main output&lt;/td&gt;
&lt;td&gt;Interactive video world&lt;/td&gt;
&lt;td&gt;Interactive video world&lt;/td&gt;
&lt;td&gt;3D world / exportable assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demo resolution&lt;/td&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;720p-class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Availability&lt;/td&gt;
&lt;td&gt;Research preview, waitlist&lt;/td&gt;
&lt;td&gt;Limited testers&lt;/td&gt;
&lt;td&gt;Generally available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main open questions&lt;/td&gt;
&lt;td&gt;Long-session drift, audio and text accuracy&lt;/td&gt;
&lt;td&gt;Action space, multi-agent interaction, text, duration&lt;/td&gt;
&lt;td&gt;Not a live simulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table is built from the companies' own claims and demo footage. It is not a benchmark. The scenes are different, the prompts are different, and each company picked the clips that make its model look best.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the demos hide
&lt;/h2&gt;

&lt;p&gt;The demos do not show the boring parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how long the world takes to start;&lt;/li&gt;
&lt;li&gt;what happens when the prompt is ambiguous;&lt;/li&gt;
&lt;li&gt;how the model handles a failed action;&lt;/li&gt;
&lt;li&gt;what the frame rate looks like under load;&lt;/li&gt;
&lt;li&gt;how the audio holds up when a character speaks for more than a line;&lt;/li&gt;
&lt;li&gt;how much a session costs;&lt;/li&gt;
&lt;li&gt;what the world looks like after ten minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Genie 4's own limitations section is more useful than its highlight reel. Object permanence, text rendering, spatial accuracy, and long-term consistency are still open problems. The word "preview" is doing a lot of work in that announcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you build things
&lt;/h2&gt;

&lt;p&gt;Genie 4 is not something you can build on today. It is a research preview, and the public access path is a waitlist and early access. If you are planning a product around it, you are planning around a date you do not control.&lt;/p&gt;

&lt;p&gt;Genie 3 is the proof that the approach works, not a platform to ship on.&lt;/p&gt;

&lt;p&gt;Marble is the most immediately usable of the three if you need a 3D environment or an asset pipeline. It is still a different product from a real-time world simulator.&lt;/p&gt;

&lt;p&gt;The demos show a real jump in visual quality and a real jump in ambition. They do not show a finished tool. Watch the API access and the failure cases, not just the highlight reel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Genie 4 official announcement: &lt;a href="https://deepmind.google/blog/genie-4-a-new-generation-of-world-simulation/" rel="noopener noreferrer"&gt;https://deepmind.google/blog/genie-4-a-new-generation-of-world-simulation/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Genie 3 official announcement: &lt;a href="https://deepmind.google/blog/genie-3-a-new-frontier-for-world-models/" rel="noopener noreferrer"&gt;https://deepmind.google/blog/genie-3-a-new-frontier-for-world-models/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Marble official announcement: &lt;a href="https://www.worldlabs.ai/blog/marble-world-model" rel="noopener noreferrer"&gt;https://www.worldlabs.ai/blog/marble-world-model&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo clips: official Genie 4, Genie 3, and Marble videos; shortened and converted to GIFs for this article. Footage belongs to the original creators.&lt;/li&gt;
&lt;li&gt;GIF compression: &lt;a href="https://gif-master.com/en" rel="noopener noreferrer"&gt;https://gif-master.com/en&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>webdev</category>
      <category>news</category>
    </item>
    <item>
      <title>I Got Tired of Explaining UI Bugs With Screenshots</title>
      <dc:creator>ming ming</dc:creator>
      <pubDate>Thu, 16 Jul 2026 03:40:11 +0000</pubDate>
      <link>https://dev.to/ming_ming_11212cd04685643/i-got-tired-of-explaining-ui-bugs-with-screenshots-2199</link>
      <guid>https://dev.to/ming_ming_11212cd04685643/i-got-tired-of-explaining-ui-bugs-with-screenshots-2199</guid>
      <description>&lt;p&gt;A lot of UI bug reports start with a screenshot and one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The dropdown is broken on mobile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did you click before that?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then someone else asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you send a recording?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now the bug report has become a conversation about the bug report.&lt;/p&gt;

&lt;p&gt;The screenshot shows the result, but not the interaction that caused it. A screen recording solves that part, but then you have a video file that is too large to casually paste into an issue or a chat. So the usual next step is to find a GIF converter, upload the video, trim it, add a note somewhere, export the GIF, then compress it because the GIF is now too large.&lt;/p&gt;

&lt;p&gt;I got tired of doing that.&lt;/p&gt;

&lt;p&gt;Not because any one of those tools is difficult to use. The annoying part is moving the same file through several tools just to explain one small UI problem.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://gif-master.com/en/tools/screen-recorder?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ui-bug-reports" rel="noopener noreferrer"&gt;GIF Master&lt;/a&gt;, a browser-only workflow for turning a recording into a small annotated GIF.&lt;/p&gt;

&lt;p&gt;The idea is simple, put all the steps into single window, no more file downloads and uploads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://gif-master.com/en/tools/screen-recorder?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ui-bug-reports" rel="noopener noreferrer"&gt;&lt;strong&gt;Record the issue&lt;/strong&gt;&lt;/a&gt;. &lt;br&gt;
Then&lt;br&gt;
&lt;a href="https://gif-master.com/en/tools/video-to-gif?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ui-bug-reports" rel="noopener noreferrer"&gt;&lt;strong&gt;Mark the issue&lt;/strong&gt;&lt;/a&gt;. &lt;br&gt;
Then&lt;br&gt;
&lt;a href="https://gif-master.com/en/tools/gif-compressor?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ui-bug-reports" rel="noopener noreferrer"&gt;&lt;strong&gt;Make it small enough to share&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The kind of bug this is for
&lt;/h2&gt;

&lt;p&gt;Take a common example: a dropdown menu covers the submit button on a narrow screen.&lt;/p&gt;

&lt;p&gt;A ticket that says &lt;em&gt;“dropdown is broken on mobile”&lt;/em&gt; is technically true, but it leaves a lot open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which page?&lt;/li&gt;
&lt;li&gt;Which viewport?&lt;/li&gt;
&lt;li&gt;Does it happen before or after opening another panel?&lt;/li&gt;
&lt;li&gt;Is the button hidden, moved, or just unclickable?&lt;/li&gt;
&lt;li&gt;What should the expected layout look like?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A short GIF can answer all of that without turning the issue into a wall of text.&lt;/p&gt;

&lt;p&gt;The useful version of that report is usually only a few seconds long:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the settings panel.&lt;/li&gt;
&lt;li&gt;Switch to a narrow viewport.&lt;/li&gt;
&lt;li&gt;Open the dropdown.&lt;/li&gt;
&lt;li&gt;Show the menu covering the button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then add a red rectangle around the collision, an arrow pointing to the dropdown, and one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Expected: the menu should stay above the form.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is enough. The person reading the issue knows what happened, where to look, and what the expected behavior is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftr38or3op0ovvd1kkgm4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftr38or3op0ovvd1kkgm4.gif" alt="operations recorded by gif-master.com" width="480" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I did not want another “all-in-one dashboard”
&lt;/h2&gt;

&lt;p&gt;The workflow I wanted was deliberately boring.&lt;/p&gt;

&lt;p&gt;Start with a screen recording. Keep only the useful part. Add text, arrows, rectangles, emoji, or a small image when they help explain the issue. Export a GIF. Compress it. Download it.&lt;/p&gt;

&lt;p&gt;No new browser window. No sending the recording to a server first. No exporting a video just so another tool can ask you to upload that same video again.&lt;/p&gt;

&lt;p&gt;The tools are connected because the task is connected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A recording gives the bug report context.&lt;/li&gt;
&lt;li&gt;A short GIF makes the context easy to consume.&lt;/li&gt;
&lt;li&gt;An annotation removes ambiguity.&lt;/li&gt;
&lt;li&gt;Compression makes the result practical to paste into GitHub, Slack, Linear, Notion, or a pull request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part matters more than it sounds.&lt;/p&gt;

&lt;p&gt;A GIF that is clear but too large to send is still inconvenient. A GIF that is tiny but unreadable is not useful either. The goal is to reduce the size enough for quick sharing while keeping the UI details and annotations legible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I kept the files in the browser
&lt;/h2&gt;

&lt;p&gt;Bug recordings can be awkward.&lt;/p&gt;

&lt;p&gt;They may contain a staging environment, an internal admin page, customer data, unfinished features, or an account that should not be uploaded to a random service.&lt;/p&gt;

&lt;p&gt;GIF Master processes the recording, editing, GIF generation, and compression in the browser. The file stays on the device unless you decide to export and share it.&lt;/p&gt;

&lt;p&gt;That does not make every recording safe by default. You still need to be careful about what is visible on screen. But it removes one unnecessary step from the workflow: uploading a bug recording before you have even decided where it should go.&lt;/p&gt;

&lt;h2&gt;
  
  
  A GIF is not the whole bug report
&lt;/h2&gt;

&lt;p&gt;I still want the usual details in a good issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steps to reproduce&lt;/li&gt;
&lt;li&gt;Expected behavior&lt;/li&gt;
&lt;li&gt;Actual behavior&lt;/li&gt;
&lt;li&gt;Browser, device, or viewport details&lt;/li&gt;
&lt;li&gt;Console errors when relevant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The GIF is there to make the visual part obvious.&lt;/p&gt;

&lt;p&gt;It is especially useful for things that are annoying to describe precisely: a layout shift, a hover state that disappears too early, a modal that closes unexpectedly, a button that becomes covered by another layer, or an animation that ends in the wrong&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>productivity</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
