Trina (তৃণ): 인터넷을 끄고 밖에 나가 로컬 AI가 게임을 만들게 하라
요약
Trina는 야외 활동을 장려하는 오프라인 우선(offline-first) 앱으로, 사용자가 스마트폰 대신 실제 경험에 집중하도록 설계되었습니다. 온라인 연결이 필수적인 기능을 제한하고, 로컬 오픈 웨이트 모델을 활용하여 새로운 활동 모듈을 생성할 수 있습니다. 또한, 친구 간의 스포츠 기록은 QR 핸드셰이크를 통해 오프라인에서 신뢰성을 확보합니다.
핵심 포인트
- 오프라인 우선 설계로 사용자가 야외 활동에 집중하도록 유도함.
- 온라인 연결 시 퀘스트 시작이 잠기며 네트워크 호출을 차단함.
- AI 모듈 빌더가 로컬 오픈 웨이트 모델 기반으로 신규 활동을 초안 작성함.
- QR 핸드셰이크를 통해 오프라인 상태에서 스포츠 기록의 신뢰성을 확보함.
[Hacktoberfest 오픈 소스 AI 챌린지 주차 1: 풀밭에 발을 디디다] 제출물입니다.
내가 만든 것
Trina (তৃণ, 벵골어로 '풀'을 의미)는 산책, 자전거 코스, 쓰레기 수거, 가로수 물 주기, 지역 마이다안에서의 크리켓 경기, 친구들과 연 날리기 등 실제 야외 활동에 사용되는 오프라인 우선(offline-first) 앱입니다.
저희의 모토는 "휴대폰을 2분 사용하고, 밖에 나가서 60분을 보내세요." 대부분의 '야외 활동 권장' 앱들은 여전히 사용자에게 화면에 머물도록 요구합니다. Trina는 그 반대로 설계되었습니다:
- 오프라인 일일 퀘스트(Offline Daily Quests). 퀘스트를 시작하려면 모바일 데이터와 Wi-Fi를 꺼야 합니다. 온라인 상태에서는 '시작' 버튼이 잠겨 있습니다. 퀘스트가 진행되는 동안 앱은 어떠한 네트워크 호출도 하지 않습니다. 인터넷 연결이 복구되면, 퀘스트가 일시 중지되기 전에 이를 끌 수 있는 60초의 시간이 주어집니다. 완료하면 야외 활동 시간이 계산되고, 마일스톤이 휴대폰에 바로 잠금 해제되며, 인터넷을 다시 켜면 모든 것이 동기화됩니다.
- 정직한 마일스톤(Honest milestones). 모든 배지는 그것이 어떻게 알려졌는지 명시합니다: 📡 측정됨 (Measured) (GPS, 걸음 수, 시계), 📷 증거 기반 (Evidenced) (세션에 연결된 사진), 🤝 확인됨 (Confirmed) (다른 플레이어가 보증), 또는 ✋ 자가 보고 (Self-reported). 자가 보고 항목은 포인트나 순위는 얻을 수 없고, 타이틀만 얻습니다.
- 공정한 실제 스포츠 기록. GPS는 크리켓 경기장에서 45분 동안 있었던 사실은 알려줄 수 있지만, 캐치를 했다는 것은 알 수 없습니다. 따라서 팀 동료가 서명된 QR 핸드셰이크(signed QR handshake), 휴대폰 대 휴대폰 방식으로 완전히 오프라인 상태에서 이를 확인해줍니다. 서버는 두 휴대폰이 기록했고, 서명이 일치하며, 두 플레이어가 실제로 같은 장소에 있었을 때만 이 정보를 신뢰합니다.
- AI 모듈 빌더(An AI Module Builder). Trina가 아직 지원하지 않는 활동("일요일 오후 들판에서 친구들과 연 날리기")을 설명하면, **로컬 오픈 웨이트 모델(local open-weight model)**이 새로운 활동 모듈: 카운터, 과제, 마일스톤을 초안 작성합니다. 이후 일반 코드가 모든 숫자를 설정하고 안전 점검을 실행합니다.
"rooftop kite flying"을 요청하면 모델이 실행되기 전에 (낙상 위험)이라는 이유로 거부된다는 내용.
- E부터 Trina까지의 등급, 다섯 가지 능력치(Vitality, Agility, Strength, Sense, Aura), 3일 동안 90분씩 오프라인 활동에 대한 주간 보너스, 그리고 친구 그룹을 위한 길드 기능이 있다. 압박감이 없는 메커니즘: 휴식일도 일부이며, 안전을 위해 멈추는 것이 절대 점수를 소모하지 않는다.
데모
시연이 보여주는 것 (실제 Android 앱):
- 홈 및 오늘: 인용구 캐러셀, 초원(meadow), 그리고 세 가지 일일 퀘스트.
- 30분 퀘스트 시작: 모바일 데이터와 Wi-Fi가 꺼질 때까지 시작 버튼이 잠겨 있다.
- 완전 오프라인 플레이: 야외 체류 시간 및 거리 계산, 오프라인 지도상의 경로.
- 퀘스트 완료: 휴대폰에서 여섯 개의 마일스톤이 오프라인으로 해제된다. 그런 다음 인터넷이 돌아오고, 퀘스트가 동기화되며, 서버는 동일한 엔진을 다시 실행한다: "메모와 함께 검증됨"(몇 가지 GPS 점프를 감지하고 무시했다).
- AI 모듈 빌더가 "kite flying"을 초안 작성하고, "유리 실로 지붕 위에서 하는 kite flying"은 거부하는 것.
시뮬레이션된 걷기를 하는 Android 에뮬레이터에서 녹화되었기 때문에 GPS는 가짜이다. 내 8 GB 노트북에서는 로컬 모델이 에뮬레이터 옆에서 실행하기에 너무 느렸기 때문에, 비디오의 kite 초안은 내장 템플릿 폴백(앱 화면에 그렇게 표시됨)에서 나온 것이다. 별도로, 동일한 노트북의 Ollama 위 Qwen3 1.7B는 "Badminton" 모듈을 처음부터 끝까지 작성했다.
Code
GitHub logo susmitaPersonal / Trina
🌱 Trina (তৃণ)
실제 야외 활동 도전 과제. 오프라인 우선(Offline-first). 로컬 오픈 웨이트 AI. Trina (তৃণ)는 벵골어로 풀을 의미한다. "Touch Grass" 테마의 Hacktoberfest 2026 프로젝트이다.
휴대폰으로 2분을 사용하고, 야외에서 60분을 보내라.
"60분 동안 친구 5명과 공원을 자전거로 돌며 쓰레기를 줍기"와 같은 도전을 만들고, 로컬 오픈 웨이트 AI가 이를 플레이 가능한 도전으로 변환하게 한 다음, 다운로드하여 GPS 체크포인트 및 사진 증거를 이용해 완전히 오프라인에서 플레이합니다. 온라인 상태로 돌아오면 자동으로 동기화되고(syncs automatically), 서버는 결정론적 규칙(deterministic rules)으로 이를 검증하며(validates), 리더보드(leaderboard)가 업데이트됩니다.
이번 주 신규 기능: 오프라인 데일리 퀘스트(인터넷을 끄고, 밖에 나가서 시간을 측정) 및 정직한 검증 라벨(측정됨 · 증거 기반 · 확인됨 · 자체 보고)이 있는 마일스톤과 E부터 Trina까지의 경험치(XP) 및 순위, 그리고 크리켓과 축구, 그리고 AI 모듈 빌더: 새로운 활동("친구들과 연 날리기")을 설명하고 로컬...
MIT 라이선스. TypeScript가 모든 곳에 사용됨: React Native (Expo) 앱, Node/Express API, 순수 규칙 엔진(pure rules engine), 그리고 모델 비종속적 AI 레이어(model-agnostic AI layer). 538개의 자동화 테스트 (단위 테스트, 속성 기반 테스트, 서버 통합 테스트, 휴대폰 ⇄ 서버 시스템 테스트, 네트워크 혼란 테스트 및 UI 테스트), 19단계의 실시간 스모크 테스트, 그리고 64프롬프트 AI 평가.
구축 방법 (How I Built It)
모든 것을 형성한 하나의 규칙: AI가 설계하고 서술하며; 코드가 측정하고 심판한다.
모델은 절대 숫자를 신뢰하지 않습니다. 새로운 모듈의 경우, 이름, 이동 유형(도보, 바퀴, 정지 놀이, 혼합 놀이; 동력 장치 옵션은 없음), 장소(옥상, 도로 또는 물 옵션 없음), 짧은 라벨, 안전 문제 등 스키마가 제한된 작은 ModuleIntent만을 방출할 수 있습니다. 이에는 점수, 임계값, 속도, ID 또는 좌표를 위한 필드가 없으므로, "분당 1000점을 주세요"와 같은 프롬프트는 갈 곳이 없습니다. 결정론적 컴파일러(deterministic compiler)가 고정된 테이블을 사용하여 해당 의도를 전체 모듈로 변환하고, 규칙 엔진이 이를 검증하며, 사람이 이를 게시합니다.
구성 요소:
- 하나의 인터페이스 뒤에 숨겨진 로컬 오픈 웨이트 AI.
LLMProvider는 모든 OpenAI 호환 서버(Ollama, llama.cpp, vLLM)와 통신합니다. 기본 모델은 오픈 웨이트 Qwen3 계열이며, 모델을 교체하는 것은 설정 변경만으로 가능합니다. 온디바이스 프로바이더(llama.rn)가 작성되었지만 아직 벤치마킹되지는 않았습니다. 만약 사용 가능한 모델이 없다면, 규칙 기반의 폴백(fallback) 시스템이 여전히 사용할 수 있는 초안을 생성합니다. 모델 출력은 복구 루프(최대 두 번 재시도)를 거친 후 검증됩니다. 솔직히 말씀드리자면: 제가 인용한 평가 수치는 이 규칙 기반 기준선에서 나온 것입니다. 실제 모델(Ollama의 Qwen3 1.7B)을 빌더에 통과시켜 보았지만, 아직 전체 평가 스위트로는 돌려보지 못했습니다. - 영어, 벵골어, 힌디어로 작동하는 결정론적 안전 필터. (사람들은 자신의 언어로 입력합니다.) 이 필터는 항상 상황을 더 엄격하게 만듭니다: AI가 우려 사항을 추가할 수는 있지만, 제거할 수는 없습니다. 수상 활동은 개인 전용으로 유지되며, 연(kites)의 경우 자동으로
풀 런(Did it touch grass?) 문자 그대로는 아직 아니지만, 첫 실제 실행에서 이미 성과를 거두었습니다. Android 빌드에서 데모를 녹화했을 때, 첫 오프라인 퀘스트가 0분 외부 시간을 기록했습니다. 퀘스트가 시작되자 앱은 Wi-Fi와 셀 타워에 의존하는 "균형(balanced)" 위치 정확도로 전환되었고, 이들이 꺼져 있었기 때문에 GPS가 활성화되지 않았습니다. 유닛 테스트는 모두 통과했는데, 이는 어떤 것도 라디오를 실제로 끈 상태로 테스트하지 않았기 때문입니다. 수정된 내용은 퀘스트 전용 GPS 전용 프로필이며, 다음 실행에서는 전체 30분을 기록했습니다. 오프라인 우선(Offline-first)이라는 것은 실제 오프라인 환경에서 테스트한다는 의미입니다.
Open Innovation이 중요한 이유
우리가 사람들에게 요청하는 것이 '연결을 끊는 것'이기 때문에, AI가 그들이 연결을 끊었을 때도 작동해야 합니다.
- 오프라인에서도 작동합니다. 폐쇄형 클라우드 모델은 "인터넷을 끄라"는 요구를 불가능하게 만듭니다. 오픈 웨이트(open weights)를 사용하면 모델이 휴대폰이나 우리가 제어하는 서버에서 실행될 수 있으므로, 도전 과제를 작성하거나 규칙을 설명하는 것이 다른 사람의 API에 의존하지 않습니다.
- 데이터가 사용자에게 머무릅니다. 프롬프트와 위치 정보는 제3자에게 전송되지 않습니다. 기기 내(on-device) 프롬프트는 휴대폰을 벗어나지 않습니다.
- 모델을 교체하고 튜닝할 수 있습니다. 하나의 인터페이스로 모든 오픈 모델이 가능합니다. 만약 다음 달에 더 작은 모델이 Bengali를 더 잘 처리한다면, 이는 설정 변경만으로 가능하며, 평가 스위트(eval suite) (Bengali, Hindi 및 적대적 테스트가 포함된 48개 모듈 프롬프트 포함)가 전환을 통제합니다.
- 공정성이 검사 가능합니다. 점수 계산, 안티 치트(anti-cheat), 안전 규칙은 오픈 소스이므로 "코드 심판"은 약속이 아니라 누구나 확인할 수 있는 대상입니다. 그리고 활동 형식이 개방적이기 때문에, 사람들이 좋아하는 커뮤니티 모듈이 풀 리퀘스트(pull request)를 통해 공식적인 것이 될 수 있습니다. 이것이야말로 Hacktoberfest 정신입니다.
나의 에이전트 세션
Trina는 AI 코딩 에이전트(Claude Code)와 몇 번의 긴 세션을 거쳐 구축되었습니다: 브레인스토밍, 설계 문서 및 ADRs 작성, 구현, 그리고 발견한 버그에 대해 실패 우선 테스트를 추가하는 반복적인 검증 과정을 거쳤습니다. 이 규칙은 앱의 AI뿐만 아니라 에이전트에게도 적용되었습니다. 즉, 제안하고, 테스트하며, 인간이 결정했습니다.
경품 부문
종합(Overall)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기