권한은 데이터베이스에서
대화 참여자 표에 행 수준 보안을 걸었다가, 정책이 자기 자신을 다시 부르는 재귀에 빠졌습니다. security definer 함수로 멤버십을 따로 확인하게 바꿔 풀었습니다.
SeanTeam 은 캘린더와 시간 거래, 시세, 채팅을 한 계정에 묶은 Next.js 웹 앱입니다. 캘린더는 연·월·주·일 네 가지로 보고, 남는 시간은 시간당·30분·고정 가격을 정해 매물로 올립니다. 시세 탭 아홉 개에는 TradingView 위젯을 붙였고, 채팅은 Supabase 실시간 채널 위에서 돌며 AI 어시스턴트가 같은 대화 목록 안에 있습니다.
스키마 SQL 20개 가운데 5개가 채팅 권한과 속도를 고친 파일입니다. 어디서 막혔는지가 파일 이름에 그대로 남아 있습니다. 생산성 점수와 시간 지갑은 아직 자리만 있습니다.



세 화면이 같은 계정과 같은 Supabase 데이터를 봅니다. 아래는 로그인하지 않은 게스트로 연 실제 화면입니다.
시간대에 맞춰 인사를 바꾸고, 오늘 일정 수와 다음 일정, 최근에 만든 일정 세 개를 calendar_events 에서 읽습니다. 생산성 점수와 시간 지갑은 아직 자리만 있고 값은 비어 있습니다.
주와 일 보기에는 지금 시각에 빨간 선이 지나갑니다. 일정은 행 수준 보안으로 본인 것만 읽고 쓸 수 있습니다.
분야와 가격을 정해 시간을 올리고, 가격 단위는 시간당·30분·고정 가운데 고릅니다. 사는 쪽이 확인하면 매물 상태가 sold 로 바뀝니다. 결제는 아직 붙어 있지 않습니다.



시세는 직접 계산하지 않고 탭마다 TradingView 위젯을 붙였습니다. 직접 만든 것은 탭 구성과 종목 검색, 그리고 뉴스와 공시를 모으는 API 입니다.
누가 무엇을 읽을지는 데이터베이스가 정하고, 바깥 서비스는 API 라우트 다섯 개가 감쌉니다.
대화 참여자 표에 행 수준 보안을 걸었다가, 정책이 자기 자신을 다시 부르는 재귀에 빠졌습니다. security definer 함수로 멤버십을 따로 확인하게 바꿔 풀었습니다.
대화 목록은 localStorage 캐시로 바로 띄우고, AI 대화는 다른 대화를 불러오는 동안 먼저 엽니다. 기다리는 동안에는 뼈대 화면을 둡니다.
따로 있던 AI 페이지를 없애고 채팅의 한 대화로 넣었습니다. 기본 모델은 gpt-4o-mini, 답은 사용자가 쓴 언어로 합니다. 같은 IP 에서 분당 60회를 넘으면 잠시 멈춥니다.
API 라우트가 21곳의 RSS 피드 42개를 동시에 읽고, 3초 안에 오지 않는 피드는 버립니다. 최신 50건을 5분 동안 캐시합니다.
생산성 앱은 대개 시간이 어디로 갔는지만 셉니다. 여기서는 남는 시간에 가격과 상대방을 붙여 보는 쪽을 택했습니다. 분야는 개발·디자인·마케팅·컨설팅·언어로 나누고, 가격은 시간당·30분·고정 가운데 고릅니다. 아직 결제는 없고, 사겠다고 확인하면 매물이 sold 로 바뀌는 데까지입니다.
일어난 일과 계획한 일이 한 곳에 있어야 나중에 붙일 점수도, 내놓을 시간도 믿을 수 있기 때문입니다. 대시보드의 오늘 일정과 다음 일정, 최근 활동은 전부 calendar_events 한 표에서 읽습니다.
채팅을 맞게 만드는 것은 어렵지 않습니다. 데이터베이스가 누가 어떤 대화를 읽을 수 있는지 강제하는 상태에서 맞게 만드는 것이 어렵습니다. 실시간 켜기, 정책 재귀 고치기, 목록 쿼리 줄이기가 각각 별도 SQL 파일로 남아 있습니다.
시간 관리 코치 역할을 맡긴 OpenAI 대화입니다. 일정 분석과 활동 추천, 시간을 돈으로 환산해 보는 관점을 기본으로 두고, 사용자가 쓴 언어로 답합니다. 앞선 대화를 함께 보내 문맥을 이어 갑니다.
캘린더 일정, 시간 매물, 채팅과 AI 대화, 블로그 글쓰기는 Supabase 와 API 에 실제로 연결돼 있습니다. 생산성 점수와 시간 지갑, 접속 중인 트레이더 수는 화면에 자리만 있고 값이 고정돼 있습니다. 유명인 거래는 표본 두 줄이고, 뉴스 탭은 API 가 기사를 돌려주는데도 화면이 다른 형식을 기다려 비어 보입니다. 폰 폭에서는 시간 거래와 시세 화면이 가로로 넘칩니다.