mooner / Resume KO/EN /

mooner:~/resume $ cat projects/starlight/README.md

Project StarLight

Scriptable messenger auto-reply framework

A cross-messenger auto-reply framework that hands incoming messages to scripts users write and sends their replies. KakaoTalk connects through Android notifications and their reply action, Discord through a plugin, and script languages and features are added as plugins too.

Site ↗Source ↗

mooner:~/resume/projects/starlight $ tree -L 1

Structure01

구조

06 parts

Three Gradle modules and a plugin format (.slp). The app and its plugins share one SDK, PluginCore.

app/
Notification listener, message parsers, the built-in JavaScript engine (Rhino), 18 script APIs, a code editor and a debug room for testing.
PluginCore/
The SDK shared by the app and plugins: extension points for script languages, APIs, project events, widgets and the event bus.
ConfigDSL/
Declare a settings screen in a Kotlin DSL and it renders as a list; used for both app and plugin settings.
*.slp
A plugin package with a starlight.json manifest, adding Discord, new script languages such as V8, or new APIs.
starlight-version
Latest version and changelog per channel (snapshot · beta · release), read by the in-app update check and the landing page.
Gradle plugin
A build task that packs a plugin project into .slp, published on the Gradle Plugin Portal.

mooner:~/resume/projects/starlight $ cat docs/architecture.md

Architecture02

아키텍처

Data flow

MESSENGERnotificationLISTENERpackage + profilePARSER SPECroom · senderPROJECTSallowed events onlySCRIPTonMessage(event).SLP PLUGINSDiscord · V8 · APIaddLanguage · addApiREMOTEINPUTreply actionevent.room.send()// each project runs on its own thread pool;// an error stops only that project

A notification flows rule → parser → event → project, and a script’s reply goes back through that notification’s reply action.

  • A rule is matched by app package and user profile, and the parser it picks extracts the room, the sender and the reply path. KakaoTalk comes in through this built-in rule; Discord connects through a separately shipped plugin.
  • Events reach only the projects that allow them, matched against a wildcard tree of event IDs.
  • Each project has its own thread pool, and an error stops only that project.
  • The plugin loader checks reserved IDs and API versions, loads in dependency order, and keeps plugins from shadowing core classes.
  • Legacy APIs and the response event are implemented too, so scripts from existing auto-reply apps run as they are.

mooner:~/resume/projects/starlight $ git log --grep=fix

Problem solving03

문제 해결

03 cases

  1. 01

    Every message got two replies

    Problem
    The day after the public alpha, a user reported that one command got two replies.
    Approach
    Android sometimes registers a second notification listener without shutting down the first, so the app now drops a message whose ID matches the one just handled.
    Result
    A fixed build went out right away, and the reporter confirmed it and closed the issue.
  2. 02

    Replies went to the wrong room

    Problem
    The legacy response event replied to whichever room had notified last, not the room the command came from, because there was a single replier with no room attached.
    Approach
    After checking how the app it stays compatible with behaves, the listener now creates one replier per room and keeps them in a weak-reference cache.
    Result
    Shipped in 0.3.2a. New scripts are pointed to onMessage, whose event carries the room.
  3. 03

    The app crashed on Android 14 and below once logs piled up

    Problem
    After moving the compile SDK to 35, the app crashed on Android 14 and below whenever a project’s log went over its limit.
    Approach
    Traced it to Kotlin compiling removeFirst to a method those Android versions lack (KT-71375) and wrote it up in an issue. Until a fix was ready, the download link was rolled back to the last stable build; the fix itself was an outside contributor’s PR (#60), reviewed and merged.
    Result
    Resolved in 0.3.3a, closing the three issues with that cause.

mooner:~/resume/projects/starlight $ ls ./screens

Screens04

화면

02 images

Projects tab listing JavaScript and V8 projects with edit, recompile and debug-room buttons
Projects
Plugins tab with the V8, Discord and Awt plugins installed
Installed plugins

Accepting requestsAnsan --:-- KST

mooner:~/resume $ ./contact.sh

Contact→

Name
문민기 / Minki Moon
Handle
@mooner
Base
Ansan, KR

Happy to trade coffee for conversation.

If anything here catches your eye, feel free to reach out.

// ping me anytime — i read all.

© 2026 Minki Mooncrafted with monospace affection · rev 2026.10.18