Bangalore · IST

Hi, I'm Gokul. I lead mobile at MyFi in Bangalore, and I've shipped Flutter and Swift apps since 2019. I also build open-source tools other developers install, and I take apps apart to see how they work.

Open to SDE and mobile lead roles

saigklkrishnan@gmail.comCopy emailRésumé ↗

Things I've built that I'm proud of

If the connection drops, it reconnects and resumes from the last event. Each word below is one server event. pub.dev ↗

What does EventFlux do?
It keeps one HTTP connection open so the server can push updates the moment they happen. If the connection drops, it backs off, reconnects and resumes from the last event, so nothing is lost.
Ready

Pure black, with violet, amber and crimson accents. Zed extension ↗

class Feed extends ChangeNotifier {
  final List<Post> posts = [];

  @override
  Future<void> refresh() async {
    final res = await http.get(Uri.parse('https://api.example.com/feed'));
    if (res.statusCode == 200) notifyListeners();
  }
}

A short Dart snippet in The Dark Side's colours.

A home server I run for media, network-wide ad blocking and coding agents. One conversation plays below.

sAIbot
The conversation is illustrative.

Favorite commits and learnings

The paywall check lived inside the Android app. I decompiled it, found the one flag in about 20K obfuscated files, and sent a VDP report. Read the story →

The verify step checked the code but let the request say whose account it was. Now the account comes only from what the provider verified.

A small Go service keeps the AI stream running after the app closes. Reopen it and it replays what you missed; if you don't, one push says it's ready.

Phone
Server
Each dot is a piece of the answer.

Poster images held every HTTP/1.1 connection the browser allows, so the movie list waited in line. Cancelling them on refresh fixed it. Read the PR ↗

Poster 1
Poster 2
Poster 3
Poster 4
Poster 5
Poster 6
Movie list
0 s2 s4 s6 s8 s

The movie list waited for a free connection: 7.5 s in the real app.Poster loads were cancelled, so the movie list went first: 695 ms.

Six connections per site, all held by posters. Sped up; 7.5 s and 695 ms are from the PR.

A blur package screenshotted the whole screen every frame, and GPU memory hit about 3 GB. I replaced it with a two-pass shader that blurs in place.

Before
Screen→Copy the whole screen to an image→Blur→Drawevery frame
After
Screen→Shader blurs the backdrop in place→Draw
Wait before content350 ms
After1 frame

Patching my theme's colours would have fixed it for my users only. I rewrote Zed's Dart highlight queries instead, and every theme got the fix. Read the PR ↗

class Feed extends ChangeNotifier {
  final List<Post> posts = [];

  @override
  Future<void> refresh() async {
    final res = await http.get(Uri.parse('https://api.example.com/feed'));
    if (res.statusCode == 200) notifyListeners();
  }
}

Illustrative snippet in The Dark Side's colours. The PR has the real screenshots.

Say hi

saigklkrishnan@gmail.comCopy email
© 2026 Sai Gokula Krishnan