인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
나는 15살이고 Telegram Stars 결제로 할 일 앱을 만들었어요 — 18살이 되기 전에 돈을 벌기 위한 유일한 법적 방법이었어요
Doday · 2026-05-25 · via DEV Community

안녕하세요 dev.to,

이것은 이상한 이야기이고 나는 이를 공유하고 싶었습니다. 계속 따라오세요, 결제 처리 부분은 정말 웃긴 일입니다.

나는 15살이며 러시아에 살고 있으며, 지난 세 주간의 치열한 혼자 코딩 동안에 Doday를 만들었습니다. — 웹 앱, Telegram 미니 앱, 그리고 Telegram 봇으로 실행되는 할 일 앱으로, 모든 것이 하나의 백엔드를 공유합니다. 기본적으로 Todoist 대안으로, Pomodoro 기능, 카ンバ닝 보드, 학교 포털 동기화(러시아 학생용 — 이것이 진짜 장벽입니다), 그리고 팀 협업 기능이 내장되어 있습니다.

이곳에서 시도해보세요: getdoday.ru · 코드: github.com/SwairIt/doday · 봇:Telegram의 DodayTaskBot

돈을 벌이는 부분에 대해 이야기하고 싶어요. 다른 미성년자들이 제품을 판매하려고 할 때 유용할 수 있을 거라 생각해서요.

문제

나는 5월 2일부터 Doday를 만들어왔어요. 유료 플랜을 추가하고 싶을 때까지 앱에는 이미 작은 그룹의 사용자가 있었어요 (주로 친구들과 내 학교 사람들 그리고 몇몇 우연한 사람들). 나는BETA_FREE_FOR_ALL=true 환경 플래그로, 모두가 무료로 Pro 기능을 사용할 수 있게 되었습니다. 이는 출시 기간 동안 지속 가능했지만, 실제로 사람들이 이 서비스를 지불할 것인지 확인하고 싶었습니다.

계획은 간단했습니다: 러시아 결제 처리기(Russian payment processor)를 등록하면 (YooKassa, 이전에는 Yandex Kassa였으며 - 거의 지역의 Stripe와 같은 것), 그들의 체크아웃을 구현하고 끝났습니다.

"자영업자"로 등록되어 있어(самозанятый — 14세부터 부모의 동의와 함께 러시아에서 제공되는 세금 제도), 세금 식별자와 실제 은행 계좌가 있어. 이것이 충분하다고 생각했어.

두 날 안에 세 번 거절당함

YooKassa — 정부 ID를 통해 로그인(Госуслуги, 우리의 e-gov / 정부 서비스 단일 로그인과 동일). 즉각적인 거절:"Госуслуги에 자녀 계정이 있는 사용자는 로그인할 수 없습니다." 제 Госуслуги 계정은 완전히 검증되었습니다 — 세금을 이 계정으로 내고, 성인이 하는 모든 일을 합니다. 하지만 YooKassa는 출생일을 확인하고 만 18세 미만이면 주장할 수 없습니다. 엄격한 장벽입니다.

알겠습니다, 수동 입력. 저는 설명서 양식을 엽니다 — 그들은 스캔된 컬러 여권 업로드를 원합니다. 그들의 OCR은 출생일을 읽고 거부합니다. 전략적으로 흐릿하게 만든 날짜로 시도해 보았지만 — 한 시간 후에 "신분 확인이 불가능합니다"라고 나왔습니다. 같은 문제입니다.

네, T-Bank 인수 (다른 주요 러시아 프로세서). 가입 흐름이 "개인 사업자 또는 LLC로 등록되어야 합니다"에 도달합니다. 자영업자는 허용되지만 18세부터만 가능합니다. IP로 등록하려면 18세가 되어야 합니다 (16세는 법정 대리인의 동의와 공증서가 필요하지만, 은행은 이를 획득하기 위해 받지 않습니다).

네, 부모님 이름으로 등록합니다 이제 돈이 법적으로 그들에게 속해 있습니다. 고객과의 분쟁이 있으면 부모님이 그것을 논쟁해야 합니다. 세무서는 소득이 그들 것이라고 생각합니다. 만약 그들이 내일 참여하고 싶지 않다고 결정하면, 저는 어제 밤에 전체 지급 인프라를 잃게 됩니다. 그런 일은 없을 거예요.

네, 18세까지 기다려요_. 그것은 세 년 더입니다. 어떤 재정적 검증 없이 제품에 더 많은 시간을 투자할 수 없습니다.

진정으로 수익화를 포기하려고 했습니다. 그런데 Telegram Stars가 있다는 것을 기억했습니다.

Telegram Stars (XTR)

