I started building small web tools as a hobby to improve usability issues I personally experienced while using university web services. Many of these projects began as minimal solutions and evolved through real usage and long-term maintenance.
https://github.com/reflation/extension
A browser extension that improves the login experience of “Dreamy (하영드리미)”, the academic record service of Jeju National University.
- Core features include session reuse and persistence, fixing an issue where users were redirected to the login page even with a valid session
- Replaced the entire original HTML markup with Preact-based UI components for better control and maintainability
- Wrote integration tests for state management
- Related PR: reflation/extension#61
- Test code:
src/app/app.test.tsx
- Maintained the project for over 6 months, releasing versions 0.1.1 through 0.2.5
- Releases: https://github.com/reflation/extension/releases
- Used regularly by a small group of fellow students during its active period (June–August 2020)
https://github.com/mu-hun/jejunu-bob-pwa
A simple web app that displays the daily cafeteria menu for Jeju National University, built to avoid repeatedly navigating the official website.
- Implemented Service Worker–based proxying and caching to enable offline usage
- Initially built with Vue.js, later refactored to React and Redux Toolkit as a learning and maintenance exercise
- Menu data was collected, normalized, and served via an AWS backend pipeline
AWS backend pipeline details
from datetime import datetime
import boto3
import json
from jejunuMeals import JejunuMeals
Bucket = boto3.resource('s3').Bucket('jejunu.muhun.dev')
def lambda_handler(event, context):
Dump = json.dumps(JejunuMeals().menus(), ensure_ascii=False)
Bucket.put_object(
Key='meals/index.json', Body=Dump)
The data is collected every Monday at 10:00 AM (KST) and stored in an S3 bucket.
- UTC 01:00 = KST 10:00
- The schedule is handled via a cron-triggered AWS Lambda function.
- Data fetching and parsing are implemented using a custom module,
jejunuMeals, which I developed and maintained: https://pypi.org/project/jejunuMeals/
from flask import Flask
import boto3
app = Flask(__name__)
Bucket = boto3.resource('s3').Object('jejunu.muhun.dev', 'meals/index.json')
@app.route('/')
def lambda_handler(evt, context):
return Bucket.get()['Body'].read()
if __name__ == '__main__':
app.run()When a request is made to the endpoint, the server responds with the cafeteria menu data stored in the S3 bucket.
- The endpoint acts as a lightweight HTTP interface for clients.
- This separation allows data collection and data serving to be independently managed.
https://github.com/mu-hun/.dotfiles
- Created to avoid spending several hours reconfiguring development environments on new machines
- Repository contains Bash scripts for automated installation and setup of essential tools and desktop preferences
- Focused on reproducibility and minimal manual intervention
https://github.com/mu-hun/jejunu-icalendar-server
- Automatically converts timetable data from the university web portal into iCalendar format
- Implemented using a test-driven approach: README.en.md#test-driven-implementation
- Provides an HTTP iCal endpoint
- Runs a cron job every weekday at 10 AM to keep data up to date
- While working on a client project that integrated the Jodit WYSIWYG editor, discovered a runtime error in the official React wrapper
- Investigated the root cause through debugging
- Submitted a patch with a detailed explanation, which was merged into the official repository
18220 – Medium – Filter · type-challenges
This type-level Filter utility was designed based on a real need to reason about conditional selection and narrowing at the TypeScript type level.
After implementing and validating the solution, I proposed this challenge to type-challenges as a new quiz, so others could practice similar patterns in type-level programming.
- Issue and PR proposing the challenge: type-challenges/type-challenges#18220
- Identified that certain HTML elements default to border-box behavior
- Verified the behavior against W3C and WHATWG specifications
- Contributed documentation updates to MDN while improving button accessibility in an open-source project
https://github.com/mu-hun/jodit-table-border-adjuster
A plugin that allows to adjust the border-width of a table and cells in the Jodit WYSIWYG editor.
- Built to meet a specific client requirement during a web integration project
- Designed and implemented as a standalone plugin for reuse
Participated as an intern during the transition from a prototype Electron launcher to a production product.
- Implemented a proof-of-concept for blockchain mining and signing features during the first week:
https://github.com/mu-hun/libplanet-concept
Contributed to a blockchain explorer web service and its GraphQL-based frontend during the first two weeks after joining.
- Reported and fixed browser compatibility issues related to the built-in
Intlmodule:
planetarium/libplanet-explorer-frontend#93 - Reintroduced ESLint and static type checking, integrating them into CI
- ESLint & CI: planetarium/libplanet-explorer-frontend#110
- Type checking: planetarium/libplanet-explorer-frontend#106
Participated as an intern during the transition from a prototype Electron launcher to a production product.
- Resolved all previously ignored TypeScript type-checking issues
planetarium/9c-launcher#249 - Introduced static type-checking policies into version control
planetarium/9c-launcher#275 and continuous integration (CI) pipelines
planetarium/9c-launcher#264 - Wrote E2E tests covering the full flow: launcher login → loading → game start
- Spectron setup (with mentor): planetarium/9c-launcher#271
- Full E2E test write PR: planetarium/9c-launcher#284
- maintenance history:
commits/34ae25d/__tests__/main.spec.ts
- Contributed TypeScript type definitions to DefinitelyTyped based on internally used type definitions
- Decentralization Intersects with Online Games:
https://snack.planetarium.dev/eng/2020/10/decentralized-and-online-game-intersect/ - Internship retrospective https://frontend.moe/en/posts/planetarium-internship/
Resolved layout issues caused by problematic markup structures through refactoring and simplification.
- Button group text overflow on Space page (Korean) penxle/withglyph#236
- Safari image cropping issue for tall vertical images (Korean) penxle/withglyph#1058
For additional details, please refer to the link below (Korean):
https://frontend.moe/posts/penxle-company-works/
Most of my work exists as:
- Long-term maintained personal tools
- Open-source contributions where authorship and responsibility are clearly traceable
- Company projects where I proposed, implemented, and documented changes that were later adopted
