Oeditions Hackathon Setup Máy của bạn

Dành cho người chưa từng cài công cụ dev

Oeditions Hackathon Setup

Nhanh nhất: dán một đoạn lệnh ở ngay dưới để máy tự cài hết, rồi bấm tay 3 link đăng nhập ở mục 01 — xong phần setup. Trang này dùng chung cho cả macOS và Windows — chọn hệ điều hành ở góc trên bên phải (hoặc bấm nút đổi ngay trong bài), cả trang sẽ chỉ hiện lệnh của máy bạn.

Làm xong mục 01 + 02 trước 14:30 ngày 21/8

Riêng C1 có thể phải chờ người khác duyệt: tài khoản Claude Team/Enterprise cần Owner bật connector GitHub cho cả team. Thử sớm — không thấy GitHub trong danh sách connector thì nhắn ban tổ chức trong nhóm ngay, đừng để sáng 22/8.

Setup 1 phát Nhanh nhất

Dán một đoạn lệnh, nó cài và khai báo hộ bạn toàn bộ phần máy móc: VS Code · Git · Node · Claude Code · GitHub CLI · danh tính git · đăng nhập GitHub. Chạy mất 3–6 phút, hỏi bạn đúng 2 câu (tên + email), rồi in ra bảng tự kiểm cuối cùng. Chạy lại nhiều lần cũng không sao — cái nào có rồi thì bỏ qua.

Ba việc đoạn lệnh này KHÔNG làm hộ được — vẫn phải tự bấm

Đều là đăng nhập trong trình duyệt, không script nào thay bạn bấm được. Làm ở mục 01, mỗi việc 1–2 phút:

  1. Đăng nhập tài khoản Claude — claude.ai
  2. Có tài khoản GitHub — github.com/signup
  3. Bật connector GitHub trong Claude — Settings → Connectors
Đang hiện đoạn lệnh cho macOSWindows — chọn ở góc trên bên phải, hoặc bấm ngay đây.

Mở Terminal: bấm Cmd + dấu cách, gõ Terminal, Enter. Copy toàn bộ khối dưới (kể cả dòng đầu bash <<'SCRIPT' và dòng cuối SCRIPT), dán vào, bấm Enter.

Bấm Start, gõ PowerShell, Enter. Copy toàn bộ khối dưới, dán vào, bấm Enter.

macOS · setup 1 phát
bash <<'SCRIPT'
set -euo pipefail

# ─────────────────────────────────────────────────────────────────
# Setup 1 phát — Oekathon 2026 (macOS)
# Cài: VS Code · Git · Node · Claude Code · GitHub CLI
# Khai báo: danh tính git · đăng nhập GitHub
# Không dùng sudo. Không tải script lạ. Có kiểm tra chữ ký / mã băm.
# ─────────────────────────────────────────────────────────────────

# Cả khối này đang được nạp qua stdin (dòng `bash <<'SCRIPT'`), nên mọi câu hỏi
# phải đọc thẳng từ /dev/tty — không thì `read` sẽ nuốt luôn phần script còn lại.
exec 3</dev/tty || { echo "❌ Không mở được /dev/tty. Chạy đoạn này trong cửa sổ Terminal thật."; exit 1; }

BIN="$HOME/.local/bin"; mkdir -p "$BIN"; export PATH="$BIN:$PATH"
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
ARCH=arm64; [ "$(uname -m)" = "arm64" ] || ARCH=x64

buoc(){ printf '\n\033[1;36m==> %s\033[0m\n' "$1"; }
ok(){   printf '   ✅ %s\n' "$1"; }
canh(){ printf '   ⚠️  %s\n' "$1"; }

# ── 1 · Visual Studio Code ───────────────────────────────────────
buoc "1/7 · Visual Studio Code"
if [ -d "/Applications/Visual Studio Code.app" ] || [ -d "$HOME/Applications/Visual Studio Code.app" ]; then
  ok "đã có sẵn, bỏ qua."
else
  [ "$ARCH" = arm64 ] && U="https://update.code.visualstudio.com/latest/darwin-arm64/stable" \
                      || U="https://update.code.visualstudio.com/latest/darwin-universal/stable"
  echo "   Đang tải từ update.code.visualstudio.com ..."
  curl -fL --progress-bar --proto '=https' --tlsv1.2 -o "$TMP/vsc.zip" "$U"
  mkdir -p "$TMP/out"
  # ditto chứ không phải unzip: unzip làm hỏng chữ ký, bước kiểm tra dưới sẽ báo lỗi oan.
  ditto -x -k "$TMP/vsc.zip" "$TMP/out"
  APP="$(find "$TMP/out" -maxdepth 1 -name '*.app' -print -quit)"
  echo "   Kiểm tra chữ ký số ..."
  codesign --verify --strict "$APP"
  spctl --assess --type execute "$APP"
  # Hai lệnh trên chỉ chứng minh "có ai đó được Apple tin cậy đã ký".
  # Dòng dưới mới ép ĐÚNG Microsoft — sai là dừng, không cài.
  codesign -dv --verbose=2 "$APP" 2>&1 | grep -q '^TeamIdentifier=UBF8T346G9' || {
    echo "   ❌ Người ký KHÔNG phải Microsoft. Dừng, không cài."; exit 1; }
  ditto "$APP" "/Applications/Visual Studio Code.app" 2>/dev/null \
    && ok "cài vào /Applications" \
    || { mkdir -p "$HOME/Applications"; ditto "$APP" "$HOME/Applications/Visual Studio Code.app"; ok "cài vào ~/Applications"; }
  rm -rf "$TMP/out" "$TMP/vsc.zip"
fi

# ── 2 · Git ──────────────────────────────────────────────────────
buoc "2/7 · Git"
if command -v git >/dev/null 2>&1; then
  ok "$(git --version)"
else
  canh "chưa có git — Apple sẽ mở cửa sổ cài Xcode Command Line Tools."
  echo "   Bấm Install, đợi xong (vài phút), rồi chạy lại đoạn này."
  xcode-select --install || true
  exit 1
fi

# ── 3 · Node 20+ ─────────────────────────────────────────────────
buoc "3/7 · Node (cần cho Claude Code)"
NODE_OK=0
command -v node >/dev/null 2>&1 && [ "$(node -p 'process.versions.node.split(".")[0]')" -ge 20 ] && NODE_OK=1
if [ "$NODE_OK" = 1 ]; then
  ok "$(node -v) — đạt yêu cầu."
else
  BASE="https://nodejs.org/dist/latest-v22.x"
  echo "   Đang tải Node LTS từ nodejs.org ..."
  curl -fsSL --proto '=https' --tlsv1.2 "$BASE/SHASUMS256.txt" -o "$TMP/SHASUMS256.txt"
  F="$(grep -o "node-v[0-9.]*-darwin-$ARCH\.tar\.xz" "$TMP/SHASUMS256.txt" | head -1)"
  [ -n "$F" ] || { echo "   ❌ Không tìm được bản Node cho máy này."; exit 1; }
  curl -fL --progress-bar --proto '=https' --tlsv1.2 -o "$TMP/$F" "$BASE/$F"
  echo "   Đối chiếu mã băm SHA-256 do nodejs.org công bố ..."
  ( cd "$TMP" && grep " $F\$" SHASUMS256.txt | shasum -a 256 -c - ) >/dev/null || {
    echo "   ❌ Mã băm KHÔNG khớp — file có thể đã bị đổi. Dừng, không cài."; exit 1; }
  rm -rf "$HOME/.local/node"; mkdir -p "$HOME/.local/node"
  tar -xJf "$TMP/$F" -C "$HOME/.local/node" --strip-components=1
  ln -sf "$HOME/.local/node/bin/node" "$BIN/node"
  ln -sf "$HOME/.local/node/bin/npm"  "$BIN/npm"
  ln -sf "$HOME/.local/node/bin/npx"  "$BIN/npx"
  ok "$("$BIN/node" -v) — cài vào ~/.local/node (không cần sudo)"
fi

# ── 4 · Claude Code ──────────────────────────────────────────────
buoc "4/7 · Claude Code"
if command -v claude >/dev/null 2>&1; then
  ok "đã có sẵn."
else
  # --prefix ~/.local: cài vào thư mục riêng của bạn nên không cần sudo.
  echo "   npm install -g @anthropic-ai/claude-code ..."
  npm install -g --prefix "$HOME/.local" @anthropic-ai/claude-code >/dev/null 2>&1 \
    && ok "xong — gõ 'claude' để dùng." \
    || canh "cài Claude Code không thành công. Bỏ qua được: bạn vẫn dùng Claude trên web."
