Sno Station
Sno Station is your agents' workstation: open-source software that turns the AI agents you already run into one squad on your own machine. Two heads are better than one, and they get better with every
Write down thoughts in the side panel as you read. The page title and URL are saved automatically. View your notes on web and app with the same account.
PluginsTypeScript · PLpgSQLGitHub @guesungOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
웹 페이지를 읽으며 간편하게 기록하세요.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
웹 메모 웹 페이지를 읽으며 간편하게 기록하세요 안녕하세요! 웹 메모는 웹페이지를 읽으며 느낀 불편함에서 비롯된 프로젝트에요. 여러분도 비슷한 경험이 있으셨을 거에요. 아티클을 읽다 보면 "이건 기록으로 남겨야겠다"는 생각이 들 때가 있어요. 그럴 때마다 노트를 열고 화면을 반으로 나누어 기록해야 하는 것이 번거로웠죠. 이 경험을 통해 따로 노트 앱을 열지 않고 한 번에 기록할 방법이 필요하다고 느꼈어요. 2. 매번 제목과 URL을 작성해야 하는 번거로움 노트를 열고 나면 이 기록이 어떤 아티클을 읽고 작성한 것인지 남기기 위해 제목과 URL을 직접 기입해야 했어요. 이를 자동으로 해결할 방법은 없을까 고민하게 되었죠. 이런 경험들을 바탕으로 아티클을 읽으며 간편하게 기록할 수 있는 확장 프로그램을 개발하게 되었어요! 웹 메모는 제가 겪었던 불편함을 해소하고, 다른 사람들도 더 쉽게 기록할 수 있도록 돕기 위해 만들어졌답니다. 웹 메모는 여러분의 아티클 읽는 시간을 더 여유롭게 만들어줄 거예요. 웹 메모를 통해 아티클을 읽으며 중요한 정보를 놓치지 않고, 나중에 쉽게 찾아볼 수 있는 체계적인 메모 시스템을 구축할 수 있어요.Read the full README ↗
GitHub Actions 워크플로와, 워크플로가 부르는 스크립트가 있는 폴더입니다. 이 문서는 어느 워크플로가 어느 스크립트를 부르는지를 한곳에 모은 대응표입니다. 워크플로나 스크립트를 추가·이동·삭제하면 이 표도 같은 PR에서 고칩니다.
GitHub Actions는 .github/workflows/ 아래 하위 폴더를 인식하지 않습니다. 그래서 폴더 대신
파일명 앞의 계열 접두사로 묶습니다.
| 접두사 | 계열 |
|---|---|
ci·e2e | PR·push마다 도는 검증 |
cd- | 앱별 빌드·배포 (재사용 워크플로) |
release·versions | 릴리스와 스토어 버전 조회. 웹의 Slack 버튼이 파일명으로 dispatch하므로 이름을 바꾸지 않습니다 |
audit- | 상태를 선언과 대조하는 감사 |
report- | 정기 리포트 |
chore- | 레포 유지보수 자동화 |
| 워크플로 | 트리거 | 실행 주기·시각 | 부르는 스크립트 (.github/scripts/ 기준) |
|---|---|---|---|
ci.yml | push(develop·master), pull_request | 해당 push·PR 이벤트마다 | deploy/resolve-affected-base.sh · deploy/detect-affected-apps.sh · deploy/notify-thread-root.mjs · deploy/notify-thread-reply.mjs · deploy/notify-build-ready.mjs · deploy/notify-staging-deploy.mjs · deploy/comment-pr-extension.mjs · conventions/check-code-conventions.mjs, 그리고 cd-app·cd-extension·cd-web 호출 |
e2e.yml | push(develop·master), pull_request | 해당 push·PR 이벤트마다 | 없음 (Playwright) |
cd-app.yml | workflow_call | 검증된 develop 후보를 큐에서 재판정해 Android APK 빌드·Firebase App Distribution 배포, master·PR은 빌드만, release는 새 빌드·Play 내부 테스트 제출 | deploy/prepareStagingApp.mjs · deploy/appDeploymentState.mjs · deploy/detect-affected-apps.sh (EAS CLI·firebase-tools) |
cd-extension.yml | workflow_call, workflow_dispatch | 다른 워크플로에서 호출하거나 수동 실행할 때마다 | deploy/find-reusable-artifact.sh · deploy/upload-extension-to-store.mjs |
cd-web.yml | workflow_call, workflow_dispatch | 다른 워크플로에서 호출하거나 수동 실행할 때마다 | deploy/find-staged-deployment.mjs · deploy/staged-deployment.mjs · deploy/notify-staging-deploy.mjs |
release.yml | workflow_dispatch | 수동 실행할 때마다 | 없음. cd-app·cd-extension·cd-web·release-notify 호출 |
release-notify.yml | workflow_call | release.yml에서 호출할 때마다 | deploy/notify-release-result.mjs |
release-github.yml | push(tag v*) | v* 태그 push마다 | 없음 |
versions.yml | workflow_dispatch | 수동 실행할 때마다 | deploy/report-store-versions.mjs |
notify-extension-published.yml | schedule, workflow_dispatch | 매시 07·37분 또는 수동 실행마다 | deploy/notify-extension-published.mjs |
audit-env-manifest.yml | pull_request, workflow_dispatch | PR 이벤트 또는 수동 실행마다 | env/check-env-manifest.mjs |
audit-env-registry.yml | pull_request, schedule, workflow_dispatch | 매일 07:30 KST, PR 이벤트 또는 수동 실행마다 | env/audit-env-registry.mjs |
audit-ga-cid-adoption.yml | schedule, workflow_dispatch | 매주 월요일 09:13 KST 또는 수동 실행마다 | 없음 (Playwright, e2e/probes/) |
audit-refactor.yml | schedule, workflow_dispatch | 매주 토요일 10:17 KST 또는 수동 실행마다 | refactor/report-refactor-audit.mjs |
report-ga-daily.yml | schedule, workflow_dispatch | 매일 07:00 KST 또는 수동 실행마다 | ga/report-daily-ga.mjs |
report-ga-weekly.yml | schedule, workflow_dispatch | 매주 월요일 08:00 KST 또는 수동 실행마다 | ga/report-weekly-ga.mjs |
report-seo.yml | schedule, workflow_dispatch | 매일 09:17 KST 또는 수동 실행마다 | pnpm seo:check·seo:gsc·seo:sheets · seo/find-previous-seo-report.mjs · seo/build-seo-ai-context.mjs · seo/send-seo-ai-report.mjs · seo/seo-fix.mjs · seo/notify-seo-slack.mjs |
report-gsc-demand.yml | workflow_dispatch | 수동 실행할 때마다 | pnpm seo:gsc-demand → seo/export-gsc-demand.mjs (조합 페이지 축 판단용 GSC 수요·사이트맵 리포트, 아티팩트만 남김) |
chore-cleanup-unused.yml | schedule, workflow_dispatch | 매주 토요일 10:00 KST 또는 수동 실행마다 | cleanup/cleanup-unused-files.mjs |
chore-e2e-coverage.yml | schedule, workflow_dispatch | 매주 일요일 10:23 KST 또는 수동 실행마다 | e2e-coverage/maintain.mjs |
chore-ga-events.yml | schedule, workflow_dispatch | 매주 수요일 09:41 KST 또는 수동 실행마다 | ga-events/maintain.mjs |
chore-supabase-inventory.yml | schedule, workflow_dispatch | 매일 08:00 KST 또는 수동 실행마다 | supabase/generate-supabase-inventory.mjs · supabase/sync-supabase-inventory-pr.mjs |
chore-sentry-triage.yml | workflow_dispatch | Sentry 웹훅 수신기가 SENTRY_AI_TRIAGE_ENABLED=true일 때 새 이슈·재발마다 디스패치하거나 수동 실행할 때마다 | sentry/triage-inputs.mjs · sentry/triage-guard.mjs · sentry/fetch-sentry-context.mjs · sentry/check-triage-patch.mjs · sentry/build-pr-body.mjs · sentry/report-sentry-triage.mjs |
chore-blog-catalog.yml | schedule, workflow_dispatch | 매일 03:17 KST 토스·당근 전체 재순회, 15분마다 재개 요청 확인, 3시간마다(:37) 긱뉴스 피드 수집 또는 수동 실행(소스 선택·당근 smoke·dry-run)마다 | blog-reading/collect.mjs |
정기 실행 시각은 워크플로의 UTC cron을 한국 시간(KST)으로 환산한 예정 시각입니다. GitHub Actions 사정에 따라 실제 시작은 늦어질 수 있습니다.
chore-cleanup-unused.yml·chore-supabase-inventory.yml·audit-refactor.yml·chore-sentry-triage.yml은 ref: master로 체크아웃합니다. 작업 브랜치에서
dispatch해도 스크립트는 master의 것이 돕니다.
chore-e2e-coverage.yml과 chore-ga-events.yml은 주간 실행에서 master를, 수동 실행에서 선택한 ref를 체크아웃합니다. master 외 ref의 수동 실행은 검증 결과만 남기고 PR을 게시하지 않습니다.
detect-affected-apps.sh는 Turbo 패키지 영향 판정에 더해 CI·앱·릴리스 워크플로와 앱 판정 스크립트 변경을 앱 변경으로 처리합니다. push 실행 전체는 취소하지 않고 develop의 검증·웹·확장 잡만 각각 이전 잡을 취소합니다. 앱의 실제 빌드 잡이 release-app 그룹(cancel-in-progress: false, queue: max)을 단독으로 소유해 운영 요청을 최대 100개까지 대기시킵니다. develop 후보는 실행권을 얻은 뒤 최신 검증 성공 후보와 플랫폼별 마지막 배포 성공 SHA를 확인하고, 오래되었거나 앱 변경이 없는 후보를 EAS 전에 생략합니다. 성공 SHA는 Firebase 배포가 끝난 뒤 staging-app-success-<platform>-<sha>-<run>-<attempt> 아티팩트로 90일간 보관합니다. 기준이 없거나 만료됐으면 전체 앱 빌드하며, 조회 실패는 실패로 처리합니다. Android 운영 릴리스의 master CI 산출물 재사용은 유지합니다.
ci.yml의 notify-staging-app은 deploy/notify-thread-reply.mjs를 REPLY_PHASE=store-submit으로 호출해 develop 앱 App Tester 배포 결과를 머지 스레드에 알립니다. 웹 결과 알림과 독립적으로 실행하며, 앱 댓글에는 배포 버튼 없이 Actions 로그 링크만 붙입니다. 큐에서 생략한 후보는 attempted=false로 결과 댓글을 억제합니다.
릴리스·배포 흐름 전체는 docs/release-flow.md를 봅니다.
.github/scripts/는 도메인 폴더로 나뉩니다. 폴더 안에는 실행 스크립트(위 표에 나오는 파일)와
그 스크립트가 쓰는 모듈, 테스트(*.test.ts)가 함께 있습니다.
| 폴더 | 담당 |
|---|---|
shared/ | 두 도메인 이상이 쓰는 모듈 (run-context·slack-api·slack-blocks·http·jwt·google-auth·repo-versions) |
deploy/ | CI 빌드 판정, Slack 빌드·배포·릴리스 알림, PR 확장 다운로드 댓글, 확장 웹스토어 업로드, 스토어 버전 |
seo/ | SEO 점검·GSC·Sheets 적재·AI 리포트·P0·P1 자동 수정 PR |
ga/ | GA4 일간·주간 리포트, 기능 사용량 측정 |
env/ | 환경 변수 매니페스트 검사와 등록 현황 감사 |
conventions/ | 코드 컨벤션 원장(docs/code-conventions.yaml) 형식 검사 |
supabase/ | 운영 Supabase 인벤토리 문서(docs/supabase-inventory.md) 생성과 갱신 PR |
refactor/ | 주간 리팩토링 점검 |
cleanup/ | 미사용 파일 정리 |
e2e-coverage/ | 핵심 사용자 흐름의 E2E 누락 점검, 새 테스트 검증, 자동 보완 PR 게시 |
blog-reading/ | 블로그 정주행(토스·당근·긱뉴스) 공개 글 카탈로그 수집기. 원본 순회(tossSource·daangnSource), 긱뉴스 Atom 피드 수집(geeknewsSource), 수집 엔드포인트 클라이언트(ingestClient), 실행 진입점(collect) |
ga-events/ | GA 이벤트 누락 점검, 이벤트 추가 패치 검증, 자동 보완 PR 게시 |
shared/ 규칙: 두 도메인 이상이 쓰는 모듈만 shared/에 둡니다. 한 도메인만 쓰면 이름이
범용이어도 그 도메인 폴더에 둡니다(예: seo/google-sheets.mjs). shared/는 다른 도메인 폴더를
import하지 않습니다.
| 진입점 | 경로 | 용도 |
|---|---|---|
pnpm seo:check | seo/check-seo.mjs | SEO 점검 (report-seo.yml도 사용) |
pnpm seo:gsc | seo/check-gsc.mjs | Search Console 색인·성과 조회 |
pnpm seo:gsc-demand | seo/export-gsc-demand.mjs | 도메인 이전일 이후 GSC 수요·사이트맵 상태 리포트 (report-gsc-demand.yml도 사용) |
pnpm seo:sheets | seo/persist-seo-sheets.mjs | SEO 결과를 Google Sheets에 적재 |
| 수동 CLI | ga/measure-feature-usage.mjs | 기간별 기능 사용량 측정 (docs/analytics.md) |
| 수동 CLI | blog-reading/collect.mjs | --dry-run으로 서버 저장 없이 원본 순회만 확인, --smoke로 당근 접근 확인 (종료 코드 3은 원본 사이트의 접근 차단) |
테스트는 pnpm exec vitest run .github/scripts로 돌립니다.