← 목록
기타 2026-07-19 5KB 읽기 5분

에스텔 QI PWA(홈 화면 추가) 구현

개요

estel.crowny.org(모바일 전용 사용, 삼선 드로어까지 완료)에 PWA manifest·아이콘·메타태그를 추가해 폰 홈 화면에 추가 시 네이티브 앱처럼 실행되게 했다.

무엇을 했는지

  1. 아이콘 4종 생성 (/Users/ef/crowny-estel/아이콘/): 헤드리스 크롬(격리된 CDP 인스턴스, 포트 9346, 작업 후 종료)으로 셸 로고 그라디언트(#4F55A7→#1E2150, 글리프 ✦ #E8C55C)를 렌더.
- estel-192.png(192×192, radius 22%), estel-512.png(512×512, radius 22%), estel-maskable-512.png(512×512, 풀블리드, 글리프 34%→여백 33‰ 확보 ≥ 요구 20%), estel-180.png(180×180, apple-touch-icon, 풀블리드) - 전부 sips로 정사각 실측 확인, 육안 확인(클리핑 없음) - 크기표/안전영역 산술은 순수 로직이라 /Users/ef/crowny-estel/아이콘/아이콘생성.한선 동반 작성 + 자체시험(4/4 PASS, maskable 안전영역 검증 PASS) - 래스터화 자체는 icon_render.js(헤드리스 크롬 CDP, 한선씨 VM에 캔버스/그라디언트 렌더 기능 없어 부득이)

  1. manifest.json (/Users/ef/crowny-estel/manifest.json): name "에스텔 QI", short_name "에스텔", start_url "/", display standalone, orientation portrait, background/theme #0F1130, lang ko, icons 4종(any/maskable 구분).
  1. 앱.html head에 추가(기존 모바일 CSS·드로어·모듈 파일은 무수정): manifest link, apple-touch-icon, theme-color, apple-mobile-web-app-capable/status-bar-style/title 메타.
  1. 서버.한선 라우트 추가:
- GET /manifest.jsonapplication/manifest+json - GET /아이콘/<파일>.pngimage/png, 화이트리스트(estel-192/512/maskable-512/180.png만 허용, _모듈ID추출 패턴 준용) - 정적서빙은 기존 _파일서빙이 이미 파일소켓전송(opcode 856, C레벨 fread→write)으로 바이너리를 직접 스트림하고 있어 별도 바이너리 경로를 새로 만들 필요가 없었다(존재확인용 읽기()는 폐기값이라 UTF-8 오염과 무관 — FREADALL이 len 명시 fread+str_new(buf,len)라 null바이트 안전, utf8_charcount도 바이트>0이면 항상 count≥1이라 존재판정 정확함을 소스 추적으로 확인).

검증 수치

  • 컴파일: hanseonc_high 0 에러/경고, CROWNY_STRICT=1도 0 경고. 21,329 큐브.
  • RPN 동기화: tools/clike_to_rpn.한선(clike_to_rpn.py는 폐기, 한선씨 이관본 사용)로 재생성, 서버.rpn.한선 1573줄(기존 1506줄 + 아이콘/매니페스트 라우트분), rpn숙련.sh 검사 컴파일 PASS(기존 파일과 동일 수준의 기존 lint 휴리스틱 경고 잔존, 신규 카테고리 없음).
  • LaunchAgent 재기동(launchctl kickstart -k) 후 /health 200 확인, 새 toau(21329 큐브) 로드 확인.
  • md5 바이트 일치: 4개 아이콘 전부 orig==get MATCH (로컬 :9617).
  • 공개 경로: https://estel.crowny.org/manifest.json 200, https://estel.crowny.org/아이콘/estel-192.png 200.
  • 회귀 없음: /, /셸.js, /모듈/qi.js, /api/quantum/run(POST) 전부 기존과 동일 200.
  • 경로조작 차단: --path-as-is/아이콘/../서버.한선 전송 시 400(화이트리스트 거부) 확인. 정규화 안 된 미허용 파일명도 400.
  • 설치가능성(헤드리스 CDP, https://estel.crowny.org/ 실로드): manifest link·apple-touch-icon·theme-color·capable·title 메타 전부 존재, manifest fetch 200+JSON 파싱 OK, icons 4종 전부 fetch 200. (실제 브라우저 설치 프롬프트는 헤드리스에서 미발생 — 요소·응답 수준까지만 검증)

관련 파일

  • /Users/ef/crowny-estel/manifest.json (신규)
  • /Users/ef/crowny-estel/아이콘/estel-192.png, estel-512.png, estel-maskable-512.png, estel-180.png (신규)
  • /Users/ef/crowny-estel/아이콘/아이콘생성.한선 (신규, 한선씨 동반 로직+자체시험)
  • /Users/ef/crowny-estel/앱.html (head 메타/링크만 추가)
  • /Users/ef/crowny-estel/서버.한선 / 서버.toau / 서버.rpn.한선(+.bak-pwa전 백업) — 라우트 추가
  • 생성 스크립트(참조용, 재실행 불필요): /private/tmp/.../scratchpad/icon_render.js, pwa_check.js

잔여 이슈

  • 서비스워커(sw.js)는 생략했다 — 지시에서 "여유되면" 선택 항목으로 명시됐고, 핵심 요구(홈 화면 추가·설치가능성)는 manifest+아이콘만으로 충족되어 범위를 좁혔다. 오프라인 캐시가 필요해지면 별도 작업으로.
  • 실제 iOS/Android 기기의 "홈 화면에 추가" 프롬프트/아이콘 표시는 미실기기 검증(헤드리스 환경 한계) — 다음 실기기 접속 시 육안 확인 권장.