fi

# ── 5 · GitHub CLI ───────────────────────────────────────────────
buoc "5/7 · GitHub CLI (để đăng nhập GitHub, khỏi cần SSH key)"
if command -v gh >/dev/null 2>&1; then
  ok "$(gh --version | head -1)"
else
  V="$(curl -fsSLI -o /dev/null -w '%{url_effective}' https://github.com/cli/cli/releases/latest | sed 's#.*/tag/v##')"
  [ -n "$V" ] || { echo "   ❌ Không đọc được phiên bản gh mới nhất."; exit 1; }
  Z="gh_${V}_macOS_${ARCH}.zip"
  R="https://github.com/cli/cli/releases/download/v${V}"
  echo "   Đang tải gh $V ..."
  curl -fL --progress-bar --proto '=https' --tlsv1.2 -o "$TMP/$Z" "$R/$Z"
  curl -fsSL --proto '=https' --tlsv1.2 -o "$TMP/gh_sums.txt" "$R/gh_${V}_checksums.txt"
  echo "   Đối chiếu mã băm SHA-256 do GitHub công bố ..."
  ( cd "$TMP" && grep " $Z\$" gh_sums.txt | shasum -a 256 -c - ) >/dev/null || {
    echo "   ❌ Mã băm KHÔNG khớp. Dừng, không cài."; exit 1; }
  ditto -x -k "$TMP/$Z" "$TMP/gh"
  cp "$(find "$TMP/gh" -type f -name gh -perm -u+x -print -quit)" "$BIN/gh"
  ok "$("$BIN/gh" --version | head -1) — cài vào ~/.local/bin"
fi

# ── PATH ─────────────────────────────────────────────────────────
RC="$HOME/.zshrc"; [ -n "${BASH_VERSION:-}" ] && [ ! -f "$RC" ] && RC="$HOME/.bash_profile"
grep -qs 'HOME/.local/bin' "$RC" || {
  printf '\n# Oekathon setup\nexport PATH="$HOME/.local/bin:$PATH"\n' >> "$RC"
  ok "đã thêm ~/.local/bin vào PATH trong $(basename "$RC")"
}

# ── 6 · Danh tính git ────────────────────────────────────────────
buoc "6/7 · Danh tính git (quyết định % đóng góp của bạn được tính cho ai)"
CUR_N="$(git config --global user.name  || true)"
CUR_E="$(git config --global user.email || true)"
if [ -n "$CUR_N" ] && [ -n "$CUR_E" ]; then
  ok "đã khai: $CUR_N <$CUR_E>"
  echo "   Sai thì sửa bằng: git config --global user.email 'email@moi'"
else
  printf '   Họ tên của bạn: '   ; IFS= read -r N <&3
  printf '   Email GitHub    : ' ; IFS= read -r E <&3
  [ -n "$N" ] && git config --global user.name  "$N"
  [ -n "$E" ] && git config --global user.email "$E"
  ok "đã khai: $(git config --global user.name) <$(git config --global user.email)>"
fi

# ── 7 · Đăng nhập GitHub ─────────────────────────────────────────
buoc "7/7 · Đăng nhập GitHub"
if gh auth status >/dev/null 2>&1; then
  ok "đã đăng nhập: $(gh api user --jq .login 2>/dev/null || echo '?')"
else
  echo "   gh sẽ hiện một mã 8 ký tự và mở trình duyệt — dán mã đó vào là xong."
  gh auth login --hostname github.com --git-protocol https --web <&3 || \
    canh "chưa đăng nhập xong. Chạy lại sau bằng: gh auth login --web"
fi
gh auth setup-git >/dev/null 2>&1 || true

# ── Bảng tự kiểm ─────────────────────────────────────────────────
kt(){ if eval "$2" >/dev/null 2>&1; then printf '   ✅ %-22s %s\n' "$1" "$(eval "$3" 2>/dev/null || echo '')"
      else printf '   ❌ %-22s %s\n' "$1" "$4"; fi; }
printf '\n\033[1;32m════ Máy bạn giờ có gì ════\033[0m\n'
kt "VS Code"      '[ -d "/Applications/Visual Studio Code.app" ] || [ -d "$HOME/Applications/Visual Studio Code.app" ]' 'echo' "chạy lại đoạn lệnh"
kt "Git"          'command -v git'    'git --version'          "chạy lại đoạn lệnh"
kt "Node"         'command -v node'   'node -v'                "chạy lại đoạn lệnh"
kt "Claude Code"  'command -v claude' 'echo "gõ: claude"'      "không bắt buộc — dùng Claude trên web cũng được"
kt "GitHub CLI"   'command -v gh'     'echo'                   "chạy lại đoạn lệnh"
kt "Danh tính git" 'git config --global user.email' 'git config --global user.email' "git config --global user.email 'ban@example.com'"
kt "Đăng nhập GitHub" 'gh auth status' 'gh api user --jq .login' "gh auth login --web"

cat <<'CON'

════ Còn 3 việc phải tự bấm (không script nào làm hộ được) ════
   1. Đăng nhập tài khoản Claude ......... https://claude.ai
   2. Bật connector GitHub cho Claude .... https://claude.ai/settings/connectors
   3. Thêm repo của đội vào connector .... https://github.com/settings/installations

   Mở CỬA SỔ TERMINAL MỚI trước khi gõ 'claude' hay 'gh' lần đầu.
CON
SCRIPT
Windows · setup 1 phát
$ErrorActionPreference = 'Stop'

# ─────────────────────────────────────────────────────────────────
# Setup 1 phát — Oekathon 2026 (Windows)
# Cài: VS Code · Git · Node · Claude Code · GitHub CLI
# Khai báo: danh tính git · đăng nhập GitHub
# Ưu tiên winget (có sẵn trong Windows). Không winget thì tải thẳng
# từ trang chủ và kiểm tra chữ ký số trước khi cài.
# ─────────────────────────────────────────────────────────────────

function Buoc($t){ Write-Host ""; Write-Host "==> $t" -ForegroundColor Cyan }
function Ok($t)  { Write-Host "   OK  $t" -ForegroundColor Green }
function Canh($t){ Write-Host "   !!  $t" -ForegroundColor Yellow }
function CoLenh($n){ $null -ne (Get-Command $n -ErrorAction SilentlyContinue) }
function LamMoiPath {
  $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + ';' +
              [Environment]::GetEnvironmentVariable('Path','User')
}

$coWinget = CoLenh winget
if (-not $coWinget) { Canh "Máy chưa có winget — sẽ tải thẳng từ trang chủ cho VS Code và Git." }

function CaiBangWinget($ten, $id) {
  winget install --id $id -e --source winget --accept-package-agreements --accept-source-agreements
  # $ErrorActionPreference KHÔNG bắt được mã lỗi của lệnh ngoài như winget,
  # nên phải tự kiểm tra, không thì cài hỏng vẫn in ra "OK".
  # 0 = cài xong; -1978335189 = "đã cài sẵn rồi", cũng coi là ổn.
  if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne -1978335189) {
    throw "Cài $ten thất bại (mã lỗi $LASTEXITCODE). Dừng lại."
  }
  LamMoiPath
  Ok "$ten xong."
}

function CaiBangTaiVe($ten, $url, $file) {
  $p = Join-Path $env:TEMP $file
  Write-Host "   Đang tải $ten ..."
  Invoke-WebRequest -Uri $url -OutFile $p -UseBasicParsing
  Write-Host "   Kiểm tra chữ ký số ..."
  $sig = Get-AuthenticodeSignature $p
  if ($sig.Status -ne 'Valid') { throw "Chữ ký KHÔNG hợp lệ ($($sig.Status)). Dừng, không cài." }
  Write-Host "   Nhà phát hành: $($sig.SignerCertificate.Subject)"
  Start-Process -FilePath $p -Wait
  Remove-Item $p -Force
  LamMoiPath
  Ok "$ten xong."
}

# ── 1 · Visual Studio Code ───────────────────────────────────────
Buoc "1/7 · Visual Studio Code"
if (CoLenh code) { Ok "đã có sẵn, bỏ qua." }
elseif ($coWinget) { CaiBangWinget "Visual Studio Code" "Microsoft.VisualStudioCode" }
else { CaiBangTaiVe "Visual Studio Code" "https://update.code.visualstudio.com/latest/win32-x64-user/stable" "VSCodeUserSetup.exe" }

