# maiatoday

Recent content on maiatoday

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Antigravity TagSpotter - Share data with Firebase

DevFeed: [Antigravity TagSpotter - Share data with Firebase](<https://devfeed.tech/articles/antigravity-tagspotter-share-data-with-firebase-32039.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/antigravity-tagspotter-share-data-with-firebase/>)

Published: 2026-07-09T20:34:04Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Firebase](<https://devfeed.tech/topics/firebase.md>), [Google](<https://devfeed.tech/topics/google.md>), [SDK](<https://devfeed.tech/topics/sdk.md>), [data](<https://devfeed.tech/topics/data.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [antigravity](<https://devfeed.tech/tags/antigravity.md>), [code](<https://devfeed.tech/tags/code.md>), [data](<https://devfeed.tech/tags/data.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [google](<https://devfeed.tech/tags/google.md>), [ios](<https://devfeed.tech/tags/ios.md>), [kmp](<https://devfeed.tech/tags/kmp.md>), [sdk](<https://devfeed.tech/tags/sdk.md>)

### AI overview

The article describes planning and implementing Firebase-based cloud storage for TagSpotter, including authentication, offline use, cross-device syncing, shared data packs, schema changes, migrations, and platform SDK constraints. It finds that defining requirements and edge cases required substantial planning before implementation.

### Source excerpt

The challenge - Firebase with Google Plugins Now that I can see my graffiti spots on multiple platforms the obvious next step is I want to keep the data in the cloud so that I can capture spots when I'm out and about and then look at them and edit them on the laptop later. For this I need some kind of auth and data storage - like Firebase. Like before, can I do the implementation on a weekend. Easy enough? Well Antigravity 2.0 has firebase super powers in the form of Google shipped plugins but figuring out what I really want and what the edge cases are was not trivial. The prep grill-me grill-me grill-me For this exercise I was pretty confident antigravity could code up my solution. Just look at all these built in firebase skills. What I wasn't sure of was what I actually wanted. Let's get some ideas. I wanted users that didn't want to log in, not to be forced to do this. So there was the idea of an offline mode. Then when I do log in and I happen to change something on my phone and then on the desktop it should take the latest edit. I wanted it to update in the background but realistically only when I finish editing a spot. What happens when I delete a spot? How will it work when I import a pack? What happens when the photographer name is the same but the email differs? Can I have a way to save a pack of spots and just share a code to see it? What then, will I be able to change them? How does the db schema change? What migrations are needed? Will the old share packs work? How do I even set things up properly on firebase? What about desktop, there isn't an SDK for desktop? And so on and so on. I was clearly better at asking questions than building especially since I didn't know how to integrate the SDK on iOS. I spent about two evenings planning and changing my mind to come up with this plan It required multiple rounds of /grill-me and also asking antigravity for some suggestions on how things could work and picking the options I liked best. The plan had important s

## Antigravity TagSpotter - KotlinMultiPlatform evolve

DevFeed: [Antigravity TagSpotter - KotlinMultiPlatform evolve](<https://devfeed.tech/articles/antigravity-tagspotter-kotlinmultiplatform-evolve-32038.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/antigravity-tagspotter-kotlinmultiplatform-evolve/>)

Published: 2026-06-14T19:10:33Z

Content type: opinion

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [kotlinmultiplatform](<https://devfeed.tech/topics/kotlinmultiplatform.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Android](<https://devfeed.tech/topics/android.md>), [compose-multiplatform](<https://devfeed.tech/topics/compose-multiplatform.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Web](<https://devfeed.tech/topics/web.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [android](<https://devfeed.tech/tags/android.md>), [antigravity](<https://devfeed.tech/tags/antigravity.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [git](<https://devfeed.tech/tags/git.md>), [kmp](<https://devfeed.tech/tags/kmp.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlinmultiplatform](<https://devfeed.tech/tags/kotlinmultiplatform.md>), [migration](<https://devfeed.tech/tags/migration.md>), [tests](<https://devfeed.tech/tags/tests.md>)

### AI overview

The article documents an attempt to migrate the TagSpotter Android app toward Kotlin Multiplatform using Antigravity 2.0 and parallel agents. It describes preparation such as modularizing the codebase, adding tests, researching KMP migration, and planning support for iOS, Android, Desktop, and Web, while retaining Android-specific features such as the Wear app.

### Source excerpt

The Challenge - bring on the subagents Can I make my TagSpotter Android app be multi-platform in a weekend using Antigravity 2.0 and a swarm of agents running in parallel? Can I do this even though I don't know how to use Xcode and I don't want to break my existing app. This was the question I had. TagSpotter is medium featured Android app I built two weeks ago. I use it to capture interesting and favourite spots in the city like unusual graffiti or yarn bombed sculptures. It has a fair few features including: Capture the places by camera with location Upload a photo AI lookup to find info on the internet from the photo, links, title, artist and suggested tags Export the spots in a zip file and import them again. This is how I share my favourite spots with friends. Make field notes by typing or speaking Share my favourites to Google maps for easy navigation Good category and location based filtering Wear app that can list started spots and navigate to a spot on the watch A good challenge because it isn't just a hello world app. The prep Because the clock would be ticking, I did a little bit of prep to make sure I had everything ready. Prep the codebase Clean up the app, no warnings, lint issues or unused imports Make sure the screens work in landscape, desktop mode will need this Split the app into feature based and pure kotlin modules. I know Compose multiplatform and pure kotlin modules can easily be re-used. Put some tests in place Checked everything works and make a tag in git incase Antigravity borked the project. Light research I collected a few salient links about KMP migration. A good blog post, some info on project structure and a link to the open source kmp libraries I might need. Nitty Gritty Friday evening, let's go. Make a plan I want to convert this app to a KMP app that supports iOS, Android, Desktop and Web. The other platforms do not have to support all features, e.g. the wear app. But Android still has to support this feature. I want to share as mu

## Antigravity 2.0 vs Android Studio - making TagSpotter

DevFeed: [Antigravity 2.0 vs Android Studio - making TagSpotter](<https://devfeed.tech/articles/antigravity-2-0-vs-android-studio-making-tagspotter-32037.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/antigravity-2.0-vs-android-studio-making-tagspotter/>)

Published: 2026-05-31T08:21:45Z

Content type: opinion

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [ide](<https://devfeed.tech/topics/ide.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [Git](<https://devfeed.tech/topics/git.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [antigravity](<https://devfeed.tech/tags/antigravity.md>), [cli](<https://devfeed.tech/tags/cli.md>), [code](<https://devfeed.tech/tags/code.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [debug](<https://devfeed.tech/tags/debug.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [git](<https://devfeed.tech/tags/git.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [multi-agent](<https://devfeed.tech/tags/multi-agent.md>)

### AI overview

An Android development article compares how Antigravity 2.0 and Android Studio fit into agent-assisted workflows. It describes Antigravity as suited to broad exploration, planning, parallel agent work, worktrees, and command-line builds or emulator runs, while Android Studio remains preferable for editing, debugging, previewing, and other IDE conveniences. The author also notes performance costs from multiple Android Studio instances and competing tools.

### Source excerpt

How does Antigravity and Android Studio work together? What do I do where? There are as many workflows and preferences as there are Android engineers starting with light mode vs dark mode. This is not an attempt to provoke a holy war. What I have noticed is that in the days BA (Before Agents) I used to open Android Studio and do most things in there, edit, debug, preview, git and do CLI things. Now its not like that anymore. Click here if you want to skip the rant 😤 and just jump to Antigravity experiment Today in Android Studio I can run 1 agent or 2 if one is on a command line, max 3 if the third is just the Ask/chat tab. Or I can have a ton of terminals open with multiple agents juggling work trees. Or I can use one of the many multi agent solutions like Conductor, Superset or Antigravity 2.0 that are popping up like mushrooms. Then I could open multiple Android Studio versions in the worktrees I spun up with the agents. If I am in full agent mode and I just quickly want to edit something, I can do it in a small editor in the orchestrator tool but very soon I miss the creature comforts of Android Studio. But opening multiple instances of Android Studio is super slow (looking at you gradle sync and indexing). If my orchestrator environment is Antigravity 2.0 I can either jump back into Antigravity IDE or open the project in AndroidStudio. The problem Arrgh so many chat boxes everywhere with agents waiting to eat my tokens! So many tool combos all fighting for RAM and CPU cycles on my machine! I just want to add a setting to a file, I might as well edit it in vi. ok deep breath. I don't have a solution and I'm sure the internet has many suggestions so let me just figure out whre Antigravity 2.0 shines and what is better to do in Android Studio. Use Antigravity The mindset - broad, explore, plan, hands off, chatty, parallel work In Antigravity it is broader picture, start an app. Exploration and planning. Multiple agents doing things in worktrees. Agents are editing

## Android CLI meet Gemini CLI

DevFeed: [Android CLI meet Gemini CLI](<https://devfeed.tech/articles/android-cli-meet-gemini-cli-32034.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/android-cli-meet-gemini-cli/>)

Published: 2026-04-18T19:20:59Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Android skills](<https://devfeed.tech/topics/android-skills.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [cli](<https://devfeed.tech/tags/cli.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [gemini-cli](<https://devfeed.tech/tags/gemini-cli.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This tutorial introduces Android CLI and matching agent skills for Gemini CLI and other agents. It covers installation, initialization, Android knowledge-base access, emulator interaction, and testing workflows with screenshots and interactions.

### Source excerpt

In recent Android AI experiments I always felt I missed something. If I was in the IDE using an agent with Gemini in Android Studio, I loved the access to the knowledge base and the special tools but I could only spin up one instance. If I was in my <insert favourite CLI agent tool> let's say gemini-cli, I missed the quality of life improvements that made me have to jump back into the IDE. Yes I could install an adb extension into gemini-cli or write some custom skill to try to achieve what I wanted or paste a bunch of Android official urls into the prompt. It was always fiddly to open the IDE from a worktree or test from an orchestrator session. As of last week there is a new tool and a bunch of matching skills that solve this. Android CLI NOTE I see 2 main benefits of using android-cli easy access to accurate android knowledge base that is agent friendly and will reduce token use easy emulator interaction and improved testing and iteration with screenshots and interactions How do I get it The installation is pretty simple, follow the Android cli docs TLDR; Download and install make sure you are using the new android executable not the old one, type which android and you are looking for something like /usr/local/bin/android If not then check your path setup. Or ask an agent to do it with this prompt. read the file that sets up my path and modify it such that the android sdk paths are not added in the the beginning but at the end of the path. I need this because the path `/usr/local/bin` is in the path before the android sdk and it needs to be first run android init to make sure all agents on your system will use this tool. It sets up a skill for claude, gemini and more optionally install all the skills created for this tool android skills add --all Show me some cools things I can do with it I am going to use a repo with a demo app I built with Gemini in Android Studio to take it for a spin. This app is a simple mood tracking app. You don't need to try it on my app,

## Android ❤ Gemini CLI - tech debt detection Code Maat skill

DevFeed: [Android ❤ Gemini CLI - tech debt detection Code Maat skill](<https://devfeed.tech/articles/android-gemini-cli-tech-debt-detection-code-maat-skill-32033.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/android-%EF%B8%8F-gemini-cli-tech-debt-detection-code-maat-skill/>)

Published: 2026-03-08T00:00:00Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Tech Debt](<https://devfeed.tech/topics/tech-debt.md>), [Agent Skill](<https://devfeed.tech/topics/agent-skill.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Code](<https://devfeed.tech/topics/code.md>), [Git](<https://devfeed.tech/topics/git.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>)

Tags: [adb](<https://devfeed.tech/tags/adb.md>), [agent-skill](<https://devfeed.tech/tags/agent-skill.md>), [ai](<https://devfeed.tech/tags/ai.md>), [android](<https://devfeed.tech/tags/android.md>), [cli](<https://devfeed.tech/tags/cli.md>), [code](<https://devfeed.tech/tags/code.md>), [code-maat](<https://devfeed.tech/tags/code-maat.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [gemini-cli](<https://devfeed.tech/tags/gemini-cli.md>), [git](<https://devfeed.tech/tags/git.md>), [tech-debt](<https://devfeed.tech/tags/tech-debt.md>)

### AI overview

This tutorial explores using Gemini CLI and an agent skill with Code Maat to identify technical-debt hotspots in the Habitica Android codebase. It describes using Git history to analyze file churn and logical coupling, and compares the approach with the Gemini Agent in Android Studio.

### Source excerpt

Introduction What AI tools work for building Android apps? I am exploring some variations. In this post I will look at Gemini CLI, tech debt detection with a skill using Code Maat and how this compares with the Agent of Gemini in Android Studio. I am not starting with a new project. What if you have an existing codebase and you want to find the best place to tackle some tech debt that will make a difference for everyone. The sample codebase is the Habitica app, which had its first commit in 2015. Rather than poking at the code in a random or an "intuitive" way or asking the AI questions, let's look at a more deterministic way to answer this question. Or rather, let's teach the agent to use some scripts to answer this question. The benefit of packaging this functionality in a skill is that you can create this specialisation and script usage in a skill that will be loaded lazily only when you need it. The theory - Code as Crime scene Adam Tornhill wrote a book, Your Code as a Crime Scene, that uses your git history and applies forensic science to figure out where the hotspots, logical coupling, churn and more can be found in your code base. He has a java tool called Code Maat that you can use to analyse this information. The problem is, it is a bit finicky to setup and run and I can never remember all the command line parameters for git or for the tool. The theory TLDR is if you can see which large files change often or which files always change together, you can see which parts of your code are brittle or are coupled. The added benefit is that this analysis is language neutral. So if you build an agent skill for this, it can be used on any codebase. Creating the Code Maat Skill What do we need the link to Code Maat optionally download the code-maat standalone jar and put it in ~/tools/code-maat.jar to speed up the first run Gemini CLI + authentication and API key if you have it the skill-creator skill - this is part of the Gemini CLI install the Habitica Android app

## Using Gemini CLI and the Obsidian CLI to manage note metadata

DevFeed: [Using Gemini CLI and the Obsidian CLI to manage note metadata](<https://devfeed.tech/articles/from-cli-to-cli-gemini-and-obsidian-32053.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/from-cli-to-cli-gemini-and-obsidian/>)

Published: 2026-02-21T20:33:17Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Obsidian](<https://devfeed.tech/topics/obsidian-md.md>), [AI Agent](<https://devfeed.tech/topics/ai-agent.md>), [GitHub Copilot CLI](<https://devfeed.tech/topics/github-copilot-cli.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Script](<https://devfeed.tech/topics/script.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>), [Git](<https://devfeed.tech/topics/git.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai-agent](<https://devfeed.tech/tags/ai-agent.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [automation](<https://devfeed.tech/tags/automation.md>), [cli](<https://devfeed.tech/tags/cli.md>), [docs](<https://devfeed.tech/tags/docs.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [gemini-cli](<https://devfeed.tech/tags/gemini-cli.md>), [git](<https://devfeed.tech/tags/git.md>), [knowledge-management-systems-metadata](<https://devfeed.tech/tags/knowledge-management-systems-metadata.md>), [markdown](<https://devfeed.tech/tags/markdown.md>), [obsidian](<https://devfeed.tech/tags/obsidian.md>), [script](<https://devfeed.tech/tags/script.md>)

### AI overview

The author describes using Gemini CLI with the Obsidian CLI, along with shell tools and scripts, to analyze and standardize metadata across an Obsidian vault. The work covered status values, Type and ContentType properties, tags, documentation, and validation scripts for future consistency checks.

### Source excerpt

Let's talk about the "Obsidian Paralysis." For a while, I've been using Obsidian to jot down ideas, plan content, and collect those random snippets from the internet that feel like digital gold. I moved over from Notion a while back. The freedom of simple Markdown managed by Git was liberating. Pure, texty goodness. But--and there's always a but, isn't there?--one thing always held me back. That nagging little voice: Am I doing it right? I know, I know. The "experts" say just write the notes and let the system emerge organically. But I was forever second-guessing myself. Is this a status: NotStarted or status: not-started? Is the type a "thought" or a "note"? I was spending more time fiddling with the taxonomy and the metadata "meta-system" than actually creating content. But today, everything changed. I opened Obsidian and saw the news: they now have a CLI interface. 💡: "What if I introduced the Obsidian CLI to an AI Agent CLI?" For my experiments, I called in Gemini CLI. I basically sat them down in a terminal together, let Gemini CLI figure out what the Obsidian CLI could do, and then--with a spicy mix of grep, sed, awk, and the new Obsidian commands, we went to work. Here's the "Metadata Makeover": 1. The Status Cleanup I had Gemini pull every single Status property from every note in my vault to analyze them for consistency. It detected patterns I didn't even know I had (like all the versions of Idea Ideas Research researching). We cleaned up the mess, documented the new "Golden Rules" for statuses, and Gemini wrote a validation script that I can run that will clean things up or highlight inconsistencies. 2. The "Type" vs. "ContentType" Tangle We did the same for Type and ContentType. It turns out I was using them interchangeably like a chaotic neutral character. Gemini helped me settle on a single source of truth, updated my docs, and tweaked the validation script to keep things tidy. 3. The Tag Jungle We looked at everything--frontmatter tags, in-document hashtag

## Using Compose Hot Reload to Build a Vaporwave-Inspired Compose Desktop Project

DevFeed: [Using Compose Hot Reload to Build a Vaporwave-Inspired Compose Desktop Project](<https://devfeed.tech/articles/is-it-vaporwave-compose-hot-reload-32063.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/is-it-vaporwave-compose-hot-reload/>)

Published: 2025-06-09T10:52:55Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [compose-hot-reload](<https://devfeed.tech/topics/compose-hot-reload.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [repo](<https://devfeed.tech/topics/repo.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-hot-reload](<https://devfeed.tech/tags/compose-hot-reload.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [reload](<https://devfeed.tech/tags/reload.md>), [repo](<https://devfeed.tech/tags/repo.md>), [vaporwave](<https://devfeed.tech/tags/vaporwave.md>)

### AI overview

An exploratory tutorial on using JetBrains Compose Hot Reload in a Compose Desktop project, with Vaporwave as the visual theme. It covers project setup, Kotlin 2.1.20 or later, plugin configuration, the foojay resolver, and running the application.

### Source excerpt

Why I want to play with the recently released Compose Hot reload feature by JetBrains. To do this I setup a Desktop compose project and picked a topic to draw and explore: Vaporwave Why? because Vaporwave is a curious Internet thing. It has a strong visual aesthetic that I wanted to recreate. It is intriguing. It is seems to be a fleeting transient phenomena: it is in the name vapor and wave and yet... and yet we see it pop up in unexpected places. It is a form of hauntology: a cultural idea that returns from the past to haunt the present. There will be ramblings interspersed and remixed with code, I will put the code at the beginning of the sections, so that you can easily skim if remix-rambling is not your thing. Yes, there is a matching repo. Yes, it is a mix of organic hand coding and AI enhancements. I will explain my process. But first Setting up Hot Reload You need: A project that has a Compose desktop part. It can be stand alone or part of a multiplatform project Use a Kotlin version 2.1.20 or later Get the plugin and the latest version information and add it the place you keep your versions, like a toml file Setup the plugin in your build.gradle.kts Setup the foojay resolver Run the main application from the gutter icon or command line. something like ./gradlew runHot --mainClass MainKt --auto Optional extra make a run target for your particular main application if you have more than one See and example of each line in the sample repo Wow these instructions are vague! indeed things change quickly. Please follow the original repo. This post will date. Origins and Sound track Vaporwave appeared as a music genre with a strong aesthetic, some say in 2010. The iconic album Floral Shoppe by Macintosh Plus is still available and makes a perfect sound track for inspecting the code or reading this article. Go ahead click the link and start the music. I'll wait. We are on the cusp of widespread changes in how we interact with technology. Will we have nostalgia for the

## Vibecoding a Totoro tribute with Junie

DevFeed: [Vibecoding a Totoro tribute with Junie](<https://devfeed.tech/articles/vibecoding-a-totoro-tribute-with-junie-32084.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/vibecoding-a-totoro-tribute-with-junie/>)

Published: 2025-03-02T21:02:23Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [junie](<https://devfeed.tech/topics/junie.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Canvas](<https://devfeed.tech/topics/canvas.md>), [shaders](<https://devfeed.tech/topics/shaders.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [junie](<https://devfeed.tech/tags/junie.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [screen](<https://devfeed.tech/tags/screen.md>), [shaders](<https://devfeed.tech/tags/shaders.md>)

### AI overview

The article describes using Junie to experiment with visual drawing techniques in a Kotlin Multiplatform Compose desktop project. The project combines canvases, gradients, paths, shapes, text, shaders, animations, and interaction to create a Totoro tribute, without aiming for production readiness.

### Source excerpt

Sunday afternoon. Perfect time to hang out with Junie. I want to refresh my memory on some Compose drawing techniques. I am not really in the mood for Googling. I don't need a production ready app. I really just want to mess around. How far can I vibe code this. I'll start off by setting Junie to brave mode. I added an image and some colours to the repo of a blank compose desktop project. I also put a copy of an older blogpost of mine with some drawing techniques. I set some ground rules with the first prompt and then just keep asking Junie to add things. Create a guidelines file with the following information and update the README.md file. Let's explore some visual techniques in this Kotlin multiplatform project. The aim is to go for variety of techniques. Feel free to use the canvas, brush, paint, gradient, lines, paths, rounded polygons, skia shaders, text, colours, shapes. Or anything that will create an interesting visual effect. Animations are not necessary but can be added. The project does not have a practical application other than to demonstrate how to create interesting visual elements and to have some fun. It is a visual tribute to the Studio Ghibli film, [My Neighbor Totoro](https://en.wikipedia.org/wiki/My_Neighbor_Totoro). * It does not need any tests * Layer all the visual techniques on the main composable screen. * Find the suggested fonts in the resources folder * Find inspiration in the docs/looks folder and in the docs/blogpost folder I think Junie got what I wanted to do, I never explained what Totoro looks like but it figured out something from the included inspiration image. The early experiments needed some tweaking The only time the project didn't run was when Junie didn't download the new fonts but I found the instructions on where to get the fonts added to the README.md. I had no real expectations so I'm pretty happy with the final result. Animating rain and clickable wobbling Totoro. No explanations really what can I say I didn't read the

## Flash cards for Coroutines - KotlinFlashKards

DevFeed: [Flash cards for Coroutines - KotlinFlashKards](<https://devfeed.tech/articles/flash-cards-for-coroutines-kotlinflashkards-32050.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/flash-cards-for-coroutines-kotlinflashkards/>)

Published: 2024-09-18T17:50:02Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [ide](<https://devfeed.tech/topics/ide.md>), [Deadlock](<https://devfeed.tech/topics/deadlock.md>), [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [flash-cards](<https://devfeed.tech/tags/flash-cards.md>), [ide](<https://devfeed.tech/tags/ide.md>), [jetbrains](<https://devfeed.tech/tags/jetbrains.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlinflashkards](<https://devfeed.tech/tags/kotlinflashkards.md>), [structured-concurrency](<https://devfeed.tech/tags/structured-concurrency.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

An in-IDE flash-card course called KotlinFlashKards helps learners practise Kotlin coroutines through questions, hints, code snippets, and tests. It covers basics, structured concurrency, error handling, and testing, and runs through the JetBrains Academy plugin.

### Source excerpt

I made something. I made a set of flash cards to practise and learn Kotlin coroutines. I call them KotlinFlashKards (with a K of course). This is the first of a series covering different topics. Why create flash cards? Does this happen to you? You are writing some code, you know something is possible but you can't remember exactly how to do it. By the time you have asked an AI or researched you have forgotten what it was you wanted to do in the first place. There is a way to fix this. Learn and remember the key concepts you use often. One way to do this is to use flash cards. I learnt this from the book The Programmers Brain by Felienne Hermans How does it work? The deck doesn't replace the docs or a good book. It is an in IDE course in the form of a question, a hint that hides the answer and a code snippet with a test to explain the concept. It has four sections Basics - 18 cards Structured Concurrency - 12 cards Error handling - 7 cards Testing - 6 cards You can explore the sections in order or dip in and try tasks at random. Strategies to get the best out of the course? Repeat at regular intervals - Memories are built up if you repeat the flash cards at regular intervals. It is better to do a few lessons more often than to do many lessons in one sitting. You can do the course many times or choose which areas to practise. Recall the answer before peeking - It is important to try to recall the syntax first before looking at the hints or letting the IDE help you. This means you practise your recall of the memory. Think about the solution - For each question and answer you will remember it better too if you think of a practical place where you could use similar code. How do I get it? You need: a JetBrains IDE like Android Studio or Intellij Community edition the JetBrains Acadamy plugin installed Then do the following: Before opening a project click on the Learn menu item on the left Click on New course In the Marketplace search for KotlinFlashKards and start the cou

## 50 ways to run some Kotlin code

DevFeed: [50 ways to run some Kotlin code](<https://devfeed.tech/articles/50-ways-to-run-some-kotlin-code-32031.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/50-ways-to-run-some-kotlin-code/>)

Published: 2024-08-11T11:47:49Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Code](<https://devfeed.tech/topics/code.md>), [browser](<https://devfeed.tech/topics/browser.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [ide](<https://devfeed.tech/topics/ide.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [cli](<https://devfeed.tech/tags/cli.md>), [code](<https://devfeed.tech/tags/code.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [ide](<https://devfeed.tech/tags/ide.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

A practical, opinionated collection of ways to run Kotlin code, ordered from browser-based experiments with no project to workflows using command-line tools and full development projects. It also discusses adding library dependencies where supported and notes that the recommendations are primarily tested on macOS.

### Source excerpt

Here's the situation. You find a snippet of Kotlin code somewhere on the Internet or in a book. You want to try it out. What is the quickest path to messing with the code? Here are some recipes for some options. I sorted them from the quickest no tools and no project all the way through to all the tools and all the projects. I'll provide info on how to add a library as dependencies if possible in each of the solutions. All of the options are free except the Intelij Enterprise IDE one. Disclaimers: This is not a complete guide, it is opinionated and it is a snapshot of the current state of the tools. Things always change and your favourite may not be listed. I tested most of these on my Mac so the solutions are Mac-centric. If you want to try them on another OS, you may need to fiddle and research a bit more. I usually code for myself or for mobile so no serverside or web code or docker containers. Quicklinks Here is an overview with links so you can jump directly to what suits your needs Tools No project with project Browser Playground Datalore CLI Compile and run REPL Amper Gradle Fleet 👆 See CLI section 👆 Amper Gradle Intellij Community/Android Studio Scratch file Wizard IDE Intellij Enterprise (not free) Notebook See Intellij Community section Resources Browser This recipe is for when you don't have a computer where you can install things. Maybe you are on a tablet or you are in an internet cafe in an unknown place or borrowing your neighbours laptop. It is good for code snippets that use standard java or kotlin libraries and output text. Playground You need A browser A website that can run code e.g. Kotlin playground Recipe open this website paste or type some code run Ctrl + R Adding dependencies A good way to see what you can add is to autocomplete an import statement. You have access to kotlin, kotlinx, java and javax. If you want to add other libraries you need to run your own instance of the kotlin playground with the libraries you need or you need to find

## How to build Wrapped 2023 in Compose Animation

DevFeed: [How to build Wrapped 2023 in Compose Animation](<https://devfeed.tech/articles/how-to-build-wrapped-2023-in-compose-animation-32058.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/how-to-build-wrapped-2023-in-compose-animation/>)

Published: 2023-12-09T15:18:17Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [SVG](<https://devfeed.tech/topics/svg.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [animation](<https://devfeed.tech/tags/animation.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-animation](<https://devfeed.tech/tags/compose-animation.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [svg](<https://devfeed.tech/tags/svg.md>)

### AI overview

A tutorial on recreating selected Spotify Wrapped 2023-style animations with Jetpack Compose. It demonstrates Canvas drawing, drawWithCache, gradients, RoundedPolygon transformations, looping animations, progressive line drawing, and extracting paths from SVG files.

### Source excerpt

How to build Wrapped 2023 in Compose Animation If I had to build the Spotify Wrapped 2023 animations in Compose, this is how I would do it. This blog post doesn't reproduce the effects identically, but it shows some of the basic Compose animation techniques you could use. It uses Canvas drawing and especially the drawWithCache modifier. It also uses RoundedPolygon, various matrix transformations and looping animation techniques using infiniteRepeatable. There is a section about how to get a path from an svg file as well. I created three different techniques. The first is a simple box with an animating linear gradient and an animating offset. The second is a spiky star using a RoundedPolygon with colour stop gradient and some animations in a graphicsLayer. The last is a progressivly drawing line. As a bonus we'll make a palette using unsplash.com and coolors.co Let's start with the palette. Pick a palette Pick an image from unsplash and pull some colours from the image. Here's one I got. I then loaded it into coolors.co and picked some palette colours from the image. Here are the colours I picked: val Pasta = Color(0xFFE7D6CE) val OrangeSquash = Color(0xFFFD9B72) val Plumberry = Color(0xFF682084) val Aubergette = Color(0xFF421F7B) val SwimmingCap = Color(0xFF4FBBA5) val Cherry = Color(0xFFFC1946) val Sherbet = Color(0xFFD33BB9) val Licorice = Color(0xFF35192B) val Custard = Color(0xFFFEC05D) We can now use these everywhere as gradients or backgrounds and our animation will have a consistent look that matches the mood from the image. Shimer pane - animating Linear Gradient For this sliding box we animate the offset with an infiniteRepeatable and we animate the offset of the LinearGradient. The colors of the gradient are chosen from the colors of our newly created palette. The linear gradient changes colour from corner to corner. By changeing the offset of the gradient it moves the gradient in the shape. If we then animate this offset it will make the colours move acro

## I still see LiveData - where are the Flows?

DevFeed: [I still see LiveData - where are the Flows?](<https://devfeed.tech/articles/i-still-see-livedata-where-are-the-flows-32059.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/i-still-see-livedata-where-are-the-flows/>)

Published: 2023-07-30T19:38:36Z

Content type: opinion

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [flow](<https://devfeed.tech/tags/flow.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [live-data](<https://devfeed.tech/tags/live-data.md>), [main-thread](<https://devfeed.tech/tags/main-thread.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [network](<https://devfeed.tech/tags/network.md>), [refactor](<https://devfeed.tech/tags/refactor.md>), [thread](<https://devfeed.tech/tags/thread.md>)

### AI overview

The article argues that LiveData is appropriate for observing UI state but is a poor fit for repositories because it is tied to the Android lifecycle and always runs on the main thread. It recommends using Kotlin Flows, particularly in repositories, because they support configurable dispatchers, richer operators, and multiplatform projects.

### Source excerpt

Hammer and nail There is no doubt LiveData is an easy, lifecycle safe way to observe some state which needs to be displayed on the UI. It is just so easy to create and easy to update. It is easy to observe. I think that may be why people use it everywhere where they need a simple observation. This ok, no guilt, no harm .... for the UI layers .... but there are better solutions for domain and data layers. This is not the first time this topic has come up yet I still see Live Data in a repository offered as a good solution from time to time, in blog posts, samples and in books. I think it is a case of people think they only have a LiveData hammer. There are infact pitfalls if you use LiveData in a repository. I think it's an anti-pattern. But why not LiveData is lifecycle aware - do we need this in our repository? Repostitories are typically provided by dependency injection, they could be singletons and they don't need to know about the Android lifecycle. LiveData always runs on the main thread, you can't change this. This is not what we want in a repository. Repositories often work with different data sources which could involve network or disk access tasks. I would argue that you need to be able to run these kinds of tasks on the correct dispatcher if your libraries do not already do this. This is the deal breaker for me because you can cause jank in the UI if you do this incorrectly. LiveData does have some capabilities to combine and convert LiveData variables with MediatorLiveData but flows provide a wide variety of elegant operators to choose from. This is probably not a solid argument more a case of convenience. Lastly, one of the biggest reasons after the main thread argument, why I would advocate for converting all of the LiveData use to flows: flows are part of the Kotlin coroutines library. This means they run on any platform where Kotlin coroutines run. You can use them in a multiplatform project. Or to put it differently, if you use flows in your repository i

## Swampy Refactor: Converting Otto Bus to Flows

DevFeed: [Swampy Refactor: Converting Otto Bus to Flows](<https://devfeed.tech/articles/swampy-refactor-converting-otto-bus-to-flows-32080.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/swampy-refactor-converting-otto-bus-to-flows/>)

Published: 2023-07-17T17:18:36Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [migration](<https://devfeed.tech/topics/migration.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [deprecated](<https://devfeed.tech/topics/deprecated.md>), [Code](<https://devfeed.tech/topics/code.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Git](<https://devfeed.tech/topics/git.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [deprecated](<https://devfeed.tech/tags/deprecated.md>), [flow](<https://devfeed.tech/tags/flow.md>), [git](<https://devfeed.tech/tags/git.md>), [migration](<https://devfeed.tech/tags/migration.md>), [otto-bus](<https://devfeed.tech/tags/otto-bus.md>), [refactor](<https://devfeed.tech/tags/refactor.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [swampy](<https://devfeed.tech/tags/swampy.md>)

### AI overview

This tutorial explains how to migrate an Android application from the deprecated Otto Bus event bus to Kotlin Flow. It presents an incremental, event-by-event process and notes that the work may require architectural refactoring, dependency-injection changes, and testing.

### Source excerpt

The story starts I was wandering around my day job's code base and I happened on a time capsule - a pristine Java Activity studded with semi-colons, a snapshot of how we built things in 2014. All the member variables started with m and there was plenty of logic to update the screen and dictate actions. Despite being old, it's still used every day by users. Why would I change it? The Bus disappears Well, it got its data from a subscription to the Otto Bus. Otto Bus was deprecated in 2016. A blog post suggested migrating to RxJava, but since our code base standard now involves coroutines, Flows, and in some cases, LiveData, I decided to remove deprecated libraries and complete the partial migrations we started some time ago. This blog post summarizes how to migrate from Otto Bus to Flow. I've also created a Git repo with a simplified example that uses Otto Bus, with a conversion to Flow in the commit history. Check out the otto-bus tag for the working Otto Bus version and the flow tag for the converted Flow version. I am sparing you the Java to Kotlin conversions. This toy app lets you tap on the 8 ball for a message. It uses Otto Bus to notify the 8 Ball that a new message is needed as well as when a new message is available. How to tackle the migration - step by step Here are the basic steps for this kind of migration: Pick one event Find All the producers of this event (hopefully, there is only one but don't count on it) Replace with compatible functionality. We'll look at how to choose compatible functionality in the next section. Things will be broken. Find all subscribers of this event by looking for @Subscribe annotations. Replace with a matching access mechanism. Things should work at this point. Test that everything that used this one event still works Repeat with the next event until there are no events left to migrate Remove the Otto bus and it's dependencies Celebrate! Of course this looks deceptively simple. As simple as it is to add otto bus to a code ba

## Using Fleet 1.19's AI Assistant to Convert Kotlin Between Imperative and Functional Styles

DevFeed: [Using Fleet 1.19's AI Assistant to Convert Kotlin Between Imperative and Functional Styles](<https://devfeed.tech/articles/the-imitation-tortoise-s-song-a-fleety-conversion-from-imperative-to-functional-will-you-join-the-dance-32082.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/the-imitation-tortoises-song-a-fleety-conversion-from-imperative-to-functional-will-you-join-the-dance/>)

Published: 2023-06-10T13:12:44Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [coding style](<https://devfeed.tech/topics/coding-style.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Functional programming](<https://devfeed.tech/topics/functional-programming.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [coding](<https://devfeed.tech/topics/coding.md>), [Code](<https://devfeed.tech/topics/code.md>), [Advent of Code](<https://devfeed.tech/topics/advent-of-code.md>)

Tags: [advent-of-code](<https://devfeed.tech/tags/advent-of-code.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-assistant](<https://devfeed.tech/tags/ai-assistant.md>), [code](<https://devfeed.tech/tags/code.md>), [coding-style](<https://devfeed.tech/tags/coding-style.md>), [doggerel](<https://devfeed.tech/tags/doggerel.md>), [fleet](<https://devfeed.tech/tags/fleet.md>), [functional](<https://devfeed.tech/tags/functional.md>), [functional-programming](<https://devfeed.tech/tags/functional-programming.md>), [imperative](<https://devfeed.tech/tags/imperative.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [word-games](<https://devfeed.tech/tags/word-games.md>)

### AI overview

The article experiments with Fleet 1.19's integrated AI assistant by converting Kotlin code for the Advent of Code 2022 Day 10 puzzle between imperative and functional styles, comparing the results, and generating poetry.

### Source excerpt

Once upon a time I admit. I have a penchant for word games and weird segues. So I will tell you what this post is about off the bat. You can skip to the code, I won't be offended. Fleet 1.19 was released this week with an integrated AI assistant. I took it for a spin and used it to convert Kotlin code from imperative style to functional and back again. I used some Kotlin code, which solves the Advent of Code 2022 Day 10 puzzle. I had written the solution in two styles and I had the AI assistant do the same conversion and compared the code. And then I played around and generated some poetry. Follow links at your peril, there are rabbit holes, it might make you late or change the size of your free time. Segue the first of many Oh you are still here! You didn't jump to the code starts here section? Why am I doing this? A long time ago, I read a lot of Lewis Caroll, Alice in Wonderland. In one scene Alice talks to the Mock Turtle. He sings a song about sea creatures dancing. When the first language translators appeared on the scene, Altavisa babelfish or perhaps it was the early Google Translate, I converted passages from Alice in Wonderland to French and then back again to see what the machines could do. The Mock Turtle was transformed into an Imitation Tortoise. In this way the reference to the original mock turtle soup was lost in translation. In a roundabout way I was wondering what would be uncovered or lost if I used the AI assistant for some translations in coding style. Couplets of doggerel My trusty and non emotional assistant had no opinion on Lewis Caroll but it made this for me. A definition of functional programming style in rhyming couplets: Functional programming's way, treats functions as the play. Immutable states they use, side effects they refuse. Declarative code is their choice, with functions, they rejoice. Nested functions map, filter, reduce, a clean, elegant code they produce. Compare this with the imperative version: Imperative code, step by st

## Android Makers by droidcon 2023: Talk and App Clinic Stream

DevFeed: [Android Makers by droidcon 2023: Talk and App Clinic Stream](<https://devfeed.tech/articles/amxdc23-32032.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/amxdc23/>)

Published: 2023-04-27T19:46:32Z

Content type: opinion

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-makers-2023](<https://devfeed.tech/tags/android-makers-2023.md>), [animate](<https://devfeed.tech/tags/animate.md>), [app](<https://devfeed.tech/tags/app.md>), [compose](<https://devfeed.tech/tags/compose.md>), [conference](<https://devfeed.tech/tags/conference.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [stream](<https://devfeed.tech/tags/stream.md>), [talk](<https://devfeed.tech/tags/talk.md>)

### AI overview

A personal commentary on Android Makers by droidcon 2023, describing it as a small conference with interesting talks and networking, and linking to the author's talk and the app clinic session stream.

### Source excerpt

Android Makers by droidcon 2023 was a lovely well sized conference. Big enough to hear some interesting talks and small enough to make new friends. Here is my talk and also the stream of the app clinic session.

## Four of a Kotlin Kind at I code Java 2022 conference

DevFeed: [Four of a Kotlin Kind at I code Java 2022 conference](<https://devfeed.tech/articles/four-of-a-kotlin-kind-at-i-code-java-2022-conference-32052.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/four-of-a-kotlin-kind-at-i-code-java-2022-conference/>)

Published: 2022-10-14T08:30:41Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Code](<https://devfeed.tech/topics/code.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [concepts](<https://devfeed.tech/tags/concepts.md>), [conference](<https://devfeed.tech/tags/conference.md>), [declarative](<https://devfeed.tech/tags/declarative.md>), [functional](<https://devfeed.tech/tags/functional.md>), [imperative](<https://devfeed.tech/tags/imperative.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [object-oriented](<https://devfeed.tech/tags/object-oriented.md>), [pitfalls](<https://devfeed.tech/tags/pitfalls.md>), [talk](<https://devfeed.tech/tags/talk.md>), [tips](<https://devfeed.tech/tags/tips.md>), [traces](<https://devfeed.tech/tags/traces.md>)

### AI overview

The article introduces a talk about Kotlin's support for imperative, declarative, functional, and object-oriented programming. It highlights tips, guidelines, pitfalls, definitions, software history, and how Kotlin supports these concepts.

### Source excerpt

I shared my talk titled Imperative, Declarative, Object oriented, functional: Four of a Kotlin Kind at the I code Java conference. The abstract: Is Kotlin a functional language? Yes, but... Is it object oriented? Yes, but... Looking at four concepts: imperative, declarative, functional and object oriented How does Kotlin make it easy to use either or all at the same time. This talk contains: Some useful Kotlin tips, some guidelines and pitfalls for the four concepts, traces of definitions and software history. After listening to this talk you will understand what these concepts are, what each is good for and how they are supported by the Kotlin language. You can see the talk here

## Droidcon Berlin 22

DevFeed: [Droidcon Berlin 22](<https://devfeed.tech/articles/droidcon-berlin-22-32048.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/droidcon-berlin-22/>)

Published: 2022-07-06T17:38:47Z

Content type: opinion

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [panel](<https://devfeed.tech/tags/panel.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>), [scale](<https://devfeed.tech/tags/scale.md>), [talk](<https://devfeed.tech/tags/talk.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

A personal recap of Droidcon Berlin 2022, where the author presented a talk on Compose, participated in a panel discussion about Android at Scale, and discussed Android and public speaking.

### Source excerpt

Droidcon Berlin 22 what a blast! I presented a talk on Compose. I spoke on a panel and made fantastic new friends and caught up with old/online ones. The panel discussion was about Android at Scale The talk title was Something old, something new: adding Jetpack Compose to a large open source app. Video video I also had a great time chatting to Matt and Madona about all sorts of Android and public speaking things.

## Adding Jetpack Compose to Habitica, a Large Open Source Android App

DevFeed: [Adding Jetpack Compose to Habitica, a Large Open Source Android App](<https://devfeed.tech/articles/droidcon-sf-22-32049.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/droidcon-sf-22/>)

Published: 2022-06-02T20:07:56Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [droidcon-sf](<https://devfeed.tech/tags/droidcon-sf.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [migration](<https://devfeed.tech/tags/migration.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [practical](<https://devfeed.tech/tags/practical.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

A Droidcon SF 2022 talk report about adding Jetpack Compose to Habitica, an open source Android habit-tracking app. It covers assessing the existing architecture, planning the migration, porting UI components, and documenting implementation challenges.

### Source excerpt

Droidcon SF 2022, first conference outside of South Africa after the lockdown years. I was so happy to be part of the speakers for my talk titled Something old, something new - adding Jetpack Compose to a large open source app Here's the abstract: Jetpack Compose is the new UI framework for Android from Google. Can I take an existing large open source Android app and get the benefit of what compose offers? This talk is a practical report of adding the new UI framework to an existing consumer app. The app I have chosen is Habitica the very popular habit tracking app. I am presenting this exploration as a travel diary of sorts. It will include: Lay of the land: looking at the existing code architecture and assessing where best to add the new framework A map and a plan: opinions on architectural choices that make migration easier Lists and Columns: a practical demonstration of how to port existing UI Here be monsters: recounts of trials and tribulations of working with the existing code and the new framework Home again: a demo I made some lovely new friends, thanks Tasha for the photo. Also the video and the slides

## Retro Cursor-Inspired Animations in Jetpack Compose

DevFeed: [Retro Cursor-Inspired Animations in Jetpack Compose](<https://devfeed.tech/articles/animated-pixie-dust-cursor-and-more-32035.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/animated-pixie-dust-cursor-and-more/>)

Published: 2022-05-24T20:11:19Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Code](<https://devfeed.tech/topics/code.md>), [Canvas](<https://devfeed.tech/topics/canvas.md>)

Tags: [90s-website](<https://devfeed.tech/tags/90s-website.md>), [animate](<https://devfeed.tech/tags/animate.md>), [animation](<https://devfeed.tech/tags/animation.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [mobile](<https://devfeed.tech/tags/mobile.md>)

### AI overview

A tutorial describing Jetpack Compose implementations of retro cursor-inspired mobile animations. It covers gesture-controlled draggable content, an animated lifesaver candy, a pulsing heart, and a pixie-dust particle effect.

### Source excerpt

Another installment of the 90s web aesthetic experiments. In the 9Os animated cursors were all the rage. On a mobile device of course we don't have the concept of a cursor. There are gestures that can be detected: touches and drags. So for this project I split up the following pieces to code: The benefits of this approach are the animating composables can be reused as progress indicators or other elements that appear or disappear to reward customers on their actions. Detect gestures and draw a composable lambda on screen based on the gestures - CursorVisible Build a few animating composables An animating lifesaver candy /Sweet A pulsing pink and red heart Build a screen where I can switch the different animating composables in the CursorVisible composable Build pixie dust animation by repurposing my confitti code First of all I needed a Composeable which would take a content and could allow me to drag another composable around. Here's the code for this. It makes the content visible and invisible on a tap and lets you drag the content. @Composable fun CursorVisible(content: @Composable () -> Unit) { val boxSize = 100.dp val boxPx = with(LocalDensity.current) { boxSize.toPx() } var offset by remember { mutableStateOf(Offset(0f, 0f)) } var visible by remember { mutableStateOf(false) } Box(modifier = Modifier .fillMaxSize() .pointerInput(Unit) { detectTapGestures { offset = it - Offset(boxPx/2, boxPx/2) visible = !visible } } ) { if (visible) { Box( Modifier .offset { offset.round() } .size(boxSize) .pointerInput(Unit) { detectDragGestures { change, dragAmount -> change.consumeAllChanges() offset += dragAmount } } ) { content() } } } } This CursorVisible can have content of anything. So I made a lifesaver sweet/candy that changes colour and a pulsing red and magenta heart. The lifesaver is just circles and arcs drawn on the canvas and then some parameters such as angle and colour animated. @Composable fun LifeSaver(rainbow: List<Color> = SkittlesRainbow) { val color by

## Kotlin Flow Notes: Producers, Consumers, Operators, and Hot and Cold Flows

DevFeed: [Kotlin Flow Notes: Producers, Consumers, Operators, and Hot and Cold Flows](<https://devfeed.tech/articles/flow-notes-32051.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/flow-notes/>)

Published: 2022-04-27T16:16:06Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [kotlin-flow](<https://devfeed.tech/topics/kotlin-flow.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Large Screen](<https://devfeed.tech/topics/large-screen.md>), [Streams](<https://devfeed.tech/topics/streams.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [article](<https://devfeed.tech/tags/article.md>), [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [cheat-sheet](<https://devfeed.tech/tags/cheat-sheet.md>), [code](<https://devfeed.tech/tags/code.md>), [coroutine](<https://devfeed.tech/tags/coroutine.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [coroutines-flow](<https://devfeed.tech/tags/coroutines-flow.md>), [flow](<https://devfeed.tech/tags/flow.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [kotlin-flow](<https://devfeed.tech/tags/kotlin-flow.md>), [sharedflow](<https://devfeed.tech/tags/sharedflow.md>), [sketch-note](<https://devfeed.tech/tags/sketch-note.md>), [stateflow](<https://devfeed.tech/tags/stateflow.md>), [streams](<https://devfeed.tech/tags/streams.md>)

### AI overview

A set of companion sketch notes about Kotlin Flow, covering suspend functions, streams of multiple values, producers and consumers, terminal and transform operators, execution contexts, hot and cold flows, and Android usage.

### Source excerpt

This post is my companion sketch notes for all the resources I consumed on the topic of flows. It is not meant to replace the info that I found on the internet but rather supplement it. Nor is it complete or should it be a standalone guide. In fact you can find an excellent list of my favourite resources at the end of the article. It is a document that helps me make sense of the topic. With that disclaimer out of the way... Let's take a step back and look at the suspend function. If your coroutine knowledge is rusty, freshen that up first. What if we want to provide multiple values? A stream of values that can be observed? Enter flows. At their most basic, flows have a producer and a consumer. The interface looks like this (spoiler it's just suspend functions under the hood) The consumer gets the multiple values by using a terminal operator. If I need to change the produced values along the way before consuming them, there are transform operators. How do I switch from main to io context? What's with the hot and cold flows? How do I remember which is which? Some practical hot flows. Flows on Android References Kotlin Coroutines Flow in a nutshell Kotlin Flows ~ an Android cheat sheet Kotlin Flows in Android summary Android flow Asynchronous Flow | Kotlin Flow under the hood: how does it really work KotlinConf 2019: Asynchronous Data Streams with Kotlin Flow by Roman Elizarov Kotlin Flows in a Nutshell FlowMarbles Android StateFlow and SharedFlow If you are reading this far I will reward you with an Android portait.

## DevConf 2022: Presenting Jetpack Compose Interoperability with an Existing Open-Source Android App

DevFeed: [DevConf 2022: Presenting Jetpack Compose Interoperability with an Existing Open-Source Android App](<https://devfeed.tech/articles/devconf-22-32047.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/devconf-22/>)

Published: 2022-04-07T14:26:46Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [opensource](<https://devfeed.tech/topics/opensource.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [conference](<https://devfeed.tech/tags/conference.md>), [devconf-2022](<https://devfeed.tech/tags/devconf-2022.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [opensource](<https://devfeed.tech/tags/opensource.md>)

### AI overview

A brief personal report about attending DevConf 2022 and presenting how Jetpack Compose interoperates with an existing open-source Android app. The post links to the presentation slides.

### Source excerpt

Wow my first in real life conference in two years with DevConf 2022 Presenting on Jetpack Compose and how it interoperates with an existing opensource Android app. Find the slides here

## Kibeth Codes Twitch Highlights: Exploring Jetpack Compose in Habitica

DevFeed: [Kibeth Codes Twitch Highlights: Exploring Jetpack Compose in Habitica](<https://devfeed.tech/articles/kibeth-codes-twitch-highlights-1-32065.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/kibeth-codes-twitch-highlights-1/>)

Published: 2022-03-02T19:38:36Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Twitch](<https://devfeed.tech/topics/twitch.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>), [App](<https://devfeed.tech/topics/app.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [To-Do](<https://devfeed.tech/topics/todo.md>)

Tags: [app](<https://devfeed.tech/tags/app.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [streaming](<https://devfeed.tech/tags/streaming.md>), [talk](<https://devfeed.tech/tags/talk.md>), [twitch](<https://devfeed.tech/tags/twitch.md>)

### AI overview

Kibeth Codes is a Twitch stream exploring how to add Jetpack Compose to the open source Habitica habit-tracking and to-do app. The post introduces a selection of stream highlights.

### Source excerpt

To practise for live speaking and to explore how to add Jetpack Compose to an existing open source app, I start a twitch stream as kibethcodes. The app I chose to work on is Habitica, a habit tracking/ToDo app that saw it's first commit in 2015. Streaming Tuesdays at 19:00 UTC+2 Here are a selection of highlights of the twitch stream.

## Links to Learn Compose

DevFeed: [Links to Learn Compose](<https://devfeed.tech/articles/links-to-learn-compose-32067.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/links-to-learn-compose/>)

Published: 2022-02-28T19:43:48Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Learning](<https://devfeed.tech/topics/learning.md>), [Android](<https://devfeed.tech/topics/android.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [books](<https://devfeed.tech/tags/books.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [learn](<https://devfeed.tech/tags/learn.md>), [links](<https://devfeed.tech/tags/links.md>), [resources](<https://devfeed.tech/tags/resources.md>), [streams](<https://devfeed.tech/tags/streams.md>), [videos](<https://devfeed.tech/tags/videos.md>)

### AI overview

A curated selection of resources for learning Jetpack Compose, including official documentation and samples, community websites, videos, books, streams, and materials on specialized areas such as modifiers, state, and animation.

### Source excerpt

At the moment people often ask me where to go start learning Jetpack Compose. Here is a a hand picked selection of my favourite Compose resources. These may change as I find new ones. There should be something for everyone, Official, Community, Videos, Books, Streams. Official docs Official Docs Pathway Official apps Jetpack Compose Samples Material Catalog Community websites Jetpackcompose.app compose.academy Jetpack Compose Playground Videos Philip Lackner Compose playist Coding in Flow Books Android UI Development with Jetpack Compose - Thomas Künneth Practical Jetpack Compose - Joe Birch Compose Internals - Jorge Castillo Twitch Coding with the Italians Kibeth Codes Adam McNeilly Florian Walther Specialised areas Modifiers how it works State Animation

## Lightning Demo of Compose animation

DevFeed: [Lightning Demo of Compose animation](<https://devfeed.tech/articles/lightning-demo-of-compose-animation-32066.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/lightning-demo-of-compose-animation/>)

Published: 2022-02-28T19:13:06Z

Content type: article

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Demo](<https://devfeed.tech/topics/demo.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-animation](<https://devfeed.tech/tags/compose-animation.md>), [demo](<https://devfeed.tech/tags/demo.md>), [desktop](<https://devfeed.tech/tags/desktop.md>), [lightning](<https://devfeed.tech/tags/lightning.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [talk](<https://devfeed.tech/tags/talk.md>)

### AI overview

A lightning talk for Jozi-JUG demonstrates Compose animation on mobile and desktop, with accompanying slides.

### Source excerpt

A lighting talk for Jozi-JUG demonstrating Compose animation and demo on mobile and desktop. slides

[Next page](<https://devfeed.tech/sources/maiatoday.md?cursor=WyIyMDIyLTAyLTI4VDE5OjEzOjA2KzAwOjAwIiwgIjgxOGFiMGUxLTk4YjItNDc3MC1iNjBmLWYzNTZjMjUzZWVkNiJd>)