Skip to content
View fewling's full-sized avatar

Sponsoring

@tranxuanthang

Block or report fewling

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
fewling/README.md

fewling — mobile, backend, cloud, ai

How I work

  • Spec-driven — every project starts as a written spec + plan in the repo, before any code.
  • Contract-first — one schema generates the clients and types, so a polyglot system can't drift.
  • Tested & observable — unit/integration tests across backends and web; crash reporting and analytics from day one.
  • Build my own tooling — custom CLI/MCP, Mason bricks, agent skills, internal Claude Code plugin, etc. to automate the boring parts and unlock new capabilities.
Languages Dart, TypeScript, JavaScript, Java, Kotlin, Python, GDScript (Godot), C#
Frontend Flutter, React, Next.js, Tailwind, Material UI shadcn/ui
Backend Spring Boot, NestJS, Node.js, Firebase OpenAPI
Data MongoDB, PostgreSQL, MySQL DBeaver
Cloud AWS, GCP, Firebase DigitalOcean
DevOps GitHub Actions, Docker, Git, GitLab cc-switch Claude Code Codex
Testing Selenium, Postman Playwright
Tools VS Code, IntelliJ IDEA, PyCharm, Android Studio, Figma, Ubuntu, Windows, macOS, Raspberry Pi, Arduino Cursor Xcode
AI Vercel AI SDK Google ADK genkit OpenAI Anthropic / Claude Gemini n8n dify ComfyUI

Floating Lyric (My Main Project)

Time-synced lyrics in a floating overlay that stays on top of any Android app. On Google Play →

The Hard Parts

  • Reads the currently-playing track from any music app through a NotificationListenerService over Android MediaSessions — no per-app integration.
  • Paints a system overlay over arbitrary foreground apps from a foreground service, bridged to Flutter across custom Method/Event platform channels.
  • Time-syncs .lrc on device (Hive), with Storage Access Framework import and online lyric search as fallback.
  • Translation runs server-side through a Genkit flow on DeepSeek — with an output validator, App Check, and per-user rate limiting.

System design

One contract, three languages. An OpenAPI 3.1 spec is the single source of truth: the Dart client and the TypeScript functions are both generated from it, and the Kotlin services share the same DTOs — so a polyglot system can't drift. The backend is mid-migration from Firebase Cloud Functions to a self-owned Spring Boot microservices monorepo (Kotlin, Java 25) — its own JWT + refresh-rotation auth service, shared contract libraries, and custom Gradle convention plugins — for cost, control, and owning the runtime end to end.

%%{init: {'theme':'base','themeVariables':{'fontFamily':'ui-monospace, SFMono-Regular, Menlo, monospace','primaryColor':'#161b22','mainBkg':'#161b22','primaryTextColor':'#e6edf3','nodeTextColor':'#e6edf3','primaryBorderColor':'#1D9E75','nodeBorder':'#1D9E75','lineColor':'#5DCAA5','textColor':'#adbac7','clusterBkg':'#0d1117','clusterBorder':'#30363d','edgeLabelBackground':'#0d1117'}}}%%
flowchart TB
  subgraph DEV["on device · android (kotlin)"]
    direction LR
    NL["notification listener<br/>reads any app's MediaSession"]
    OV["overlay foreground service<br/>draws over any app"]
    PC["method + event channels"]
  end
  subgraph APP["flutter app"]
    direction LR
    BLOC["BLoC · go_router"]
    HIVE["Hive store<br/>lyrics · settings"]
    OBS["Firebase<br/>Crashlytics · Analytics · App Check"]
    CLI["generated API client"]
  end
  subgraph CON["contract · single source of truth"]
    SPEC["OpenAPI 3.1<br/>translate · feature flags · version gate"]
  end
  subgraph FB["backend · firebase (current)"]
    direction LR
    FN["Cloud Functions<br/>auth + rate-limit middleware"]
    GK["Genkit flow<br/>translate + validator"]
    FS["Firestore<br/>rate limits · supporters"]
    WH["Ko-fi / Afdian webhooks"]
  end
  subgraph SB["backend · spring boot (in progress)"]
    direction LR
    CORE["core service"]
    AUTH["auth service<br/>JWT + refresh rotation"]
    LIBS["shared contract libs"]
  end
  DS["DeepSeek LLM"]

  NL --> PC
  OV --- PC
  PC --> BLOC
  BLOC --> HIVE
  BLOC --> OBS
  BLOC --> CLI
  SPEC -->|codegen| CLI
  SPEC -->|codegen| FN
  SPEC -.shared DTOs.-> LIBS
  CLI -->|HTTPS| FN
  CLI -.migrating.-> CORE
  FN --> GK
  FN --> FS
  WH --> FS
  GK --> DS
  CORE --- LIBS
  AUTH --- LIBS
Loading
Repo Role
flutter-floating-lyric-openapi OpenAPI contract — single source of truth
flutter-floating-lyric-pkg-generated-openapi Generated Dart client package
floating-lyric-spring-boot Spring Boot (Kotlin) microservices backend
floating-lyric-web Next.js marketing site

Open source

flutter/flutter #168005 — added header & footer slots to the Material NavigationDrawer widget. Merged into the framework, May 2025.


contribution snake

felixwong875@gmail.com · Floating Lyric on Google Play

Pinned Loading

  1. floating-lyric-spring-boot floating-lyric-spring-boot Public

    Spring Boot backend for Floating Lyric (in progress; replacing Firebase).

    Kotlin

  2. floating-lyric-web floating-lyric-web Public

    Marketing landing site for Floating Lyric (Next.js).

    TypeScript

  3. flutter-floating-lyric-openapi flutter-floating-lyric-openapi Public

    OpenAPI contract shared between the Floating Lyric app and its backend.

  4. flutter-floating-lyric-pkg-generated-openapi flutter-floating-lyric-pkg-generated-openapi Public

    Generated Dart DTO package built from the Floating Lyric OpenAPI contract.

    Dart