이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass 제출물입니다.
저는 항상 장소의 보이지 않는 레이어에 매료되어 왔습니다. 매일 건물을 지나가지만, 그곳에 누가 살았는지, 그 거리에 무슨 일이 있었는지, 혹은 그 기념물이 왜 존재하는지 궁금해한 적이 없습니다. 사진을 찍으면, 이 모든 맥락은 눈에 보이지 않은 채로 남아 있습니다.
Frames of Truth는 이를 해결하려는 저의 시도입니다.
이 앱은 사진을 찍고, EXIF 메타데이터에서 GPS 좌표를 읽어온 다음, 오픈 소스 AI 모델을 사용하여 사진이 촬영된 장소의 이야기를 들려줍니다. 사진 속 내용에 대한 이야기가 아니라, _사진을 찍었을 때 당신이 어디에 서 있었는지_에 대한 이야기입니다.
제가 구축한 것
모든 스마트폰 사진에는 숨겨진 메타데이터가 담겨 있습니다: 언제 촬영되었는지, 어떤 장치로 촬영되었는지, 그리고 — 지리 위치 정보(geolocation)가 활성화되었다면 — 어디에서 촬영되었는지 말입니다. 마지막 정보 조각이 바로 GPS 좌표입니다. 이것은 카메라가 무엇을 향하고 있었는지를 반드시 의미하는 것이 아니라, _카메라가 어디에 있었는지_를 알려줍니다.
이 구분이 중요합니다. 만약 당신이 멀리 있는 언덕을 향해 휴대폰을 겨누고 뒷마당에서 촬영한다면, GPS는 당신의 뒷마당 위치를 알려줍니다. 사진은 언덕의 위치가 아니라 당신의 시점을 담고 있습니다.
대부분의 앱들은 이 점을 무시합니다. 그들은 일반적인 주소로 사진에 지리 태그(geotag)를 달고 넘어갑니다. Frames of Truth는 그렇지 않습니다. 이것은 GPS 좌표를 조사(investigation)의 시작점으로 간주합니다.
사진을 로드할 때 발생하는 과정은 다음과 같습니다:
- 앱이 EXIF 메타데이터에서 GPS 좌표를 읽습니다.
- 해당 위치를 역지오코딩(reverse-geocodes)합니다 (Photon, Nominatim).
- 주변의 관심 지점(points of interest)을 찾습니다 (Geoapify, Overpass).
- Wikipedia와 Wikidata로부터 역사적 맥락을 가져옵니다.
- 사진을 비전 모델에 보내 내용을 설명하게 합니다.
- LLM이 세 부분으로 이야기를 작성합니다: 위치(Location), 이미지(Image), 호기심(Curiosity)
더 많은 정보를 원한다면, 여섯 개의 섹션으로 구성된 더 깊이 있는 **탐사 보고서(investigative report)**를 생성하는 두 번째 버튼이 있습니다: 위치(Location), 주변 환경(Surroundings), 위키피디아 및 위키데이터(Wikipedia & Wikidata), 최근 뉴스(GDELT를 통한 제공), 사진 메타데이터(Photo metadata), 그리고 탐사 가설(Investigative hypothesis).
사용자 인터페이스는 7개 언어(이탈리아어, 영어, 프랑스어, 독일어, 스페인어, 포르투갈어, 네덜란드어)를 지원합니다.
누가 사용하기 좋은가?
매일 지나치지만 그 뒤에 무엇이 있는지 궁금해하는 사람이 있다면 누구나. 열 개의 탭을 열지 않고도 배경 정보를 얻고 싶은 여행자에게. 밖에 나가서 탐험하고 싶고, 자신의 동네를 탐험할 이유를 만들고 싶은 사람들에게 적합합니다.
어떻게 사용자를 화면에서 벗어나게 하는가?
이 앱은 '둠스크롤링(doomscrolling)'의 반대입니다. 이 앱을 사용하려면 반드시 밖에 나가야 합니다. 어딘가를 걸어 이동하고, 카메라를 무언가에 비추고, 실제 장소의 사진과 함께 돌아와야 합니다. 화면 보는 시간은 경험 중 가장 짧은 부분일 뿐이며, 중요한 것은 그 '장소' 자체입니다.
데모
APK 다운로드: GitHub에서 최신 릴리스 확인
어떤 안드로이드 기기(7.0 이상)에서도 설치할 수 있습니다. 첫 실행 시, ⚙️ 메뉴를 열고 사용자의 API 키(Groq, Geoapify — 둘 다 무료 티어 제공)를 입력해야 합니다.
스크린샷
Deep investigation
.txt 가져오기 기능이 있는 API 키 설정 모달
API keys modal
코드
전체 소스 코드는 MIT 라이선스 하에 GitHub에서 이용 가능합니다:
리포지토리: github.com/vincenzodesanctis/frames-of-truth
기술 스택 (Tech Stack)
| 레이어 | 기술 |
|---|
| 모바일 | Android (Kotlin)에 Python 통합을 위한 Chaquopy 사용 |
| ... | |
HEIC 지원: 최신 Android 및 iPhone은 사진을 기본적으로 .heic 파일로 저장합니다. Python의 PIL 라이브러리는 HEIC를 네이티브하게 읽지 못합니다. 제가 구현한 해결책은 다음과 같습니다: Kotlin 측에서 HEIC 파일을 감지하고 (매직 바이트 ftyp 읽기), 변환하기 전에 EXIF 메타데이터를 추출한 다음, 비전 모델을 위해 이미지를 JPEG로 변환하는 것입니다. 이렇게 하면 파일 형식이 바뀌더라도 GPS 좌표를 보존할 수 있습니다.
Android 10 이상에서의 GPS 마스킹(redaction): Android 10부터 OS는 콘텐츠 URI를 통해 읽은 모든 파일의 EXIF GPS 데이터를 마스킹합니다 — 앱이 ACCESS_MEDIA_LOCATION 권한을 요청하지 않는 한입니다. 이 권한 없이는 모든 사진에 lat: null로 표시됩니다. 이 권한을 사용하면 좌표가 온전하게 전달됩니다. 이것 하나를 파악하는 데 며칠이 걸렸고, URI에 MediaStore.setRequireOriginal()을 사용하는 것이 필요했습니다.
사용자 설정 가능한 API 키: 제가 직접 코딩한 키(hardcoding) 대신, 사용자 스스로 키를 입력하거나 .txt 파일에서 가져올 수 있는 모달 창이 포함된 인앱 설정 메뉴를 구축했습니다. 이 키들은 SharedPreferences에 저장되며 JavaScript Interface 브릿지를 통해 Python 레이어로 전달됩니다. 이 키들은 기기를 벗어나지 않습니다.
📴 연결성에 대한 참고 사항
해당 과제는
이 앱을 이런 방식으로 만든 이유는 오픈 웨이트 모델들이 빠르게 발전하고 있기 때문입니다. 오늘날에는 클라우드 GPU가 필요하지만, 내일은 여러분의 휴대폰에서 구동될 것입니다. Frames of Truth는 어느 세상에도 대비되어 있습니다.
오픈 혁신(Open Innovation)이 중요한 이유?
이 앱을 오픈 웨이트 모델로 구축한 것은 단순히 비용 절감 결정이 아니었습니다. 이는 제가 소프트웨어에 대해 생각하는 방식을 변화시켰습니다.
오픈 혁신이 가능하게 만든 것들
-
벤더 종속성 해소(No vendor lock-in). 만약 Groq가 내일 가격을 변경하거나 무료 티어를 중단하더라도, 저는 OpenRouter나 Together AI 또는 자체 호스팅 모델로 전환할 수 있습니다. 앱 코드는 변하지 않습니다. 단지 API 호출 하나만 바뀝니다.
-
이식성(Portability). AI 파이프라인이 제공업체에 구애받지 않기 때문에, 이 앱은 궁극적으로 휴대폰 자체에서 작은 로컬 모델을 실행할 수 있습니다. 폐쇄형 API는 이것을 불가능하게 만듭니다. GPT-4를 휴대폰에서 돌릴 수는 없지만, Llama 3.2나 Gemma 2는 돌릴 수 있습니다.
-
투명성(Transparency). 누구나 파이프라인 전체를 읽을 수 있습니다. 어떤 모델이 사진을 처리하는지, 어떤 프롬프트가 전송되는지, 응답이 어떻게 구조화되는지를 정확히 볼 수 있습니다. 블랙박스가 없습니다.
-
커뮤니티 주도 개선(Community-driven improvement). 전체 프로젝트는 오픈 데이터와 오픈 인프라에 의존합니다. 지리 코딩을 위한 OpenStreetMap, 맥락 정보를 위한 Wikipedia 및 Wikidata, 뉴스 데이터를 위한 GDELT가 그것입니다. 이 모든 것은 전 세계 자원봉사자 커뮤니티에 의해 유지됩니다.
-
인디 개발자를 위한 비용 통제(Cost control for indie developers). 1인 개발자는 취미 프로젝트에서 폐쇄형 API의 토큰당 요금을 감당할 수 없습니다. Groq와 OpenRouter의 무료 티어는 이러한 종류의 실험을 가능하게 만듭니다.
폐쇄형 API가 허용하지 않았을 것들
만약 제가 이 앱을 폐쇄형 비전 API로 구축했다면, 다음 사항들에 갇히게 되었을 것입니다:
- 그들의 가격 책정 방식(예고 없이 변경됨)
- 그들의 속도 제한(가장 최악의 순간에 자주 작동 중단)
- 그들의 서비스 약관(특정 사용 사례를 금지하는 경우가 많음)
- 그들의 모델 선택(원할 때마다 폐기할 수 있음)
오픈 웨이트 모델을 통해, 저는 통제권을 유지합니다. 이것이 바로 오픈 혁신의 핵심입니다.
나의 에이전트 세션
저는 이 프로젝트에 DevRelay를 사용하지 않았기 때문에 임베드할 에이전트 세션이 없습니다. 전체 프로젝트는 실제 Android 기기에서 각 레이어를 테스트하고 Logcat을 통해 디버깅하며 수동으로 반복 구축했습니다.
제가 배운 것
이 앱을 만들면서 오픈소스 AI가 단순히 폐쇄형 모델에 대한 비용 절감 대안이 아니라는 것을 배웠습니다. 그것은 소프트웨어를 구축하는 완전히 다른 방식입니다.
모델을 직접 보고, 제공업체를 교체하며, 파이프라인 전체를 끝에서부터 읽어볼 수 있을 때, 저는 제품의 통제권을 실제로 가지고 있다고 느낍니다. 어느 날 갑자기 제가 의존하는 서비스가 약관을 변경하거나, 10배 더 비싸게 청구되거나, 무료 등급을 중단하게 되는 상황에 처하지 않습니다.
이런 인디 프로젝트에게는 그런 종류의 통제력이 전부입니다.
마지막 생각
'Frames of Truth'를 만드는 가장 좋은 부분은 밖에 나가서 테스트해보고 싶게 만들었다는 것입니다. 사진을 찍을 때마다, 저는 이미 알고 있다고 생각했던 장소에 대해 새로운 것을 배웠습니다.
이것이 바로 'Touch Grass(자연과 접촉하다)'가 의미해야 할 바입니다: 기술을 포기하는 것이 아니라, 그것을 사용하여 세상과 다시 연결되는 것입니다. 제대로 구현된 오픈소스 AI는 벽이 아니라 다리입니다.
앱을 사용해 보시고, 이 앱의 시선으로 여러분 동네가 어떻게 보이는지 알려주세요. 🌍
Hacktoberfest Open-Source AI Challenge 2026을 위해 ❤️로 제작되었습니다.