# ── 2 · Git ──────────────────────────────────────────────────────
Buoc "2/7 · Git"
if (CoLenh git) { Ok (git --version) }
elseif ($coWinget) { CaiBangWinget "Git" "Git.Git" }
else { CaiBangTaiVe "Git" "https://github.com/git-for-windows/git/releases/latest/download/Git-64-bit.exe" "GitSetup.exe" }

# ── 3 · Node 20+ ─────────────────────────────────────────────────
Buoc "3/7 · Node (cần cho Claude Code)"
$nodeOk = $false
if (CoLenh node) { $nodeOk = [int]((node -p 'process.versions.node.split(".")[0]')) -ge 20 }
if ($nodeOk) { Ok "$(node -v) — đạt yêu cầu." }
elseif ($coWinget) { CaiBangWinget "Node LTS" "OpenJS.NodeJS.LTS" }
else { Canh "Chưa có winget — tải Node LTS thủ công tại https://nodejs.org rồi chạy lại đoạn này." }

# ── 4 · Claude Code ──────────────────────────────────────────────
Buoc "4/7 · Claude Code"
if (CoLenh claude) { Ok "đã có sẵn." }
elseif (CoLenh npm) {
  Write-Host "   npm install -g @anthropic-ai/claude-code ..."
  npm install -g @anthropic-ai/claude-code 2>&1 | Out-Null
  LamMoiPath
  if (CoLenh claude) { Ok "xong — gõ 'claude' để dùng." }
  else { Canh "cài Claude Code không thành công. Bỏ qua được: bạn vẫn dùng Claude trên web." }
} else { Canh "chưa có npm nên bỏ qua Claude Code." }

# ── 5 · GitHub CLI ───────────────────────────────────────────────
Buoc "5/7 · GitHub CLI (để đăng nhập GitHub, khỏi cần SSH key)"
if (CoLenh gh) { Ok ((gh --version) -split "`n")[0] }
elseif ($coWinget) { CaiBangWinget "GitHub CLI" "GitHub.cli" }
else { Canh "Chưa có winget — tải gh thủ công tại https://cli.github.com rồi chạy lại đoạn này." }

# ── 6 · Danh tính git ────────────────────────────────────────────
Buoc "6/7 · Danh tính git (quyết định % đóng góp của bạn được tính cho ai)"
$curN = (git config --global user.name)  2>$null
$curE = (git config --global user.email) 2>$null
if ($curN -and $curE) {
  Ok "đã khai: $curN <$curE>"
  Write-Host "   Sai thì sửa bằng: git config --global user.email 'email@moi'"
} else {
  $n = Read-Host "   Họ tên của bạn"
  $e = Read-Host "   Email GitHub"
  if ($n) { git config --global user.name  $n }
  if ($e) { git config --global user.email $e }
  Ok "đã khai: $(git config --global user.name) <$(git config --global user.email)>"
}

# ── 7 · Đăng nhập GitHub ─────────────────────────────────────────
Buoc "7/7 · Đăng nhập GitHub"
if (CoLenh gh) {
  gh auth status 2>$null | Out-Null
  if ($LASTEXITCODE -eq 0) { Ok "đã đăng nhập: $(gh api user --jq .login)" }
  else {
    Write-Host "   gh sẽ hiện một mã 8 ký tự và mở trình duyệt — dán mã đó vào là xong."
    gh auth login --hostname github.com --git-protocol https --web
    if ($LASTEXITCODE -ne 0) { Canh "chưa đăng nhập xong. Chạy lại sau bằng: gh auth login --web" }
  }
  gh auth setup-git 2>$null | Out-Null
}

# ── Bảng tự kiểm ─────────────────────────────────────────────────
Write-Host ""
Write-Host "==== May ban gio co gi ====" -ForegroundColor Green
function KT($ten, $co, $chitiet, $cach) {
  if ($co) { Write-Host ("   OK  {0,-20} {1}" -f $ten, $chitiet) -ForegroundColor Green }
  else     { Write-Host ("   --  {0,-20} {1}" -f $ten, $cach)    -ForegroundColor Yellow }
}
KT "VS Code"       (CoLenh code)   ""                  "chạy lại đoạn lệnh"
KT "Git"           (CoLenh git)    (git --version)     "chạy lại đoạn lệnh"
KT "Node"          (CoLenh node)   (node -v)           "chạy lại đoạn lệnh"
KT "Claude Code"   (CoLenh claude) "gõ: claude"        "không bắt buộc — dùng Claude trên web cũng được"
KT "GitHub CLI"    (CoLenh gh)     ""                  "chạy lại đoạn lệnh"
KT "Danh tinh git" ([bool](git config --global user.email)) (git config --global user.email) "git config --global user.email 'ban@example.com'"

Write-Host ""
Write-Host "==== Con 3 viec phai tu bam (khong script nao lam ho duoc) ====" -ForegroundColor Yellow
Write-Host "   1. Dang nhap tai khoan Claude ...... https://claude.ai"
Write-Host "   2. Bat connector GitHub cho Claude . https://claude.ai/settings/connectors"
Write-Host "   3. Them repo cua doi vao connector . https://github.com/settings/installations"
Write-Host ""
Write-Host "   Mo CUA SO POWERSHELL MOI truoc khi go 'claude' hay 'gh' lan dau."
Chạy xong thì mở cửa sổ Terminal mới

Đoạn lệnh có thêm đường dẫn vào PATH, mà cửa sổ đang mở không tự nhận. Mở cửa sổ mới rồi gõ claude hoặc gh --version để kiểm tra. Muốn hiểu từng dòng làm gì thì xem phần chứng minh ở mục 02 — cùng một cách viết: không sudo, không tải script lạ, kiểm chữ ký số / mã băm trước khi cài.

Bốn mục, khoảng 30 phút

Mục 01 · ~15 phút Claude + GitHub Cài Claude, tạo tài khoản GitHub, nối hai cái lại để AI đọc được repo của bạn. Toàn bộ bằng chuột.
Mục 02 · ~5 phút · Tuỳ chọn Cài 2 app VS Code + Git. Đã nằm trong "Setup 1 phát" ở trên — mục này là bản giải thích từng bước, kèm phần chứng minh lệnh đó an toàn. Chỉ dùng Tab Chat trên web thì bỏ qua cả hai.
Mục 03 · ~10 phút Setup repo hackathon Làm ngay khi BTC công bố team: tạo repo private, mời cả team và BTC vào repo.
Mục 04 · đọc trước Luật thi & chấm điểm Cách chạy ngày thi, luật đóng góp 10–30%, thang 100 điểm, bảng trừ điểm và 5 track để chọn.

Đã tự cài sẵn một phần rồi?

Không phải làm lại từ đầu. Chạy 7 phép thử dưới — cái nào chưa đạt thì nhảy thẳng vào đúng bước đó, bỏ qua phần còn lại.

Thử cái nàyĐạt là khiChưa đạt → đi đâu
Mở app Claude trên máyĐăng nhập được, và có tab Code01 · bước 1
Vào github.com/settings/installationsCó mục Claude trong danh sách01 · bước 3
Hỏi Claude "liệt kê repo tôi truy cập được trên GitHub"Nó kể ra đúng repo bạn đã tick01 · bước 3
Mở VS Code, chạy git --version Tuỳ chọnVS Code mở được, terminal ra đúng số phiên bản git — bỏ qua nếu bạn chỉ dùng Tab Chat trên web02
Mở Terminal, chạy claude --version Tuỳ chọnRa số phiên bản — bỏ qua nếu bạn chỉ dùng Claude trên webSetup 1 phát
Chạy gh auth status Tuỳ chọnBáo đã đăng nhập GitHub — nghĩa là git push sẽ chạy đượcSetup 1 phát
Đã biết team và repo của team chưaRepo private đã tạo, cả team và juzser đã được mời03 · D1–D3

Đạt hết thì bạn xong rồi.

Claude Code, Chat, hay Cowork?

Chỗ nàoLàm được gìDùng khi
Tab ChatHỏi đáp, đọc code qua kết nối GitHubHằng ngày
Tab Code
hoặc lệnh claude
Chạy lệnh trên máy bạn — tự cài phần mềm, tự sửa fileCài đặt ở mục 02
Tab CoworkChạy trên máy chủ ở xa — không cài được gì lên máy bạnKhông dùng cho setup

