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.
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.
Đề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:
- Đăng nhập tài khoản Claude — claude.ai
- Có tài khoản GitHub — github.com/signup
- Bật connector GitHub trong Claude — Settings → Connectors
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.
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
$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."
Đ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
Đã 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à khi | Chưa đạt → đi đâu |
|---|---|---|
| Mở app Claude trên máy | Đăng nhập được, và có tab Code | 01 · bước 1 |
| Vào github.com/settings/installations | Có mục Claude trong danh sách | 01 · 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 đã tick | 01 · bước 3 |
Mở VS Code, chạy git --version Tuỳ chọn | VS 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 web | 02 |
Mở Terminal, chạy claude --version Tuỳ chọn | Ra số phiên bản — bỏ qua nếu bạn chỉ dùng Claude trên web | Setup 1 phát |
Chạy gh auth status Tuỳ chọn | Báo đã đăng nhập GitHub — nghĩa là git push sẽ chạy được | Setup 1 phát |
| Đã biết team và repo của team chưa | Repo private đã tạo, cả team và juzser đã được mời | 03 · D1–D3 |
Đạt hết thì bạn xong rồi.
Claude Code, Chat, hay Cowork?
| Chỗ nào | Làm được gì | Dùng khi |
|---|---|---|
| Tab Chat | Hỏi đáp, đọc code qua kết nối GitHub | Hằ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 file | Cài đặt ở mục 02 |
| Tab Cowork | Chạy trên máy chủ ở xa — không cài được gì lên máy bạn | Khô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.
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 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.
- Bấm dấu + cạnh chữ Connectors → tìm GitHub → Connect.
- GitHub hỏi cài vào đâu → chọn tên tài khoản của bạn.
- Chọn Only select repositories → tick repo cần dùng → Install & Authorize.
- 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.
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.
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.
- Tải bản macOS tại claude.com/download, mở file rồi kéo icon Claude vào thư mục Applications.
- Tải bản Windows tại claude.com/download, chạy file cài đặt, bấm Next → Install.
- Mở app → Sign in → trình duyệt mở ra → đăng nhập → quay lại app.
- Thấy khung chat và gõ được câu hỏi vào đó là xong.
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ượng | Cá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. |
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.
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.
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.
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.
Đ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:
brew --version
- 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.
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.
$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ộ
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.
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.
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.
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.
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ả.
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.
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.
Kiểm chứng ngày 14/08/2026. Ra tên khác → dừng ngay, đừng cài, báo team.
Visual Studio Code → Developer ID Application: Microsoft Corporation (UBF8T346G9)
Sau khi cài xong
Mở app lần đầu
- 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.
- 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).
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:
# 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ệnh | Làm gì |
|---|---|
git pull | Lấy thay đổi mới nhất từ GitHub về máy |
git commit | Ghi 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 |
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.
- 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.
Đó 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).
- 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.
Ở 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 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:
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.
Đó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.
Đề 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.
# <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>
Đề đã 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.
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.
- Chọn track — mỗi track có slot giới hạn, hết slot là phải đổi.
- Dựng repo và mời đủ người — làm ở mục 03.
- 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ày | Thứ 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ệc | Team 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 danh | Team 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%
Đ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.
| Output | Mô tả |
|---|---|
| 1 · Spec | Mô tả ngắn gọn vấn đề đang giải quyết & hướng giải pháp |
| 2 · Prototype | Bản demo/mockup thể hiện ý tưởng — UI mockup, flow, wireframe… |
| 3 · Product | Phần build thật, phải chạy được dù chỉ ở mức MVP |
Chấm 100 điểm
| Tiêu chí | Điểm | Ai chấm |
|---|---|---|
| Commitment | 30 | % đóng góp trên GitHub của từng thành viên (commit / dòng code) |
| Idea | 30 | Khán giả vote tối đa 20 + giám khảo tối đa 10 |
| Thuyết trình | 20 | Giám khảo — rõ ràng, súc tích, thuyết phục |
| Demo | 20 | Giá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ệ:
Đ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ạm | Trừ |
|---|---|
| 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 |
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ài | Slot |
|---|---|---|
| 1 · People & Culture | Giả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 Automation | Tì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 & Relax | Khô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 & Learning | Xâ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
% 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
- 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%.
- Khai báo git đúng và thống nhất trên mọi máy. Kiểm tra
git config user.namevà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. - Đừ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. - 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
.mdtà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ệ. - 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. - 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:
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)
- 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.