만약 모르면 — Telegram은 자체 앱 통화인 Stars (통화 코드)를 가지고 있습니다.XTR를 그들의 봇 API에 포함). 사용자들은 Telegram 클라이언트(Apple/Google 앱 내 구매)를 통해 이들을 구매합니다. 봇은 Stars를 통해 결제를 받을 수 있습니다(createInvoiceLink). 개발자들은 Stars 가치의 약 70%를 수익으로 받으며, TON 암호화폐를 통해 인출하거나 Fragment를 통해 인출할 수 있습니다.

주요 사항: BotFather (Telegram의 봇 관리 봇)은 13세부터 사용할 수 있습니다. 문서가 없습니다. 세금 식별자가 없습니다. 은행도 없습니다. 계약은 Telegram과 맺고 은행과는 아닙니다.

내가 15살 때, 이것이 유일하게 합법적인 결제 경로입니다.

나는 그것을 썼습니다.

나가 만든 것 (기술적)

  • 스키마 이전 (alembic 0039): users.pro_until (시간戳), star_payments 테이블에UNIQUE(telegram_payment_charge_id) idempotency를 위한
  • 제품 카탈로그 (app/billing/products.py) — 가격의 단일 진실 출처입니다. Pro 1개월 = 250⭐, Pro 12개월 = 2500⭐, Pro 생애 동안 = 12500⭐. 이 파일을 편집하면 됩니다.
  • HMAC 서명된 인보이스 페이로드v1:{product}:{user_id_hex}:{nonce}:{sig} 이 없으면 누구나 인보이스 URL을 가로채고 결제 전에 제품 코드를 "pro_forever"로 바꿀 수 있습니다. 이것이 있으면 서명이 깨지고 Bot API가 거부합니다. 페이로드 ≤80 바이트 (Telegram의 한계는 128입니다).
  • Idempotent 결제 애플리케이션 — Telegram은 실패 시 webhook을 재시도합니다. 저는 star_paymentsUNIQUE를 charge_id와 함께 삽입하고, 두 번째 삽입은 예외를 일으킵니다.IntegrityError → 기존 행을 잡고 반환합니다. 이중 청구는 결코 없습니다.
  • effective_tier()pro_until을 인정합니다 — 만료된 pro_until를 가진 유료 사용자는 자동으로 무료로 전환되며 cron 작업은 없습니다. 모든 요청마다 지연 평가를 수행합니다. 평생 구매는 pro_until를 2099년으로 설정하여 경계값으로 사용합니다.
  • 갱신은 기존 것을 확장합니다pro_until — Pro를 10일 남은 상태에서 1개월 구매해도 30일로 초기화되지 않습니다. current_pro_until + 30 days로 연장됩니다. (Todoist은 이 부분을 잘못 처리합니다, 참고로.)
  • 환불 흐름 — 관리자 엔드포인트는 refundStarPayment 봇 API를 호출하고 pro_until을 롤백합니다. Telegram은 21일 이내에 환불을 허용합니다.
  • 봇 핸들러PreCheckoutQueryHandler (10초 안에 답변해야 함, 서명 검증 + 금액 확인), MessageHandler(filters.SUCCESSFUL_PAYMENT) (성공적인 결제를 호출).

테스트: 서명, 위변조 거부, 금액 불일치, 단일 실행 가능성, 갱신 계산, 수명 경계값, 만료→무료 대체 테스트 24개 단위 테스트.

미니 앱 UI는 Telegram.WebApp.openInvoice(url, callback)를 앱 내 결제에 사용. 웹 UI는 데스크톱 대체로 새 탭에서 청구 URL을 엽니다.

나도 보안 허점을 닫았어 — POST /api/billing/change-tier는 인증된 사용자가 {"tier": "pro"}를 POST하여 무료로 Pro로 업그레이드할 수 있게 하기도 했었어. 같은 날에 닫았어. Stars를 출시한 당일에. 업그레이드는 이제 402 Payment Required가 필요하고, 무료로 다운그레이드만 자동 서비스가 가능해.

현재 수익화에 대한 중요한 주의사항

나는 Stars를 출시했지만현재 서비스는 베타 테스트 중이며, 프로 기능은 모두에게 무료입니다 아직 누구도 비용을 지불하고 있지 않으며, 저는 강요하지 않습니다. 베타 테스트를 종료하면 유료 모드로 전환하며, 기존 사용자(그 전환 이전에 등록된 모든 사용자)는 이미 만든 모든 것과 함께 무료로 남게 됩니다. 미니 앱에는 창립자 스타일의 "프로 영원히" 제안이 있으며, 12500 ⭐입니다. — Pro를 유료 모드가 복귀하기 전에 잠그고 싶은 사람들을 위해. 필수는 아님. 구매하지 않으면 Free로 전환될 거야.