01

Hướng dẫn cho người mới

Không cần biết lập trình, không cần gõ lệnh. Đúng 3 bước, khoảng 15 phút — mỗi bước có sẵn nút bấm mở thẳng đúng trang cần vào.

Đăng nhập Claude~2 phút · A1

Dùng tài khoản Claude công ty cấp. Web là đủ cho cả mục 01, không phải cài gì.

Xong khi: thấy khung chat và gõ được câu hỏi vào đó.

Có tài khoản GitHub~3 phút · B1

Đã có tài khoản rồi thì bỏ qua bước này. Đăng ký bằng email nào cũng được; đặt tên dễ nhận (an-nguyen, chien-nv…) vì cả team nhìn thấy hằng ngày.

Xong khi: đã bấm link xác nhận trong hộp thư và đăng nhập được vào GitHub.

Nối GitHub vào Claude~5 phút · C1 · quan trọng nhất
  1. Bấm dấu + cạnh chữ Connectors → tìm GitHub → Connect.
  2. GitHub hỏi cài vào đâu → chọn tên tài khoản của bạn.
  3. Chọn Only select repositories → tick repo cần dùng → Install & Authorize.
  4. Quay lại Claude, thấy GitHub trong danh sách đã kết nối là được.

Nút trên không mở đúng chỗ thì vào menu: Settings → Connectors (vài bản ghi là Customize → Connectors), hoặc trong khung chat bấm + ở góc dưới bên trái → Connectors → Manage connectors. App trên máy hay web đều y hệt nhau.

Xong khi: mở chat mới, gõ "Liệt kê các repo tôi có quyền truy cập trên GitHub" — nó kể ra đúng danh sách bạn vừa tick.

Chưa được cấp tài khoản Claude thì làm gì

Nhắn chiennv hoặc tungot trên Slack để được setup qua Token Slayer ngay trước sáng thứ Bảy (ngày thi). Token Slayer cấp quyền qua CLI, không đăng nhập được ở claude.ai web — nên bạn sẽ dùng Claude qua Terminal hoặc VS Code thay vì web. Hướng dẫn tự setup: token-slayer.ownego.com/setup (cần cài VS Code trước — xem mục 02, có sẵn cho cả macOS lẫn Windows). Trong lúc chờ, bạn vẫn làm được bước 2 (tài khoản GitHub) và cả mục 02 — chỉ bước 3 là phải có tài khoản Claude.

Chưa có repo nào để tick ở bước 3 cũng không sao

Repo của đội chỉ tạo sau khi BTC công bố team. Cứ bật connector trước; tạo repo xong thì quay lại github.com/settings/installations → Claude → Configure để tick thêm — hướng dẫn ở mục 03 · D1.

Ba bước trên viết theo Claude vì đó là đường nhanh nhất và công ty đã duyệt sẵn — nhưng mục tiêu chỉ là có một AI hỗ trợ code dùng cho tiện, không bắt buộc phải là Claude. Repo hackathon là repo cá nhân của team, dùng AI nào bạn đã quen cũng thoải mái.

Mở thêm khi cần Không bắt buộc

Ba bước trên là đủ để xong mục 01. Hai khối dưới chỉ mở khi bạn rơi đúng vào trường hợp đó.

A2 · Cài app Claude trên máy Tuỳ chọnBấm để mở

Cần nếu bạn dùng Claude qua Token Slayer, hoặc muốn cài VS Code ở mục 02 để code trên máy. Chỉ dùng Tab Chat trên web thì bỏ qua, bước 1 là đủ. Nối GitHub ở đường nào cũng ra kết quả y hệt vì connector gắn vào tài khoản chứ không gắn vào máy.

Trang đang hiện hướng dẫn cho macOSWindows — chọn ở góc trên bên phải, hoặc bấm ngay đây.
  1. Tải bản macOS tại claude.com/download, mở file rồi kéo icon Claude vào thư mục Applications.
  2. Tải bản Windows tại claude.com/download, chạy file cài đặt, bấm Next → Install.
  3. Mở app → Sign in → trình duyệt mở ra → đăng nhập → quay lại app.
  4. Thấy khung chat và gõ được câu hỏi vào đó là xong.
Web cũng có tab Code — nhưng nó chạy ở nơi khác

Tab Code trên claude.ai/code chạy trên máy chủ ở xa, nên không cài được phần mềm lên máy bạn — giống hệt lý do tab Cowork không dùng được cho việc setup. Muốn Claude cài hộ ở mục 02 thì dùng app trên máy (hoặc gõ claude trong Terminal/PowerShell).

Kẹt ở đâu thì xử lý thế nào Tuỳ chọnMở khi bước 3 không chạy

Mở ra khi có gì đó không chạy. Không gặp lỗi thì khỏi đọc.

Kẹt ở đâu thì xử lý thế nào

Hiện tượngCách xử lý
Không thấy GitHub trong thư mục connector Tài khoản Team/Enterprise phải được duyệt trước: Owner vào Organization settings → Connectors → Browse connectors → chọn GitHub → Add to your team. Chưa duyệt thì thành viên không nhìn thấy. Đây không phải lỗi máy bạn — nhắn ban tổ chức trong nhóm.
Đã kết nối nhưng Claude bảo không thấy repo Repo đó chưa được tick lúc cấp quyền. Vào github.com/settings/installations → Claude → Configure → thêm repo vào danh sách.
Vừa nối xong mà chưa thấy gì Đợi vài phút rồi tải lại trang, hoặc mở một cuộc chat mới.
Đến đây là đủ nếu bạn chỉ cần đọc code và hỏi đáp

Muốn có thêm VS Code và git trên máy thì đi tiếp mục 02.

02 · Tuỳ chọn

Cài VS Code + Git

Không bắt buộc — cần nếu bạn muốn code trên máy (Tab Code / CLI), hoặc đang dùng Claude qua Token Slayer (không đăng nhập được ở claude.ai web, phải dùng qua Terminal/VS Code). Chỉ dùng Tab Chat trên web thì bỏ qua mục này. Một đoạn lệnh dán vào là cài xong, kèm phần chứng minh vì sao đoạn lệnh đó an toàn để bạn tự kiểm tra trước khi chạy.

Hai thứ này để làm gì

Ngắn gọn: GitHub giữ bản gốc trên mạng, VS Code là chỗ bạn đọc và sửa trên máy mình, Git là công cụ dòng lệnh đưa qua đưa lại giữa hai bên.

Trên mạng GitHub Nơi cả team để chung source code. Bản gốc nằm trên server, ai cũng lấy về được, và lưu lịch sử ai sửa gì lúc nào.
Trên máy bạn VS Code Công cụ mở source đã lấy về để đọc và sửa. Cũng là nơi Claude Code chạy khi bạn nhờ nó viết hộ.
Nối hai đầu Git Ba lệnh pull, commit, push gõ trong Terminal để đẩy phần bạn vừa sửa lên GitHub, hoặc kéo phần người khác vừa sửa về máy.

Vòng lặp hằng ngày chỉ có vậy: kéo bản mới nhất về → sửa trong VS Code → ghi lại thay đổi → đẩy lên cho cả team thấy.

Trang đang hiện hướng dẫn cho macOSWindows — chọn ở góc trên bên phải, hoặc bấm ngay đây.
Dán vào đâu

TerminalPowerShell hoặc tab Code của Claude. Tab Cowork không dùng được cho việc này — nó chạy trên máy chủ ở xa nên không cài phần mềm lên máy bạn được.

Dán vào Terminal

Mở Terminal: bấm Cmd + dấu cách, gõ Terminal, Enter. Copy toàn bộ khối dưới (kể cả dòng đầu bash <<'SCRIPT' và dòng cuối SCRIPT), dán vào, bấm Enter. Chạy mất 2–4 phút.

macOS · cài VS Code, kiểm tra/cài git
bash <<'SCRIPT'
set -euo pipefail

# Cài Visual Studio Code từ trang chủ Microsoft, kiểm tra/cài Git (qua Xcode Command Line Tools của Apple).
# Không dùng sudo. Không tải script lạ. Kiểm tra chữ ký số trước khi cài.
#
# Cả khối chạy trong MỘT tiến trình bash riêng (dòng `bash <<'SCRIPT'` ở trên),
# nên nếu có lỗi thì chỉ tiến trình đó dừng — cửa sổ Terminal của bạn vẫn còn,
# và bạn đọc được thông báo lỗi.

