INDEPENDENT DEVELOPER
Curiosity → Code → Creation.
I work across web development, developer utilities, weather tools, and Discord projects. I like clean interfaces, practical features, and shipping things people can actually use.
INDEPENDENT DEVELOPER / PAUZE
Developer, builder, and curious human. I make tools, bots, and digital projects — one idea at a time.
↓A LITTLE ABOUT ME
Building useful things, learning in public, and turning random ideas into real projects.
INDEPENDENT DEVELOPER
I work across web development, developer utilities, weather tools, and Discord projects. I like clean interfaces, practical features, and shipping things people can actually use.
TOOLS IN MY TOOLBOX
The languages, frameworks, and platforms I use to bring ideas to life.
PROJECTS / 01
A showcase of things I’ve been building, testing, and improving.
PX / 001
A focused weather experience built around live conditions, radar, precipitation layers, and useful information without the clutter.
EXPLORE PROJECT ↗PX / 002
A growing set of tools and utilities designed to make digital workflows feel more deliberate and less complicated.
VIEW ON GITHUB ↗PX / 003
Discord bots, community tools, developer experiments, and small ideas that turn into something useful.
BROWSE THE ORGANIZATION ↗BONUS LEVEL / 005
Six games. Pick your mode, take a break, and beat your own best.
SPACE / ↑ JUMP • ↓ DUCK • P PAUSE
Six tiny games, one arcade. Personal bests are saved locally on this device.
BUILD NOTES / 01
A closer look at how PauzeWeather is put together — from live forecast data to a short AI weather briefing.
An Android weather client built with Kotlin and Jetpack Compose.
PauzeWeather sends a location query to WeatherAPI's forecast endpoint. The repository parses the response into typed weather data, including current conditions and a five-day forecast with temperature ranges and rain chances.
val url = URL(
"https://api.weatherapi.com/v1/forecast.json" +
"?key=\${BuildConfig.WEATHER_API_KEY}" +
"&q=$encodedQuery&days=5&aqi=no&alerts=no"
)
The request runs on Dispatchers.IO, uses connection/read timeouts, and converts non-success HTTP responses into errors for the UI state to handle.
After the forecast loads, a separate Groq request turns the supplied conditions into three concise points: how it feels outside, what to wear, and one useful thing to know. The prompt explicitly tells the model not to invent weather data.
append("Give 3 short bullet points: ")
append("what it feels like, what to wear, ")
append("and one useful thing to know. ")
append("Do not invent data.")
The briefing is optional UI data: current conditions and the forecast are placed in the success state first, then the state is updated when the briefing arrives.
A ViewModel exposes a StateFlow with explicit Idle, Loading, Success, and Error states. Jetpack Compose collects that state and renders the matching screen, keeping request logic out of the UI components.
sealed interface WeatherUiState {
data object Idle : WeatherUiState
data object Loading : WeatherUiState
data class Success(
val weather: WeatherData,
val aiBriefing: String? = null
) : WeatherUiState
data class Error(val message: String) : WeatherUiState
}
The search uses coroutines in viewModelScope; the network repositories switch to Dispatchers.IO for blocking HTTP work.
STACK / KOTLIN · JETPACK COMPOSE · WEATHERAPI · GROQ
VIEW PAUZEWEATHER PROJECT ↗ENGINEERING NOTES / Based on the current PauzeWeather implementation.
02 / AROUND THE CODE
Public GitHub events and live Discord presence. Real signals, no fabricated stats.
Latest public events from the GitHub API.
Looking for live Discord presence…
ID / 1547264515182432398Waiting for Discord status…
Artist
AlbumLive status requires your Discord presence to be available through Lanyard.
03 / GET IN TOUCH
Have a project in mind, found something interesting, or just want to talk code?
GET IN TOUCH ↗