그래서 수익화는 설계상 선택 사항으로 연결되어 있어. 제품이 안정화되고 성장하기 시작하면 정식으로 출시될 거야.

스택 (관심 있으면)

  • FastAPI 0.115 + async SQLAlchemy 2.0 + Pydantic v2
  • PostgreSQL 16 (asyncpg)
  • Jinja2 + HTMX + Alpine.js + Tailwind via CDN — no React, no build step
  • 봇 워커용 python-telegram-bot v21
  • mypy --strict각 커밋마다 pre-commit을 통해 강제 적용
  • ~20k 줄의 Python, 850+ pytest 테스트, 39 Alembic 마이그레이션
  • 한 줄 배포: git push → 생산용 VPS에서 cron-poll이 매 분마다 실행되어 마이그레이션을 적용하고 uvicorn을 재시작. 약 60초 안에 라이브.

Claude Code를 사용하는 것에 대해

나는 Claude Code (Anthropic의 AI 코드 보조 도구)와 함께 Doday를 작성했습니다. 숨기지 않아요 — 아키텍처 결정은 내가 했지만, Claude는 빠른 타이핑을 하고 코드베이스를 잘 기억하는 사람이었어요. 각 커밋은 푸시 전에 검토되었어요. 내가 이해하지 못하는 줄들은 내가 대담하게 설명할 수 있을 때까지 다시 작성되었어요.

코드베이스가 AI의 덜미를 풍기지 않는 이유는 rails 때문이에요mypy --strict는 타입 오류로 빌드에 실패합니다. 모든 행동 변경에는 테스트가 포함되어 있으며, Jinja 리팩터는 Claude가 생성하는 나쁜 Alpine 패턴을 포착합니다. 그러한 보호대로, AI 보조는 단순히 빠른 파트너 프로그래머일 뿐입니다.

"진짜" 코딩으로 여기는지는 당신의 정의에 따라 달라집니다. 저는 그렇게 생각합니다. 단독으로 이렇게 많은 것을 출시하지 않았을 것입니다. 하지만 아키텍처와 리뷰에 대한 취향 없이는 잘 출시하지 않았을 것입니다.

성실한 통계

  • 최초 커밋: 2026년 5월 2일
  • 총 커밋: 511
  • 테스트: 850
  • ~20,000 줄의 파이썬 코드
  • 활성 사용자: 적은 수, 주로 내 학교 + 친구의 친구들. 아직 마케팅을 정말 시도하지 않았다 — 이 레딧 게시물은 첫 번째 시도 중 하나다.
  • 유료 사용자: 0 — 베타 모드, Pro는 모두에게 무료, 평생 제안은 선택 사항
  • 지금까지의 수익: $0
  • 로드맵: Family 티어용 부모 대시보드, 공개 API 토큰, Capacitor를 통해 마이니 앱을 래핑한 네이티브 iOS

요청하는 내용

만약 궁금해졌다면, 라이브 데모는 tại getdoday.ru — UI는 러시아어지만 영어 독자들은 브라우저 번역으로 이용할 수 있습니다. 모든 부분이 어떻게 맞는지 보고 싶다면 github.com/SwairIt/doday의 코드베이스가 더 흥미롭습니다 (미니 앱 인증, 스타즈 결제 흐름, 팀 공유, 옵트인 기능 플래그).

아키텍처에 대한 피드백이 있거나, 결제 흐름에 대한 의견이 있거나, "미성년자로서 SaaS를 배송하려고 했다"는 문제를 해결해 본 경험이 있다면 — 제게 들려줄 수 있을 것 같아요.

자신만의 Stars 통합을 배포해 본 분들에게는 한 부분에 대해 확신이 없어요: 현재 provider_payment_charge_id를 null 가능성으로 두고 있어요. 텔레그램이 실제로 이를 채우는 시점이 불확실하기 때문이에요. 아는 분이 있을까요?

그리고 리포지토리를 스타하면 — 진정으로 도움이 됩니다. 이걸 재미로 하고 있지 않아요, 결국 이걸 통해 생계를 유지하고 싶어요.

러시아에 사는 15살의 저로부터 안녕하세요.


수정: 러시아 소년이 레딧에 게시하는 이유를 궁금해하시나요 — Doday는 오픈 소스 MIT이며, 러시아 사용자를 넘어 성장하고 싶습니다. 코드베이스는 영어입니다 (docstrings, 변수 이름, 커밋 메시지 제외 — 그것들은 러시아 과거형). 따라서 기여가 환영합니다. 특히 Telegram Stars 통합은 일반적입니다 — 텔레그램을 가진 누구나가 무엇을 판매하는 누구에게나 작동합니다.