if [ "$(uname -m)" = "arm64" ]; then
  VSCODE_URL="https://update.code.visualstudio.com/latest/darwin-arm64/stable"
else
  VSCODE_URL="https://update.code.visualstudio.com/latest/darwin-universal/stable"
fi

TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT

cai_app() {
  ten="$1"; url="$2"; app="$3"; team="$4"

  if [ -d "/Applications/$app" ] || [ -d "$HOME/Applications/$app" ]; then
    echo "✅ $ten đã có sẵn trên máy, bỏ qua."
    return
  fi

  echo "==> Đang tải $ten ..."
  curl -fL --proto '=https' --tlsv1.2 -o "$TMP/app.zip" "$url"

  echo "==> Đang giải nén ..."
  mkdir -p "$TMP/out"
  # Dùng ditto (công cụ gốc của macOS), KHÔNG dùng unzip:
  # unzip làm hỏng chữ ký của app, khiến bước kiểm tra bên dưới báo lỗi oan.
  ditto -x -k "$TMP/app.zip" "$TMP/out"
  src="$(find "$TMP/out" -maxdepth 1 -name '*.app' -print -quit)"

  echo "==> Kiểm tra chữ ký số ..."
  codesign --verify --strict "$src"
  spctl --assess --type execute "$src"

  # Hai lệnh trên chỉ chứng minh "có ai đó được Apple tin cậy đã ký".
  # Dòng dưới mới ép ĐÚNG nhà phát hành — sai là dừng, không cài.
  if ! codesign -dv --verbose=2 "$src" 2>&1 | grep -q "^TeamIdentifier=$team"; then
    echo "❌ Người ký KHÔNG đúng (cần TeamIdentifier=$team). Dừng, không cài."
    exit 1
  fi
  echo "    Chữ ký hợp lệ và đúng nhà phát hành ($team)."

  echo "==> Đang chép vào thư mục Applications ..."
  # Chép bằng ditto luôn, để giữ nguyên chữ ký và quyền của app.
  if ditto "$src" "/Applications/$app" 2>/dev/null; then
    echo "✅ $ten đã cài vào /Applications"
  else
    mkdir -p "$HOME/Applications"
    ditto "$src" "$HOME/Applications/$app"
    echo "✅ $ten đã cài vào ~/Applications (thư mục riêng của bạn)"
  fi

  rm -rf "$TMP/out" "$TMP/app.zip"
}

cai_app "Visual Studio Code" "$VSCODE_URL" "Visual Studio Code.app" "UBF8T346G9"

echo ""
echo "==> Kiểm tra git ..."
if command -v git &>/dev/null; then
  echo "✅ git đã có sẵn ($(git --version))."
else
  echo "⚠️  Chưa có git — mở cài đặt Xcode Command Line Tools (chứa git)."
  echo "    Một cửa sổ cài đặt của Apple sẽ hiện ra, bấm Install và đợi xong (vài phút),"
  echo "    đừng đóng Terminal khi cửa sổ đó còn mở."
  xcode-select --install
fi

echo ""
echo "🎉 Xong. Mở Launchpad là thấy VS Code; gõ 'git --version' trong Terminal để kiểm tra lại git."
SCRIPT
Homebrew là gì? Tôi có cần không? Tuỳ chọnBấm để mở

Không cần — bạn đã xong rồi. Đoạn lệnh ở trên chạy được trên mọi máy Mac. Mở phần này chỉ khi tò mò, hoặc khi máy bạn đã có sẵn Homebrew và muốn gõ cách ngắn hơn.

Không cần. Bạn đã xong rồi.

Đoạn lệnh ở trên chạy được trên mọi máy Mac, không cần Homebrew. Nếu bạn chưa nghe tên Homebrew bao giờ thì bỏ qua cả phần này cũng không sao.

Homebrew là một công cụ cài phần mềm bằng dòng lệnh — hình dung như một cái “App Store cho Terminal”. Ai đã cài sẵn từ trước thì có cách gõ ngắn hơn, chỉ khác nhau ở chỗ đó thôi, hai cách cài ra cùng một app.

Đừng cài Homebrew chỉ để làm bước này. Cài nó mất thêm ~10 phút và thêm một thứ bạn chưa cần đến.

Muốn biết máy mình đã có sẵn chưa, dán dòng này vào Terminal rồi Enter:

macOS · kiểm tra xem máy đã có Homebrew chưa
brew --version
Đọc kết quả
  • Hiện Homebrew 4.x.x (hoặc số nào đó) → máy đã có. Muốn gõ ngắn thì dùng dòng dưới cùng.
  • Hiện zsh: command not found: brew → máy chưa có. Hoàn toàn bình thường, đa số máy mới đều vậy. Bạn dùng đoạn lệnh dài ở trên là đủ, không phải làm gì thêm.

Chỉ dành cho ai vừa thấy số phiên bản ở trên — một dòng, kết quả y hệt. git ở đây là formula thường (không phải cask) vì nó là công cụ dòng lệnh.

macOS · chỉ khi đã có Homebrew
brew install --cask visual-studio-code
brew install git

Dán vào PowerShell

Bấm nút Start, gõ PowerShell, Enter. Copy toàn bộ khối dưới, dán vào, bấm Enter. App nào đã cài rồi thì winget tự bỏ qua.

Windows · cài VS Code + git
$ErrorActionPreference = 'Stop'

# Cài Visual Studio Code từ trang chủ Microsoft, Git từ trang chủ Git for Windows.
# Ưu tiên winget (có sẵn trong Windows). Không có winget thì tải thẳng và kiểm tra chữ ký số.

$apps = @(
  @{ Ten='Visual Studio Code'; Id='Microsoft.VisualStudioCode';
     Url='https://update.code.visualstudio.com/latest/win32-x64-user/stable'; File='VSCodeUserSetup.exe' },
  @{ Ten='Git';                Id='Git.Git';
     Url='https://github.com/git-for-windows/git/releases/latest/download/Git-64-bit.exe'; File='GitSetup.exe' }
)

$coWinget = $null -ne (Get-Command winget -ErrorAction SilentlyContinue)
if (-not $coWinget) {
  Write-Host "Máy chưa có winget, sẽ tải thẳng từ trang chủ." -ForegroundColor Yellow
}

