vccs
Vue 3용 차트 컴포넌트 모음, Recharts에서 포팅
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Personal data integration and analytics platform using dlt and dbt against BigQuery, orchestrated with GitHub Actions.
This repository contains a Docker Development Container for VSCode and the infrastructure and workflows for my personal data platform. It leverages Google Cloud Platform services including BigQuery for data warehousing and Secret Manager for secure credential management, with automated orchestration through GitHub Actions.
The following data will be ingested from my personal systems into a BigQuery warehouse for automation and analysis.
1. Notion
2. HubSpot
3. Google HealthREADME 전문 보기 ↗Personal data integration and analytics platform using dlt (ingestion into Databricks Unity Catalog) and dbt (transformations on Databricks), orchestrated with GitHub Actions and managed locally with mise.
This repository contains a Docker Development Container for VSCode and the infrastructure and workflows for my personal data platform. It uses Databricks for raw data ingestion and storage, 1Password Environments for workflow credentials, and mise for repeatable local and CI commands.
The following data will be ingested from my personal systems into a Databricks warehouse (Unity Catalog) for automation and analysis.
The project follows modern data engineering best practices with clear separation of concerns:
├── pipelines/ # dlt data extraction pipelines
│ ├── sources/ # Source factory modules for each pipeline
│ │ ├── hubspot.py
│ │ └── notion.py
│ ├── hubspot.py # Thin orchestration wrappers that delegate to central runner
│ ├── notion.py # Thin orchestration wrappers that delegate to central runner
│ └── common/ # Shared utilities and helpers
├── dbt/ # dbt transformation models
│ ├── models/ # personal dbt models (staging, intermediate, marts)
│ ├── macros/ # custom macros for adapters and mocking
│ ├── tests/ # custom tests when missing from packages
│ └── seeds/ # reference tables and mock sources
└── .github/ # github actions workflows
└── workflows/ # CI/CD and refresh orchestration
{source}__{entity} (e.g., hubspot__contacts,
google_health__steps){layer}_{source}__{entity} (e.g.,
stg_hubspot__contacts, contacts)dim_{entity}_v1 / fct_{entity}_v1 (e.g., dim_habit_v1,
fct_engagement_v1)Create a GCP Project and enable required APIs:
Set up BigQuery:
raw_data)analytics)Configure Secret Manager:
Configure GCP service account key as default application credentials
Store static keys and credentials for each data source in TOML fragments:
[sources.hubspot]
api_key = "your-key"
[sources.notion]
api_key = "your-key"
[sources.google_health]
client_id = "your-id"
client_secret = "your-secret"
After authorising the Google Health OAuth client, store refresh token in dedicated secret
sources-google_health-refresh_tokenCreate Service Account:
Clone and setup:
git clone <repository-url>
cd personal-reporting-pipelines
mise install
mise run setup
Configure credentialed tasks: install the 1Password CLI beta and export
OP_ENVIRONMENT_ID plus OP_SERVICE_ACCOUNT_TOKEN in your shell.
.env.databricks is deprecated and no longer loaded; provide warehouse and
source credentials through the selected 1Password Environment, or use sbx
secrets inside Docker AI Sandbox. Credentialed tasks run inside
op run --environment.
Common tasks:
mise run test # offline unit tests
mise run test-e2e # starts SQL warehouse, then runs cloud tests
mise run pipeline -- notion --full # one dlt source
mise run pipeline-all # all three dlt sources
mise run dbt-build-mock # DuckDB fixture build
mise run dbt-build-dev # starts SQL warehouse, builds Databricks dev
mise run docs # dbt + Sphinx documentation
See docs/source/mise_tasks.md for the full task list and CI behavior.
Set optional local environment variables:
export GCP_PROJECT_ID=your-project-id
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account/key.json
export RAW_SCHEMA_NAME=raw_data
The preferred path for AI coding agents (opencode, claude, codex) is
Docker AI Sandbox (sbx CLI) configured by the repository-root
sbxenv.yaml, with a dedicated GitHub machine user scoped to this repo.
The .devcontainer/agent is the second supported option. Full details:
docs/source/agent_container.md.
That guide also explains how to export OpenCode sessions to Google Cloud Storage
before removing an ephemeral environment and restore them later.
Machine user (one-time): create a dedicated GitHub account, add it as a
collaborator on this repo only (Write, not Admin), and mint a short-lived
fine-grained PAT limited to this repo (Contents: read/write,
Pull requests: read/write, Metadata: read). Never use a personal token.
Install and sign in:
brew trust docker/tap && brew install docker/tap/sbx (or
winget install -h Docker.sbx / sudo apt install docker-sbx), then
sbx login.
Store development credentials:
sbx secret set github --command 'gh auth token' (run as the machine user)
plus your model key, e.g.
sbx secret set opencode --ref 'op://vault/item/field'.
Store service credentials: use custom secrets and specify dlt environment
variable names. For Databricks, use either a service-principal OAuth pair:
DESTINATION__DATABRICKS__CREDENTIALS__CLIENT_ID and
DESTINATION__DATABRICKS__CREDENTIALS__CLIENT_SECRET, or a personal access
token as DESTINATION__DATABRICKS__CREDENTIALS__ACCESS_TOKEN:
sbx secret set-custom databricks-client-id --ref 'op://vault/item/client-id' --env DESTINATION__DATABRICKS__CREDENTIALS__CLIENT_ID
sbx secret set-custom databricks-client-secret --ref 'op://vault/item/client-secret' --env DESTINATION__DATABRICKS__CREDENTIALS__CLIENT_SECRET
# PAT alternative:
sbx secret set-custom databricks-token --command 'powershell.exe -NoProfile -Command C:\Tools\Get-DatabricksToken.ps1' --refresh 30m --env DESTINATION__DATABRICKS__CREDENTIALS__ACCESS_TOKEN
For dbt test and prod targets, also provide the CLI/dbt-native
DATABRICKS_CLIENT_ID and DATABRICKS_CLIENT_SECRET variables. The
warehouse preflight maps the dlt-style client credentials to Databricks CLI
variables; the dbt profiles read the native names directly. Set
OP_ENVIRONMENT_ID to the 1Password Environment ID used by credentialed
mise tasks.
Source credentials use the same custom-secret pattern, for example:
sbx secret set-custom hubspot --ref 'op://vault/item/field' --env SOURCES__HUBSPOT__API_KEY
Run an agent:
sbx run --name reporting-agent --clone claude . # or: codex | opencode
Inside: mise install and mise run setup, then mise run pipeline -- notion
or opencode run "...". Credentialed tasks use
op run --environment "$OP_ENVIRONMENT_ID" -- ....
Review via git fetch sandbox-<name> before push/PR.
Default to DBT_TARGET=mock inside sandboxes.
Alternative: the restricted .devcontainer/agent "AI Agents" container
(non-root, read-only root fs, no Docker socket) is also supported — see
docs/source/agent_container.md §4. Its home-level ~/.secrets/.agent.env
file must include GITHUB_TOKEN set to the machine-user PAT.
Configure repository credentials:
OP_SERVICE_ACCOUNT_TOKEN (GitHub secret)OP_ENVIRONMENT_ID (GitHub variable containing the 1Password Environment ID)Configure workflow schedules in .github/workflows/:
Gemini workflows are leveraged from run-gemini-cli
Agentic workflows use GitHub Agentic Workflows (gh-aw) — see setup steps below.
Agentic workflows (.github/workflows/*.md + compiled .lock.yml) are managed
via the gh-aw extension.
Install the extension:
gh extension install github/gh-aw
Add the engine secret (this project uses Gemini):
gh secret set GEMINI_API_KEY
Author or edit a workflow — modify the .md source file in
.github/workflows/. Frontmatter controls engine, triggers, permissions, and
safe outputs; the Markdown body is the agent prompt.
Compile after frontmatter changes:
gh aw compile # recompile all workflows
gh aw compile my-workflow # recompile one workflow
Commit both the .md source and the generated .lock.yml. The .md body is
loaded at runtime so prompt-only changes don't require recompilation.
Run a workflow manually:
gh aw run my-workflow
The pipelines support flexible refresh modes for data loading:
FORCE_FULL_REFRESH=true mise run pipeline -- hubspot
# Force full refresh for HubSpot only
HUBSPOT_FULL_REFRESH=true mise run pipeline -- hubspot
The mise task wraps the central pipelines.run_pipeline runner, starts the
Databricks SQL warehouse, and loads source credentials from the selected
1Password Environment:
mise run pipeline -- notion --full
mise run pipeline -- hubspot --incremental --select hubspot__contacts,hubspot__companies
from pipelines.hubspot import refresh_hubspot
# Force full refresh
refresh_hubspot(is_incremental=False)
# Use environment-based detection (default)
refresh_hubspot() # or refresh_hubspot(is_incremental=None)
steps:
- name: run HubSpot pipeline
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
OP_ENVIRONMENT_ID: ${{ vars.OP_ENVIRONMENT_ID }}
run: mise run pipeline -- hubspot
| Variable | Description | Example |
|---|---|---|
FORCE_FULL_REFRESH | Global override for all pipelines | export FORCE_FULL_REFRESH=true |
PIPELINE_NAME | Pipeline identifier for specific overrides | export PIPELINE_NAME=HUBSPOT |
{PIPELINE_NAME}_FULL_REFRESH | Pipeline-specific full refresh flag | export HUBSPOT_FULL_REFRESH=true |
mise run setup to install
dependencies# Offline unit tests
mise run test
# Live APIs + Databricks e2e tests (via the configured 1Password Environment)
mise run test-e2e
# Local DuckDB fixtures
mise run dbt-build-mock
# Databricks dev (starts and waits for the SQL warehouse)
mise run dbt-build-dev
mise run dbt -- run --target mock --select model_namemise run dbt -- test --target mock --select model_namemise run docsEvery dbt SQL model follows the same top-to-bottom shape so a reader can debug it without scrolling:
ref()/source(), placed at the very top
of the model. This is the only place {{ ref(...) }} appears, so the model's
inputs are obvious at a glance.final last. The model ends with a final CTE holding the
output shape, followed by exactly select * from final. Selecting the
wildcard keeps the output decoupled from column order and makes it cheap to
inspect the final shape while debugging.with
-- Import CTEs: one per upstream model, selected as-is
stg_hubspot__contacts as (
select * from {{ ref('stg_hubspot__contacts') }}
),
-- Transform CTEs: all reshaping happens here
filtered as (
select * from stg_hubspot__contacts where email is not null
),
final as (
select contact_id, email from filtered
)
select * from final
This convention applies to every model (staging, core, intermediate, and marts).
The project uses GitHub Actions for automated pipeline execution:
dlt pipelines handle logging and artifacts differently than traditional applications:
~/.dlt/ folder (home directory) with metadata,
progress, and state informationlogs/ directorystate.json files for
debugging and monitoringpipeline.run() method returns execution information
that gets loggedNote: The ~/.dlt/ folder location is dlt's default behavior. You can
customize this using the DLT_DATA_DIR environment variable if needed, but for
GitHub Actions, the default home directory location works well.
The state.json files contain essential pipeline information without the bulk
of raw data:
This targeted approach provides debugging insights while keeping artifact sizes manageable.