연결 표는 아무도 못 읽는다
공개와 시크릿을 잇는 표는 anon·authenticated 권한에서 전부 회수했고 실시간 구독 목록에서도 뺐습니다. 연결을 읽을 수 있는 것은 서버 함수뿐입니다.
urdoing 은 공개 프로필과 시크릿 아이덴티티를 한 계정에 함께 둔 소셜 서비스입니다. 공개 쪽에서는 친구와 캠퍼스 커뮤니티를 잇고, 시크릿 쪽에서는 이름 없이 글을 쓰고 대화합니다. 둘이 같은 사람이라는 연결은 서버만 압니다. 피드·커뮤니티·믹서 방·메시지·통화·신고와 차단까지, 웹과 iOS·Android 앱이 하나의 Supabase 백엔드를 함께 씁니다.
처음 이름은 wyd 였습니다. 컨셉 사이트에서 말로 정리한 두 신분 구조를, 여기서는 데이터베이스 권한과 서버 함수로 강제합니다. 웹은 운영 중이고, 앱은 아직 스토어에 올리지 않았습니다.




사용자가 만드는 계정은 하나뿐입니다. 두 번째 신분은 서버가 만들고, 둘의 연결도 서버가 보관합니다.
로그인 화면은 한국어·English·中文·Français·Español 다섯 언어로 열립니다. 이 계정이 이름과 학교, 팔로워를 가진 공개 신분입니다. 사용자가 비밀번호를 기억해야 하는 계정은 이것 하나입니다.
전환을 누르면 incognito-session 함수가 공개 세션을 확인하고, 연결된 시크릿 계정이 없으면 무작위 이름과 비밀번호로 새로 만듭니다. 세션도 서버가 발급하므로 사용자는 두 번째 비밀번호를 볼 일이 없습니다.
공개 계정과 시크릿 계정을 잇는 private_identity_links 는 브라우저와 앱이 쓰는 모든 권한에서 회수했고, 실시간 채널에서도 뺐습니다. 시크릿 신분은 검색과 팔로우 추천에도 나오지 않습니다.



웹과 iOS·Android 앱은 같은 Supabase 스키마와 같은 권한 규칙을 씁니다. 규칙이 데이터베이스에 있으니 한 번 쓰면 양쪽에 걸립니다.
커뮤니티 지도대학·회사·동아리·소모임을 한 지도에 찍었습니다. 대학 캠퍼스는 교육부 공개 좌표이고, 나머지 점은 예시라고 화면에 적어 둡니다.
웹 피드왼쪽에 홈·탐색·커뮤니티·믹서·노트·질문, 오른쪽에 지금 이슈와 추천. 왼쪽 아래 ‘아이덴티티 전환’ 한 줄로 신분을 바꿉니다.
계정 삭제앱 설정에서, 로그인할 수 없으면 이 양식으로 요청합니다. 30일 복구 기간이 지나면 계정과 관련 데이터를 지우거나 비식별화합니다.
커뮤니티 가이드라인공개·시크릿 신분을 함께 쓰는 서비스의 규칙입니다. 다른 사람에게 시크릿 신분을 밝히라고 강요하는 것도 금지 항목에 들어 있습니다.
권한 규칙은 클라이언트가 아니라 데이터베이스에 있고, 올리기 전에는 release:check 한 줄이 열아홉 단계를 돕니다.
공개와 시크릿을 잇는 표는 anon·authenticated 권한에서 전부 회수했고 실시간 구독 목록에서도 뺐습니다. 연결을 읽을 수 있는 것은 서버 함수뿐입니다.
공개 계정을 차단한 뒤 익명 글마다 권한 함수를 불러 보면 누가 누구인지 드러나는 틈이 있었습니다. 이런 ‘신분 오라클’을 마이그레이션으로 하나씩 닫았습니다.
한 신분을 차단하면 같은 사람의 다른 신분과도 상호작용이 막힙니다. 두 신분을 한 사람으로 묶는 판정은 클라이언트가 부를 수 없는 함수 안에서만 합니다.
WebRTC 의 TURN 자격 증명을 앱 번들에 넣지 않습니다. 요청할 때마다 서버 함수가 1시간짜리로 발급합니다.
계정 삭제는 버튼 하나가 아니라 수명주기입니다. 복구할 수 있는 상태로 30일을 두고, 예약된 purge 작업이 마무리합니다.
release:check 가 비밀키 검사, 보안 불변식, 의존성 감사, 다섯 언어 번역 검사, 웹·모바일 타입체크와 테스트, 프로덕션 빌드를 차례로 돕니다.
실명 피드에서는 다듬어지지 않은 말의 값을 영구적인 프로필이 치릅니다. 그래서 사람들은 꾸미거나 입을 닫습니다. 익명 앱은 그 값을 없애면서 책임도 함께 없애고, 그래서 오래가지 못합니다. urdoing 은 두 방식을 한 사람 안에 두고, 둘이 서로 새지 않게 하는 쪽을 과제로 잡았습니다.
아무도 기억하지 않습니다. 시크릿 신분은 서버 함수가 무작위 사용자 이름과 비밀번호로 만들고, 공개 세션이 확인될 때마다 서버가 로그인 링크를 만들어 세션을 넘겨줍니다. 사용자에게는 잃어버릴 두 번째 아이디가 없습니다.
텅 빈 전국 피드는 아무도 머물게 하지 못합니다. 그래서 학교 이메일 인증(SSO 와 일회용 코드)으로 캠퍼스 커뮤니티를 먼저 엽니다. 대가도 있습니다. 한 학교 게시판에서는 익명 집합이 앱 전체에서 한 캠퍼스로 줄어, 전체 규모에서는 괜찮던 틈이 문제가 됩니다. 그 틈을 막는 마이그레이션을 캠퍼스를 열기 전에 따로 썼습니다.
사람이 적은 초기에는 피드가 비어 보입니다. 그래서 관심사와 말투를 정해 둔 AI 큐레이터 계정이 뉴스와 생각을 올리고 댓글을 답니다. 대신 숨기지 않습니다. 프로필에 is_ai 값이 있고, 화면에는 이름 옆에 AI 표시가 붙으며, 추천 목록은 사람과 AI 를 따로 셉니다.
규칙을 클라이언트가 아니라 데이터베이스에 둡니다. 행 수준 보안과 security definer 함수가 누가 무엇을 읽고 쓸지 정하니, 웹과 앱은 같은 규칙을 따를 수밖에 없습니다. 문구도 한 곳에서 나옵니다. 공용 번역 표를 웹과 모바일이 함께 읽고, 번역 검사 세 가지가 릴리스 검사에 들어 있습니다.
웹은 urdoing.com 에서 운영 중입니다. iOS·Android 앱은 Expo 로 만들었고, 저장소에 스토어 제출 점검표가 있지만 아직 스토어에는 없습니다. 위 숫자는 커밋되지 않은 작업까지 포함해 2026년 9월 25일 저장소에서 센 값입니다.