우리 AI 저널링 앱에서 가장 중요한 기능은 AI가 입을 다무는 기능입니다. 30일 중 7일차. 🌿

발행: (2026년 4월 25일 PM 03:56 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

Day 7 of building Evengood – a 60‑second end‑of‑day reflection app – in public on the Build with MeDo hackathon.

오늘 나는 가장 자랑스러운 기능을 배포했습니다: AI가 필요할 때 조용히 침묵하는.

조용 모드

내가 사용해 본 모든 AI 저널링 앱은 무거운 기록을 밝은 “성장 마인드셋” 카드로 바꾸는데, 이는 감각이 둔한 느낌이다. Quiet Mode는 사용자가 슬픔, 위기, 상실, 혹은 극심한 압박을 공유할 때 이를 감지하고 아무것도 하지 않는다 – LLM 호출도, 토큰 사용도, 강제적인 긍정도 없다.

작동 원리

  • 순수 함수(detector)가 반성 텍스트를 디바이스를 떠나기 전에 로컬에서 실행됩니다.
  • 텍스트에 네 가지 카테고리 중 하나(슬픔, 위기, 이별/상실, 혹은 극심한 압박)의 신호가 포함되어 있으면 앱은:
    1. Gemini 재구성 API 호출을 건너뜁니다.
    2. 텍스트‑음성 변환 호출을 건너뜁니다.
    3. 부드러운 확인 카드를 표시합니다:

어떤 날은 재구성이 필요하지 않아요.
오늘 밤은 자신에게 부드럽게 대하세요. 이 기록은 그대로 저장됩니다, 손대지 않은 채로.

  • 항목은 isQuiet: true와 함께 저장됩니다; 원본 텍스트는 그대로 보존되며, 재구성된 내용은 저장되지 않습니다.

  • 주간 패턴 감지(또한 Gemini 호출)에서는 조용한 항목을 코퍼스에서 제외하여, 패턴이 비극이 아닌 리듬을 반영하도록 합니다.

  • 연속 일수는 여전히 계산됩니다 – 조용한 날도 당신이 나타난 날로 간주됩니다.

  • 자해 신호가 감지될 경우에만, 카드 아래에 한 줄의 차분한 문구가 표시됩니다:

    If you need to talk to someone right now: text or call 988 (US) or befrienders.org (global).

    → 지금 누군가와 이야기하고 싶다면: 문자나 전화 988(미국) 또는 befrienders.org(전 세계)로 연락하세요.

  • 배너도, 온보딩도, 분석 이벤트도 없습니다 – 이 기능은 필요할 때까지 보이지 않으며, 작동하는 1 %의 시간에 가능한 최소한의 동작만 수행합니다.

데모

Type: "my dad died last week"
Hit share

앱은 더 크게 울리는 것이 아니라 조용해집니다. 그 15초짜리 상호작용이 전체 피치입니다.

구현

감지기 (src/lib/quietMode.ts)

export function detectQuietMode(text: string): { quiet: boolean; signal?: string } {
  if (!text) return { quiet: false };
  const lower = text.toLowerCase();
  for (const signal of QUIET_SIGNALS) {
    const re = new RegExp(`\\b${signal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\$&')}\\b`, 'i');
    if (re.test(lower)) return { quiet: true, signal };
  }
  return { quiet: false };
}
  • LLM 없이, 외부 호출 없음.
  • 직접 선별한 시그널 목록에 대해 단어 경계 정규식 사용.
  • 마이크로초 단위로 실행되며 비용이 없고, 매치된 시그널을 로컬에만 보관.

제출 핸들러 (App.tsx)

const { quiet, signal } = detectQuietMode(reflectionText);
if (quiet && quietModeEnabled) {
  saveQuietEntry({ text: reflectionText, signal, date: today });
  showQuietAcknowledgment(signal);
  return; // no Gemini call
}

// otherwise: normal reframe flow
const reframe = await callGemini(reflectionText);

패턴 감지 필터 (Supabase 엣지 함수)

const entries = allEntries.filter(e => !e.isQuiet);

전체적으로, 이 기능은 약 80 줄의 코드와 반나절 작업으로 구현됩니다.

제품 개요 (Day 7)

  • 60‑second voice or text reflection (whisper for transcription) → 60초 음성 또는 텍스트 반성 (전사용 whisper)
  • Calm AI reframe via Gemini (when not in Quiet Mode) → Calm AI가 Gemini을 통해 재구성 (Quiet Mode가 아닐 때)
  • Weekly pattern detection – your last 7 reflections become one sentence → 주간 패턴 감지 – 최근 7개의 반성이 하나의 문장으로 합쳐짐
  • “Moment of the Week” – an auto‑pulled keepsake from the week → “주간 순간” – 주에서 자동으로 추출된 기념품
  • Save‑as‑image keepsake (lavender → peach card) → 이미지 저장 기념품 (라벤더 → 피치 카드)
  • Streak counter, history view, ambient sound (rain / piano / silence) → 연속 기록 카운터, 기록 보기, 주변 소리 (비 / 피아노 / 무음)
  • Email opt‑in for the Sunday pattern → 일요일 패턴을 위한 이메일 수신 동의
  • Quiet Mode (today’s ship) → Quiet Mode (오늘 출시)

No account, no password. Nothing about you leaves the device except an anonymous device_id and, if you opt‑in, your email for the Sunday note. → 계정이나 비밀번호가 필요 없습니다. 장치를 떠나는 개인 정보는 익명 device_id와, 수신 동의 시 일요일 노트를 위한 이메일뿐입니다.

Live demo: built entirely on @MeDo with Supabase + Gemini. → 라이브 데모: @MeDo와 Supabase + Gemini만으로 완전히 구축되었습니다.

요약

AI 제품을 만든다면, 차년도 차별화는 어떤 모델을 감쌌는가가 아니라, 모델이 해를 끼칠 위험이 있을 때 모델을 호출하지 않을 판단력을 갖는 것이 될 것입니다.

More tomorrow.

— Day 7 / 30 🌿

#BuildInPublic #BuildWithMeDo

0 조회
Back to Blog

관련 글

더 보기 »

내가 마침내 봇에게 '지루한' 일을 맡긴 방법

Google Cloud NEXT ’26에 대한 나의 견해: 우리 모두를 위한 “Agentic” 시대 NEXT ’26에 참석한 모든 사람들은 “Agents”에 대해 이야기하고 있습니다. 이것이 공상과학 용어처럼 들린다면, …