๋ํ๋ฏผ์ ๋ฌด์์ ๋ง์ง ๋ง์ธ์. ๊ฐ์น ์๋ ๋ง์ดํฌ๋ก ํ๋์ผ๋ก ์ค์ํ์ธ์. ๋ก์ปฌ ์ฐ์ ์๋๋ก์ด๋ ์คํฌ๋ฆฐํ์ ์ฑ โ ์ค๊ณ์(PRD/SDD), ๋ธ๋ผ์ฐ์ ํฐ ์๋ฎฌ๋ ์ดํฐ, ๊ทธ๋ฆฌ๊ณ ์ค์ ์๋๋ก์ด๋ ์ฑ(v1.0.0) ์ด ํ ์ ์ฅ์์ ์์ต๋๋ค.
ใOpalใ, ใOne Secใ, ใScreenZenใ ๊ฐ์ ๋์งํธ ๋ํก์ค ์ฑ์ด ์ ํผ์ง๊ณ ์ 2์ฃผ ์์ ์ง์์ง๋์ง๋ฅผ ๋ถ์ํ๊ณ , ๊ทธ ๊ฒฐํจ์ ๋๋ ์ ํ์ ์ค๊ณยท๊ตฌํํ ํ๋ก์ ํธ์ ๋๋ค.
| +ฮฑ | ํ ์ค |
|---|---|
| ์ฐจ๋จ โ ์ค์ | ์ธ์คํยท์ ํ๋ธยทํฑํก์ ์ผ๋ ์๊ฐ 3~5์ด ๋ฉ์ถค. ๊ทธ ํ๋ฉด์์ 1๋ถ ์์ธ ๋ฆฌ์ ยท ๋จ์ด 1๊ฐ ยท ์๊ฐ ํต ๋ฉ๋ชจ ยท ๊ฐ์ ์ฒดํฌ์ธ ์ค ํ๋๋ฅผ 1ํญ์ผ๋ก ์คํํ๊ณ ํ์ผ๋ก |
| ์ํฉ ์ธ์งํ ์ค๋งํธ ์ด๋ | ์ทจ์นจยทํ์ ์ค์ ์ฐํ ๋ถ๊ฐ, ์ ๋ฌด ์๊ฐ์ 5์ด, ์ผ์์ 3์ด. ์ฐํํ๋ฉด 10๋ถ์ ์กฐ์ฉํ, ํ ์๊ฐ์ 6๋ฒ ๋๊ฒ ์ด๋ฆฌ๋ฉด ์คํ๋ ค ์ํ(๋ง์ฐฐ ํผ๋ก ๋ฐฉ์ง) |
| 100% ๋ก์ปฌ ยท ์๋ฒ ์์ | INTERNET ๊ถํ ์์ฒด๊ฐ ์์. Room DB์๋ง ์ ์ฅ, ๋ฉ๋ชจ๋ Documents/HabitBridge/*.md๋ก ๋ด๋ณด๋ด๊ธฐ |
| 1ํ ๊ฒฐ์ ยท ์คํ์ฝ์ด | ๊ตฌ๋ ยท๊ด๊ณ ยท๋ฐ์ดํฐ ํ๋งค ์์. ์ ์ฑ ์์ง๊ณผ ์ฑ์ MIT ๊ณต๊ฐ ์์ค |
์ธ ์ฐ์ถ๋ฌผ์ ๊ฐ์ ๊ท์น์ ๊ณต์ ํฉ๋๋ค. ์ ์ฑ
์์ง์ ์น(src/engine.js)๊ณผ ์๋๋ก์ด๋(android/core/policy)์ ํจ์ ๋จ์๋ก 1:1 ํฌํ
๋์ด ์๊ณ , ๊ฐ์ 12๊ฐ ํ
์คํธ ๋ฒกํฐ๋ฅผ ํต๊ณผํฉ๋๋ค.
์ค์น: Releases์์ habitbridge-1.0.0.apk๋ฅผ ๋ฐ์ ์ค์นํฉ๋๋ค(Android 8.0+, minSdk 26). Play ์คํ ์ด ๋ฑ๋ก ์ ๋จ๊ณ๋ผ ์ฌ์ด๋๋ก๋์
๋๋ค.
๊ตฌํ๋ ๊ฒ
- ๊ฐ์ง:
UsageStatsManager1์ด ํด๋ง ํฌ๊ทธ๋ผ์ด๋ ์๋น์ค(ํ๋ฉด ์ผ์ง ์๋ง,specialUse) + ์ ํ์ ์ ๊ทผ์ฑ ์๋น์ค(๋ ๋น ๋ฅธ ๊ฐ์ง, ํ ๋ณต๊ท) - ๊ฐ์
:
TYPE_APPLICATION_OVERLAY์ธํฐ์ ํฐ โ 3/5์ด HOLD ์งํ ๋ฐ, ์ค์ 4์ข , ์ฐํ ๋ฒํผ(HARDCORE์์๋ ์ ๊น), ์ฐํ ํ 10๋ถ ์ฟจ๋ค์ด, ์๊ฐ๋น 6ํ ์ด๊ณผ ์ ์ํ, ์ผ์ผ ํ ๋น ์์ง ์ ์ฐํ ๋ถ๊ฐ - ์ค์ 4์ข : 1๋ถ ์์ธ ๋ฆฌ์ (6๋จ๊ณ ํ์ด๋จธ), ๋จ์ด ์นด๋(12๊ฐ ์๋ ๋ฑ, ํ์ ), ํต ๋ฉ๋ชจ(280์), ๊ฐ์ ์ฒดํฌ์ธ(5์ข )
- ๋ฐ์ดํฐ: Room 7ํ ์ด๋ธ(๋์ยทํ์ฉ ๋ชฉ๋กยท๊ฐ์ ๋ก๊ทธยท๋ฉ๋ชจยท์ผ์ผ ์ฌ์ฉ๋ยท์ค์ ยท๋จ์ด), ์คํค๋ง ๋ด๋ณด๋ด๊ธฐ, ์๋ ๋ฐฑ์ ํฌํจ
- ์ฑ UI: ์จ๋ณด๋ฉ(๊ถํ 6๋จ๊ณ, ๊ฑฐ๋ถ ์ ์ด์ ์ค๋ช ), ๋์๋ณด๋(Focus Score ๋งยท์ค๋/7์ผยท์ต๊ทผ ๊ธฐ๋ก), ๋์ ์ฑ ๊ด๋ฆฌ(์ค์น ์ฑ ๊ฒ์ยท์ด๋ยทํ ๋นยทํ์ฉ ๋ชฉ๋ก), ๋ฉ๋ชจ(.md ๋ด๋ณด๋ด๊ธฐ), ์ค์ (์ทจ์นจยท์ ๋ฌด ์๊ฐยท์์ผยท์ฟจ๋ค์ดยท์บ๋ฆฐ๋)
- ๊ณต์ ์นด๋ 1080ร1920(๊ฐ์ธ์ ๋ณด ์์) โ ๊ณต์ ์ํธ, ๋ถํ /์ ๋ฐ์ดํธ ํ ์๋น์ค ์ฌ์์, ํ๊ตญ์ด/์์ด
- ์๋ ๊ฒ(์๋์ ):
INTERNET๊ถํ, ๋ถ์ SDK, ํฌ๋์ ๋ฆฌํฌํฐ, ์ฑ ์ญ์ ๋ฐฉ์ด
๊ฒ์ฆ(์๋ฎฌ๋ ์ดํฐ Pixel 7 ยท API 36): ์จ๋ณด๋ฉ โ ๋์ ์ถ๊ฐ โ ๊ฐ์
โ ์ค์ โ ํ ๋ณต๊ท โ ๋์๋ณด๋ ๋ฐ์, NORMAL 5์ด ํ ์ฐํ โ ์ฟจ๋ค์ด ํต๊ณผ, ํต ๋ฉ๋ชจ โ Notes_YYYYMMDD.md ์์ฑ๊น์ง ํ์ธํ์ต๋๋ค. ์ ์ฐจ๋ RELEASE.md ยง3 ์ฒดํฌ๋ฆฌ์คํธ์ ์์ต๋๋ค. ์์คํ
์ค์ ์ฑ์ฒ๋ผ ์ค๋ฒ๋ ์ด๋ฅผ ์จ๊ธฐ๋ ์ฑ(HIDE_OVERLAY_WINDOWS)์ OS ์ ์ฝ์ผ๋ก ๊ฐ์
ํ ์ ์์ต๋๋ค.
๋น๋
cd android
./gradlew :core:policy:test # ์ ์ฑ
์์ง ํ
์คํธ 12๊ฑด
./gradlew :app:assembleDebug # app/build/outputs/apk/debug/app-debug.apk๋ฆด๋ฆฌ์ค ์๋ช
ยทํ๊ทธยทActions ํ์ดํ๋ผ์ธ์ RELEASE.md.
https://jeiel85.github.io/habitbridge-android/
- ํฐ์ Instagram ์์ด์ฝ์ ๋๋ฅด๋ฉด ํฐ๋ฏธ๋ํ ์ธํฐ์
ํฐ๊ฐ ๋น๋๋ค. 5์ด ๋๊ธฐ ํ
[>] ์ฑ ๊ณ์ํ๊ธฐ๊ฐ ์ด๋ฆฝ๋๋ค. - ์ค๋ฅธ์ชฝ ์ํฉ ์๋ฎฌ๋ ์ดํฐ์์ ์๊ฐ์ 00:40์ผ๋ก ์ฎ๊ธฐ๊ฑฐ๋ "ํ์ ์ค"์ ์ผ ๋ณด์ธ์. ์ด๋๊ฐ HARDCORE๊ฐ ๋์ด ์ฐํ ๋ฒํผ์ด ์ ๊น๋๋ค.
- ์ค์ 4์ข ์ค ํ๋๋ฅผ ์๋ฃํ๋ฉด ํ์ผ๋ก ๋์๊ฐ๊ณ ๋์๋ณด๋์ Focus Scoreยท์ ์ฝ ์๊ฐ์ด ์ค๋ฆ ๋๋ค.
- ์ฐํํด์ ์ฑ์ ๋ค์ด๊ฐ๋ฉด 10๋ถ ์ฟจ๋ค์ด์ด ๊ฑธ๋ฆฝ๋๋ค.
+10๋ถ์ ๋๋ฅด๋ฉด ๋ค์ ๊ฐ์ ํฉ๋๋ค. - ์ฑ๋ณ ํ ๋น๋์ ๋๊ธฐ๋ฉด ๋ชจ๋๊ฐ "ํ ๋น ์์ง"์ผ๋ก ๋ฐ๋๋ฉฐ ์ฐํ๊ฐ ๋งํ๋๋ค.
- ๊ณต์ ์นด๋ PNG์ Notes_YYYYMMDD.md๋ฅผ ๋ด๋ ค๋ฐ์ ์ ์์ต๋๋ค. ์ด๋๋ก๋ ์ ์ก๋์ง ์์ต๋๋ค.
| ๋ฌธ์ | ๋ด์ฉ |
|---|---|
docs/PRD-SDD.md |
์ค๊ณ์ v1.1 โ ์์ฅ ๋ถ์, ๊ฐ์น ์ ์, ๊ฐ์ ยท์ด๋ยท์ํฉ ๊ท์น, ์ค์ ๋ช ์ธ, Focus Score, ๊ถํ ํ๋ก์ฐ, ์ฃ์ง์ผ์ด์ค, Room ๋ชจ๋ธ, ์๋๋ก์ด๋ ์ํคํ ์ฒ(๊ฐ์ง ๊ฒฝ๋กยท์ค๋ฒ๋ ์ดยทํ ๋ณต๊ทยท๋ฐฐํฐ๋ฆฌยทํ๋ผ์ด๋ฒ์), ์์ต ๋ชจ๋ธยทPlay ์ ์ฑ , ๊ฒ์ฆ ๊ณํ, ๋ฆฌ์คํฌ. v1.1.1์ ๊ตฌํ ์ํ(๐ฑ) ๋ฐ์ |
docs/CHANGELOG.md |
์ค๊ณ์ ์ ์ ๋ชฉ๋ก๊ณผ ์ฑยทํ๋กํ ํ์ ๋ณ๊ฒฝ ์ด๋ ฅ |
docs/DECISIONS.md |
๋๋๋ฆฌ๊ธฐ ์ด๋ ค์ด ๊ฒฐ์ 7๊ฑด |
docs/BACKLOG.md |
๋ฏธ๋ค๋ ๊ฐ์ ์ |
RELEASE.md |
์๋๋ก์ด๋ ๋น๋ยท์๋ช ยท๊ฒ์ฆยท๋ฆด๋ฆฌ์ค ์ ์ฐจ |
docs/archive/ |
2026-09-09 ์๋ณธ ์ค๊ณ์ยทํจํค์ง README (๋ด์ฉ ๋ฌด์์ ๋ณด๊ด) |
index.html, styles.css, src/ ์น ํฐ ์๋ฎฌ๋ ์ดํฐ (GitHub Pages ๋ฃจํธ) ยท tests/ node:test
android/
core/policy/ ์์ Kotlin ์ ์ฑ
์์ง + PolicyTest (์น engine.js์ 1:1)
app/ ์๋๋ก์ด๋ ์ฑ (data / detect / overlay / ui / util)
gradle/libs.versions.toml AGP 9.1 ยท Kotlin 2.2 ยท Compose BOM ยท Room 2.7
docs/ ์ค๊ณ์์ ๋ถ์ ๋ฌธ์
.github/workflows/ web CI ยท Android CI(APK ์ํฐํฉํธ) ยท Release(ํ๊ทธ โ ์๋ช
APK/AAB)
- P0 (์๋ฃ): ์ ์ฑ ์์งยทUX๋ฅผ ๋ธ๋ผ์ฐ์ ์๋ฎฌ๋ ์ดํฐ๋ก ๊ฒ์ฆ, ๋ผ์ด๋ธ ๋ฐ๋ชจ ๊ณต๊ฐ
- ์คํ๋ฆฐํธ 1~4 (์๋ฃ, v1.0.0): ์๋๋ก์ด๋ ์ฑ ๊ตฌํ + ์๋ฎฌ๋ ์ดํฐ ๊ฒ์ฆ + ๋ฆด๋ฆฌ์ค ํ์ดํ๋ผ์ธ
- P1 (๋ค์): ์ค๊ธฐ๊ธฐ 5๋ช 7์ผ โ ๊ฐ์ง ์ง์ฐ, OEM ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ, ๋ฐฐํฐ๋ฆฌ(ํ๋ฃจ โค 1%), ์ ๊ทผ์ฑ ๊ฒฝ๋ก
- P2: ํด๋ก์ฆ๋ ํ ์คํธ 20๋ช 14์ผ โ 2์ฃผ ์ ์ง์จ โฅ 60%, ๊ถํ ์ ์ง โฅ 80%, ์ค์ ๋น์จ โฅ 40%, ๊ฐ๊ฒฉ ์ค๋ฌธ
- P3: Play ์ ์ฑ ์ฒดํฌ๋ฆฌ์คํธยท๊ฒฐ์ โ ํ๋ก๋์ 100๋ช
ใOpalใ, ใOne Secใ, ใScreenZenใ์ ๊ฐ ๊ถ๋ฆฌ์์ ์ ํ์ด๋ฉฐ ์ด ํ๋ก์ ํธ๋ ์ด๋ค๊ณผ ๋ฌด๊ดํ ๋ ๋ฆฝ ๊ธฐํ์ ๋๋ค. ์น ๋ฐ๋ชจ๋ ์ค์ ์ฑ์ ์ฐจ๋จํ์ง ์๊ณ ์ฌ์ฉ ์๊ฐ๋ง ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ๋ผ์ด์ ์ค: MIT
English
A local-first Android screen-time app: the design document (PRD/SDD), a browser phone simulator, and the real Android app (v1.0.0) live in one repository and share one policy engine.
Pitch. Blocking apps fail for two reasons: the void after the block (you drift to another feed) and friction fatigue (a 5-second pause in front of your messenger during a meeting). HabitBridge keeps the pause but fills it with a one-tap micro-swap โ a 1-minute posture reset, one vocabulary card, a one-line inspiration note, or an emotion check-in โ and adapts the shield to context: no bypass during sleep hours or calendar events, 5 s during work hours, a 3 s reminder otherwise. A bypass earns 10 quiet minutes, and more than six intercepts in an hour softens the shield instead of nagging harder. No INTERNET permission, no server, pay once.
Android app (v1.0.0). Download the APK from Releases (Android 8.0+). Foreground detection via a 1 s UsageStatsManager poller (screen on only, specialUse foreground service) plus an optional accessibility service; a TYPE_APPLICATION_OVERLAY interceptor with HOLD bar, four swaps, a bypass button that locks under HARDCORE, 10-minute cool-down after a bypass, friction-fatigue softening and daily quotas; Room (7 tables), onboarding with per-permission explanations, dashboard with an explicit Focus Score, target management, Markdown note export to Documents/HabitBridge, a 1080ร1920 share card, boot restart, KR/EN. Verified on a Pixel 7 API 36 emulator end to end (intercept โ swap โ home โ dashboard, bypass โ cool-down, note โ .md). Build with cd android && ./gradlew :app:assembleDebug; signing and the tag-driven release workflow are in RELEASE.md.
Web demo. https://jeiel85.github.io/habitbridge-android/ โ the same rules in a phone simulator with a context clock.
Docs. docs/PRD-SDD.md (Korean), docs/CHANGELOG.md, docs/DECISIONS.md, docs/BACKLOG.md.
Disclaimer. Opal, One Sec and ScreenZen belong to their respective owners; this is an independent product. MIT licensed.