foreach ($a in $apps) {
  Write-Host ""
  Write-Host "==> $($a.Ten)" -ForegroundColor Cyan

  if ($coWinget) {
    winget install --id $a.Id -e --source winget `
      --accept-package-agreements --accept-source-agreements

    # $ErrorActionPreference KHÔNG bắt được mã lỗi của lệnh ngoài như winget,
    # nên phải tự kiểm tra, không thì cài hỏng vẫn in ra "✅ xong".
    # 0 = cài xong; -1978335189 = winget báo "đã cài sẵn rồi", cũng coi là ổn.
    if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne -1978335189) {
      throw "❌ Cài $($a.Ten) thất bại (mã lỗi $LASTEXITCODE). Dừng lại."
    }
  }
  else {
    $file = Join-Path $env:TEMP $a.File
    Write-Host "    Đang tải ..."
    Invoke-WebRequest -Uri $a.Url -OutFile $file -UseBasicParsing

    Write-Host "    Kiểm tra chữ ký số ..."
    $sig = Get-AuthenticodeSignature $file
    if ($sig.Status -ne 'Valid') {
      throw "❌ Chữ ký KHÔNG hợp lệ ($($sig.Status)). Dừng lại, không cài."
    }
    Write-Host "    Chữ ký hợp lệ. Nhà phát hành: $($sig.SignerCertificate.Subject)"

    Start-Process -FilePath $file -Wait
    Remove-Item $file -Force
  }
  Write-Host "✅ $($a.Ten) xong."
}

Write-Host ""
Write-Host "🎉 Xong. Bấm Start là thấy VS Code; mở PowerShell mới và gõ 'git --version' để kiểm tra git." -ForegroundColor Green

Hoặc để Claude Code làm hộ

Prompt · dán vào tab Code
Cài giúp tôi Visual Studio Code lên máy này, và kiểm tra/cài Git.

Yêu cầu bắt buộc:
- Tự phát hiện máy tôi là macOS hay Windows và dùng đúng cách của máy đó.
- macOS:
  - VS Code: nếu máy đã có Homebrew thì `brew install --cask visual-studio-code`; chưa có Homebrew
    thì tải thẳng từ trang chủ, ĐỪNG cài Homebrew (tôi không muốn cài thêm thứ tôi chưa cần):
      https://update.code.visualstudio.com/latest/darwin-universal/stable
      (máy Apple Silicon thì đổi darwin-universal thành darwin-arm64)
  - Git: chạy `git --version` trước — máy Mac thường đã có sẵn git qua Xcode Command Line Tools.
    Nếu chưa có, chạy `xcode-select --install` (hiện cửa sổ cài đặt của Apple, không phải tải từ nơi khác).
- Windows: dùng winget
    winget install --id Microsoft.VisualStudioCode -e --source winget
    winget install --id Git.Git -e --source winget
- App nào đã có trên máy thì bỏ qua, không cài đè. Kiểm tra trước khi cài.
- KHÔNG dùng sudo / KHÔNG xin quyền admin. Nếu bắt buộc phải cần thì dừng lại hỏi tôi và giải thích vì sao.
- KHÔNG tải script từ bất kỳ domain nào ngoài microsoft.com, visualstudio.com, apple.com (xcode-select), winget.
- Trước khi cài, kiểm tra chữ ký số của file tải về (macOS: codesign + spctl, Windows: Get-AuthenticodeSignature). Chữ ký không hợp lệ thì DỪNG, báo cho tôi, không cài.
- KHÔNG đụng vào file cá nhân của tôi, KHÔNG đọc ~/.ssh, KHÔNG tắt bất kỳ cơ chế bảo mật nào.
- Trước mỗi lệnh, nói cho tôi biết lệnh đó làm gì bằng tiếng Việt.
- Xong thì báo cáo: VS Code và git đã có phiên bản nào, nằm ở đâu.
Vì sao đoạn lệnh trên an toàn Tuỳ chọnPhần chứng minh

Sáu điều bạn tự kiểm chứng được, không phải tin lời ai. Không quan tâm thì chạy lệnh luôn cũng không sao.

Vì sao đoạn lệnh trên an toàn

Bạn không cần tin ai — dưới đây là những gì tự kiểm chứng được.

1 · Không có sudo, không xin quyền quản trị

Bản Mac chép app vào /Applications, không được thì tự chuyển sang ~/Applications — thư mục riêng của bạn. Không chỗ nào đòi mật khẩu máy.

2 · Không có kiểu curl … | bash

Đây là dạng nguy hiểm nhất: tải file lạ từ mạng về chạy thẳng mà không ai đọc được nội dung. Đoạn lệnh trên chỉ tải file cài đặt của chính 2 app đó, còn toàn bộ lệnh thì bạn đang đọc bằng mắt.

3 · Chỉ tải từ tên miền chính chủ

update.code.visualstudio.com → chuyển tiếp sang vscode.download.prss.microsoft.com (CDN Microsoft). Git thì kiểm tra bằng xcode-select --install (Apple tự quản lý, không tải từ nơi khác) hoặc winget. Tự kiểm tra: dán link vào trình duyệt xem nó chuyển đi đâu. Thấy tên miền khác → đừng chạy, báo team.

4 · Bắt buộc kiểm tra chữ ký số trước khi cài

Mac dùng codesign + spctl, Windows dùng Get-AuthenticodeSignature. File bị chỉnh sửa dọc đường thì bước này fail và script dừng ngay, chưa cài gì cả.

5 · Không tắt bất kỳ cơ chế bảo vệ nào

Không spctl --master-disable, không tắt Gatekeeper, không Set-ExecutionPolicy Bypass, không loại trừ thư mục khỏi Windows Defender. Ai bảo bạn làm mấy cái đó để "cài cho nhanh" — từ chối.

6 · Không chạm vào dữ liệu của bạn

Chỉ tải 2 file vào thư mục tạm, giải nén, chép 2 app, rồi tự xoá thư mục tạm. Không đọc file cá nhân, không đụng ~/.ssh, không gửi gì ra ngoài.

Danh tính người ký — phải khớp đúng dòng này

Kiểm chứng ngày 14/08/2026. Ra tên khác → dừng ngay, đừng cài, báo team.

Kết quả đúng
Visual Studio Code → Developer ID Application: Microsoft Corporation (UBF8T346G9)

Sau khi cài xong

Mở app lần đầu

  1. VS Code → biểu tượng người ở góc dưới bên trái → Sign in with GitHub. Bật Settings Sync để cài đặt của bạn theo sang máy khác.
  2. Khai báo Git: mở TerminalPowerShell, dán 2 dòng dưới (đổi tên + email GitHub đúng của bạn). Hai dòng này hiện lên lịch sử code — và ngày hackathon chúng quyết định % đóng góp của bạn được tính cho ai, nên phải giống nhau trên mọi máy bạn dùng (mục 04).
Terminal/PowerShell · khai báo Git một lần
git config --global user.name "Tên bạn"
git config --global user.email "email-github-cua-ban@example.com"

3 lệnh git cơ bản

Vòng lặp hằng ngày đúng ba bước, ngày nào cũng lặp lại theo thứ tự này:

Một vòng làm việc · chạy trong thư mục dự án
# 1 · Kéo bản mới nhất mọi người vừa đẩy lên
git pull

# 2 · Ghi lại phần bạn vừa sửa (add = chọn, commit = ghi kèm lời mô tả)
git add .
git commit -m "Sửa lỗi hiển thị giá ở trang giỏ hàng"

# 3 · Đẩy lên GitHub cho cả team thấy
git push
LệnhLàm gì
git pullLấy thay đổi mới nhất từ GitHub về máy
git commitGhi lại một mốc thay đổi kèm lời mô tả
git pushĐẩy các commit của bạn lên GitHub
Lệnh thứ tư nên thuộc: git status

Không sửa gì cả, chỉ báo bạn đang ở nhánh nào và file nào đang thay đổi. Lỡ tay hay không nhớ mình đang làm gì thì gõ nó trước, luôn an toàn.

Hai thói quen đỡ đau đầu về sau
  • Pull trước khi bắt đầu sửa. Sửa trên bản cũ rồi mới pull là lúc dễ dính xung đột (conflict) nhất.
  • Lời commit tả việc, đừng tả file. "Sửa lỗi tính phí ship" đọc hiểu ngay; "update code" thì 3 tháng sau không ai đoán ra.
Gặp chữ "conflict" thì dừng, đừng đoán

Đó là lúc hai người sửa cùng một chỗ và git không tự quyết được. Chụp màn hình gửi team, hoặc dán nguyên thông báo lỗi vào Claude và hỏi phải làm gì. Xử đại có thể xoá mất phần người khác vừa làm.

03

Setup repo cho ngày hackathon

Trong team sẽ có người biết tạo repo, nên phần này chỉ ghi các ràng buộc bắt buộc và khung README. Khoảng 10 phút, làm ngay khi BTC công bố team.

21/8 · 14:30 công bố team → làm mục này ngay  ·  17:30 reveal đề → code thật từ đây, không cần đợi sáng mai  ·  22/8 · 9h15–16h00 thi (mục 04).

Bốn quy tắc bắt buộc
  • Repo để ở tài khoản cá nhân của một thành viên — không tạo trong tổ chức ownego.
  • Để Private.
  • Mời cả team và BTC vào repo.
  • Sau hackathon, repo nào ngon mới transfer về ownego.

D1 Tạo repo

Một người tạo ở github.com/new: Owner là tài khoản cá nhân của bạn (đừng chọn nhầm ownego nếu nó có trong dropdown), tên oeditions-<tên-team>, chọn Private, tick Add a README file.

Tạo xong phải thêm repo vào connector, không thì Claude không đọc được nó

Ở mục 01 · bước 3 bạn cấp quyền kiểu Only select repositories, mà lúc đó repo này chưa tồn tại. Vào github.com/settings/installations → Claude → Configure → tick thêm repo mới. Mỗi người trong team tự làm cho tài khoản của mình.

D2 Mời cả team

Repo → Settings → Collaborators → Add people, gõ username GitHub hoặc email từng người. Quyền Write mặc định là đủ.

Mời xong chưa phải là xong

Mỗi người phải tự bấm Accept invitation trong email hoặc ở github.com/notifications. Chưa accept thì repo không hiện ra — lý do số 1 khiến sáng hôm thi có người ngồi chờ.

D3 Mời BTC vào repo

Vẫn ở Add people, gõ username này rồi chọn đúng tài khoản Son Nguyen H., xong gửi link repo vào thread hackathon trên Slack:

Bắt buộc · mời username này vào repo
juzser

Mời bằng email sonnh@ownego.com cũng ra đúng tài khoản này. Repo Private mà quên mời thì BTC không mở được repo của team bạn.

D4 Cả team clone thử trước ngày thi

Mỗi người clone repo về máy, sửa thử một dòng rồi push — để phát hiện trục trặc lúc còn kịp sửa, đừng để sáng 22/8. Dùng git CLI, hay nhờ Claude gõ lệnh hộ đều được — muốn cài Git + VS Code (tuỳ chọn) thì xem mục 02.

Ai làm phần nào thì tự commit phần đó

Đóng góp của từng người được đo bằng lịch sử GitHub, nên đừng gom code cho một người commit hộ. Kiểm tra git config user.name và user.email giống nhau trên mọi máy bạn dùng — khai lệch là bị đếm thành hai người.

Đóng góp được đo bằng lịch sử GitHub, mỗi người phải đạt 10–30% — gom code cho một người commit hộ là cả đội bị −20 điểm. Kiểm tra git config user.name và user.email trên mọi máy trước, khai sai là bị đếm thành hai người. Chi tiết ở mục 04.

Mở 18:00 · thứ Sáu 21/8 Phần README mô tả bài thi chưa mở

Đề bài và khung README.md sẽ hiện ở đây sau khi BTC công bố đề. Từ giờ tới lúc đó bạn cứ làm xong D1 → D4 là đủ — repo dựng sẵn, cả team clone được về máy.

D5 README mô tả bài thi

Repo bắt buộc có README.md ở thư mục gốc, mô tả đủ 3 phần: Spec, Prototype, Product. Thiếu Spec hay Prototype là −5 điểm mỗi phần (mục 04) — nên dựng khung sẵn từ hôm nay, ngày thi chỉ điền vào.

README.md · khung sẵn, chỉ việc điền
# <Tên dự án> — Team <tên team>

**Track:** <1 People & Culture | 2 Workflow Automation | 3 Entertainment &
Relax | 4 Growth & Learning | 5 The Mystery>

<Một câu: sản phẩm này làm được gì cho ai.>

## 1. Spec

**Vấn đề:** <ai đang gặp khó ở đâu, vì sao đáng giải quyết>

**Giải pháp:** <mình làm gì để giải quyết, trong một đoạn ngắn>

## 2. Prototype

<Link Figma / bản mockup / ảnh chụp màn hình. Ảnh thì để trong
thư mục prototype/ rồi chèn vào đây.>

## 3. Product

**Đã build thật được những gì:**
- <chức năng 1 — chạy được, không phải mockup>
- <chức năng 2>

**Cách chạy thử:**
```
<lệnh hoặc các bước để người khác mở lên xem>
```

**Chưa kịp làm:** <phần còn dang dở, ghi thật>
Được code thật từ tối nay — không cần đợi sáng mai

Đề đã reveal 17:30, luật đã mở 18:00 — từ ngay bây giờ các đội có thể bắt đầu viết code sản phẩm thật (không chỉ dừng ở setup repo D1–D4) và commit luôn, không phải chờ tới 9h15 sáng 22/8. Code/commit tối nay tính vào % đóng góp và vào phần Product trong README như bình thường.

Giờ thi chính thức 22/8 · 9h15–16h00 (mục 04) không đổi — đó vẫn là mốc điểm danh, thuyết trình và demo. Tối nay chỉ là mở sớm phần code cho đội nào rảnh muốn tranh thủ.

Bắt đầu code: mở thư mục vừa clone bằng VS Code → mở Terminal (menu Terminal → New Terminal) → gõ claude. Không cần tự đi tìm cài plugin gì cả — lần đầu chạy trong VS Code, Claude Code tự hỏi cài extension tích hợp IDE, bấm đồng ý là xong; có nó thì Claude sửa file là hiện diff ngay trong VS Code, không phải tự mở lại để xem. Chưa cài VS Code (mục 02, tuỳ chọn) thì cd vào thư mục repo trong Terminal/PowerShell rồi gõ claude vẫn được, chỉ là không có diff trực quan. Connector ở mục 01 chỉ để Claude đọc repo trên mạng — đẩy code lên vẫn dùng đăng nhập git của bạn.

Mở 18:00 · thứ Sáu 21/8 Luật thi & cách chấm điểm chưa mở

Thể thức, thang điểm, bảng trừ điểm và danh sách track sẽ hiện ở đây sau khi BTC công bố đề. Trước lúc đó, việc duy nhất cần làm là setup repo ở mục 03.

04

Luật thi & cách chấm điểm

Oekathon 2026: team tự phân bổ công việc, thi 6,75 tiếng ngày thứ Bảy 22/8. Ràng buộc duy nhất về cách chia việc là mỗi người phải đóng góp 10%–30% code của đội.

Ba việc phải xong trước 22/8
  1. Chọn track — mỗi track có slot giới hạn, hết slot là phải đổi.
  2. Dựng repo và mời đủ người — làm ở mục 03.
  3. Khai báo git đúng trên mọi máy — đóng góp đo bằng GitHub, khai sai là bị đếm nhầm người.

Ngày thi chạy thế nào

NgàyThứ Bảy, 22/8
Giờ9h15 – 16h00 — 6,75 tiếng
Code từ tối nay?Được — đề đã reveal, luật đã mở, cứ code và commit thật từ bây giờ. 9h15–16h00 ngày 22/8 là mốc điểm danh + tính giờ thi chính thức, không phải mốc "mới được bắt đầu code".
Cách làm việcTeam tự phân công, tự sắp xếp công việc và vai trò trong nội bộ. BTC không quy định ai làm gì lúc nào.
Điểm danhTeam chưa đủ mặt thì chưa được bắt đầu. BTC/MC điểm danh đầu giờ rồi mới tính giờ chính thức.

Contribution rule — 10% đến 30%

Mỗi thành viên phải chiếm 10%–30% tổng đóng góp code của đội

Đo bằng GitHub. Có một người lệch ra ngoài khoảng này là cả đội bị −20 điểm.

Đội 6 người chia đều nhau là 16,7%/người — nằm giữa khoảng, rất an toàn. Không cần chia chính xác, chỉ cần đừng có ai quá ít hoặc quá nhiều.

Cách đo, danh sách file không tính, và lệnh tự kiểm tra nằm ở cuối trang này. Chạy thử trong lúc thi để còn kịp cân lại phần việc.

Ba thứ phải nộp

Dựng sẵn khung README.md ở mục 03 · D5 từ hôm nay, ngày thi chỉ việc điền.

OutputMô tả
1 · SpecMô tả ngắn gọn vấn đề đang giải quyết & hướng giải pháp
2 · PrototypeBản demo/mockup thể hiện ý tưởng — UI mockup, flow, wireframe…
3 · ProductPhần build thật, phải chạy được dù chỉ ở mức MVP

Chấm 100 điểm

Tiêu chíĐiểmAi chấm
Commitment30% đóng góp trên GitHub của từng thành viên (commit / dòng code)
Idea30Khán giả vote tối đa 20 + giám khảo tối đa 10
Thuyết trình20Giám khảo — rõ ràng, súc tích, thuyết phục
Demo20Giám khảo — thể hiện đúng trải nghiệm cốt lõi, chứng minh ý tưởng khả thi

Vote khán giả tính thế nào

Poll trên Slack ngay sau khi tất cả các team thuyết trình + demo xong, đóng poll rồi tính điểm luôn. Team nhiều vote nhất được trọn 20 điểm, các team còn lại quy theo tỷ lệ:

Công thức
Điểm khán giả = (vote của team / vote của team cao nhất) × 20

Ví dụ: team cao nhất 40 vote → 20 điểm. Team X được 25 vote → (25 / 40) × 20 = 12,5 điểm.

Trừ điểm

Trừ thẳng vào tổng 100, các lỗi cộng dồn. Ba lỗi đầu là lỗi quên nộp, mỗi lỗi −5 — tránh được hoàn toàn bằng chuẩn bị trước. Lỗi thứ tư là lỗi chia việc, nặng hơn hẳn (−20), phải theo dõi trong lúc thi.

Vi phạmTrừ
Nộp bài muộn so với deadline−5
Thiếu Spec−5
Thiếu Prototype−5
Vi phạm Contribution rule — có thành viên đóng góp dưới 10% hoặc trên 30%−20
Mất trắng 30 điểm mà không viết sai dòng code nào

Thiếu cả Spec, Prototype và lệch contribution rule là −30 — hơn cả điểm Thuyết trình. Hai lỗi đầu tránh được bằng khung README.md dựng sẵn; lỗi contribution tránh được bằng cách chạy lệnh tự kiểm tra vài lần trong ngày thi.

Điểm cuối = tổng 4 tiêu chí − tổng trừ, không xuống dưới 0. Trừ tối đa −35.

Năm track để chọn

TrackĐề bàiSlot
1 · People & CultureGiải pháp AI giúp môi trường làm việc tốt hơn cho OE-ers.
Admin Team · People Management · Employee Experience · Culture · Connection · Onboarding
3
2 · Workflow AutomationTìm một workflow lặp đi lặp lại, thủ công, chậm — tái thiết kế bằng AI. Biến việc "không ai muốn làm" thành việc AI xử lý được.
Repetitive Tasks · Automation · Productivity · Meetings · Calls · Merchant Management · Weekly Scrum
3
3 · Entertainment & RelaxKhông phải thứ gì AI làm ra cũng phải "năng suất". Dùng AI cho công việc thường ngày vui hơn, thư giãn hơn.
Games · Happy Hour · Office Life · Social Activities · Fun · Wellbeing
3
4 · Growth & LearningXây thứ giúp bạn học điều mới, giỏi hơn trong công việc, hoặc giúp kiến thức dễ tìm — dễ hiểu — dễ chia sẻ hơn.
Self-improvement · Learning · Knowledge Management · Mentoring · Personal Growth
3
5 · The MysteryÝ tưởng không thuộc track nào ở trên? Sân chơi của bạn — hữu ích, kỳ lạ, tham vọng, hoặc hoàn toàn bất ngờ.
Anything Goes · Experiments · Weird · Surprise Us
5

Slot giới hạn, đăng ký sớm để giữ chỗ track mình muốn.

Đóng góp cá nhân được tính thế nào

Đây là phần chi tiết của Contribution rule ở đầu trang — xét trên cả số commit lẫn số dòng code thêm mới, thiếu một trong hai là tính vi phạm.

Hai con số đó tính ra sao

Công thức
% commit của bạn = số commit bạn là tác giả / tổng commit của repo
% dòng của bạn   = số dòng bạn THÊM vào       / tổng dòng cả đội thêm vào

Máy đọc git log của nhánh chính. Dòng bị xoá không tính, chỉ tính dòng thêm.

Không tính dòng của file máy tự sinh — nên đừng lo npm install làm lệch tỉ lệ, và cũng đừng trông chờ nó làm đẹp tỉ lệ của bạn:

package-lock.json, yarn.lock, pnpm-lock.yaml, go.sum, Cargo.lock, Gemfile.lock, thư mục dist/, build/, out/, vendor/, node_modules/, coverage/, generated/, .next/, .nuxt/, file *.min.js, *.min.css, *.map, *.snap, và file nhị phân (ảnh, font, zip…).

Sáu việc nên làm

  1. Ai làm phần nào thì tự commit phần đó. Đừng để một người gom code cả đội rồi commit hộ — người đó vọt lên trên 30%, những người kia rơi xuống dưới 10%.
  2. Khai báo git đúng và thống nhất trên mọi máy. Kiểm tra git config user.name và git config user.email. Cùng một người mà mỗi máy một email sẽ bị đếm thành hai tác giả — cả hai đều dưới sàn. Lỡ rồi thì thêm file .mailmap ở gốc repo (Lê An <email-chinh> <email-cu>) là gộp lại được.
  3. Đừng để một người dựng toàn bộ scaffold. create-next-app, code sinh sẵn, file cấu hình copy về — chúng vẫn được tính là dòng của người commit. Ai dựng khung thì nên bớt phần việc code sau đó, hoặc chia khung cho vài người.
  4. Người làm thiết kế / tài liệu / demo / PM vẫn phải có commit. Git không nhìn thấy Figma, slide hay video. Hãy đưa sản phẩm của mình vào repo: file .md tài liệu, ghi chú thiết kế, kịch bản demo, script test… Đó là commit thật và tính vào tỉ lệ.
  5. Pair programming thì luân phiên người commit. Dòng Co-authored-by được ghi nhận là bằng chứng cộng tác, nhưng không chia lại phần trăm — 100% thuộc về người đứng tên commit.
  6. Người chỉ đi merge sẽ trượt. Commit merge được đếm là commit nhưng thêm 0 dòng, nên % commit lên còn % dòng vẫn 0. Người đó cần có commit code thật.

Tự kiểm tra xem có phạm quy không

Đứng ở nhánh chính trong repo của đội (git checkout main), dán cả khối vào Terminal/PowerShell. Kết quả ra đúng như cách BTC tính, và tự chấm DAT hay !! cho từng người:

Tự kiểm tra · chạy trong repo của đội
git log --numstat --format='@%aN' | awk -F'\t' '
/^@/ { a = substr($0, 2); c[a]++; tc++; next }
NF == 3 && $1 ~ /^[0-9]+$/ {
  f = $3
  # File đổi tên được git ghi rút gọn — lấy lại tên MỚI rồi mới lọc
  if (f ~ / => /) {
    if (f ~ /\{/) { sub(/\{[^}]* => /, "", f); sub(/\}/, "", f) }
    else { sub(/^.* => /, "", f) }
  }
  if (f ~ /(^|\/)(dist|build|out|vendor|node_modules|coverage|generated|\.next|\.nuxt)\//) next
  if (f ~ /(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|go\.sum|Cargo\.lock|Gemfile\.lock)$/) next
  if (f ~ /\.(lock|min\.js|min\.css|map|snap)$/) next
  l[a] += $1; tl += $1
}
END {
  printf "%-24s %8s %8s   %s\n", "THANH VIEN", "COMMIT", "DONG", "KET QUA"
  for (a in c) {
    pc = 100*c[a]/tc; pl = tl ? 100*l[a]/tl : 0
    if (pc >= 10 && pc <= 30 && pl >= 10 && pl <= 30) k = "DAT"
    else if (pc < 10 && pl < 10)                      k = "!! THIEU ca hai"
    else if (pc > 30 || pl > 30)                      k = "!! VUOT 30%"
    else                                              k = "!! LECH mot chi so"
    printf "%-24s %7.1f%% %7.1f%%   %s\n", a, pc, pl, k
  }
}' | (read h; echo "$h"; sort)
Đọc kết quả
  • DAT — cả hai chỉ số nằm trong 10–30%, không sao.
  • !! THIEU ca hai — dưới sàn cả commit lẫn dòng, cần nhận thêm việc.
  • !! VUOT 30% — ôm quá nhiều, nên nhường phần việc cho người khác.
  • !! LECH mot chi so — hay gặp nhất là nhiều commit nhưng 0% dòng: dấu hiệu chỉ đi merge.
  • Không hiện tên trong bảng = chưa có commit nào. Đây là ca nặng nhất.

Chạy lại vài lần trong ngày thi — quãng giữa buổi và trước khi nộp — ai lệch thì còn kịp cân lại phần việc.

Vài điều cần biết

  • Squash merge xoá dấu vết. Nếu đội gộp mọi PR thành một commit của một người, cả đội sẽ hiện ra như một người làm. Giữ lịch sử commit thật.
  • Đừng chẻ nhỏ commit để lấy số. Giám khảo đọc cả tiêu đề commit và nội dung thay đổi; commit rỗng hoặc sửa khoảng trắng để đủ chỉ tiêu là phản tác dụng.
  • Kết quả là số học, không phải AI phán đoán. Máy tính một lần rồi đưa cùng con số đó cho cả hai giám khảo; giám khảo không tính lại. Đội thấy sai số thì báo BTC kèm lệnh git log để đối chiếu.
  • Đội quá ít người thì ngưỡng này không áp được — 3 người thì tối đa 3 × 30% = 90%, không thể đủ 100%. Trường hợp đó BTC xử lý riêng, không trừ điểm đội.
Oekathon 2026 · Đếm giờ
—
00:00:00
—
Oekathon 2026 · Thuyết trình — 10 phút / đội
Trình bày · phút 0–7
10:00
7 phút trình bày + 3 phút Q&A · bấm Đặt lại trước khi gọi đội tiếp theo