Compare commits

...
6 Commits
Author SHA1 Message Date
Godopu d37afb7e5e feat(members): update professor bio and CV dialog details 2026-09-20 15:35:46 +09:00
Godopu a6f094614e chore(docker): configure host volume mount and container user in docker-compose.yml
- Add container user specification UID:GID
- Mount host directory ./volumes/data to /app/data
- Comment out named volume definition
2026-09-15 23:48:17 +00:00
Godopu 1150c230b6 feat(members): update professor profile image and archive previous as prof_profile_2.png
- Replace prof_profile.png with newly provided photo
- Rename previous profile photo to prof_profile_2.png for archiving
2026-09-15 23:48:08 +00:00
Godopu 01c7c97ec3 fix(members): restore professor profile image and remove GitHub profile link
- Restore prof_profile.png under refer_landing_page/public/images/
- Remove GitHub Profile link component and separator from professor section
2026-09-15 23:36:18 +00:00
Godopu a362e2c070 chore: remove unused profile image assets and ignore .claude directory 2026-09-13 21:21:01 +09:00
GodopuandClaude Opus 5 43ef515a3b feat(header): stack ANL wordmark in three lines and show desktop nav from 1000px
- Replace the "ANL" + "AI Agent Networking LAB" pair with a stacked
  "AI Agent / Networking / Laboratory" wordmark in Geist semibold; the
  cobalt initials spell out ANL.
- Add a header-only `nav` screen (1000px) so the inline desktop nav
  replaces the mobile menu earlier than the shared `desktop` (1240px)
  breakpoint, with compact tracking/padding between 1000px and 1239px.
  The masthead strip and project page layout still use `desktop`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RcexqbEX5CnaLog2xNFQN7
2026-09-13 20:22:08 +09:00
11 changed files with 92 additions and 48 deletions

No files matched your search

+3 -2
View File
@@ -4,6 +4,7 @@
# Python virtual environment
/.venv/
.agents/
.claude/
# Binary zip archives
*.zip
@@ -14,6 +15,8 @@
*.db-wal
*.db-shm
!backend/db/backup/*.sql
.env
docker-compose.yaml
# >>> MAM managed block (managed by install.sh — do not edit) >>>
/.venv/
/.mam/
@@ -25,5 +28,3 @@
/.mam-skill-backup.*/
CURRENT_JOB.md
# <<< MAM managed block <<<
.env
docker-compose.yaml
+52 -8
View File
@@ -48,6 +48,12 @@
#default: $HOME/.config/herdr/herdr.sock
# HERDR_SOCKET_PATH=$HOME/.config/herdr/herdr.sock
# Explicit Herdr workspace scope identifier (`herdr pane list --workspace <id>`).
# Hard filters pane/agent resolution to this workspace. When unset, falls back
# to $WORKSPACE_ROOT/.mam/herdr_workspace_id or server-global resolution.
#default: <unset> (uses persisted .mam/herdr_workspace_id or global)
# HERDR_WORKSPACE_ID=w1
# ===========================================================================
# delegate-job / MQTT broker
# ===========================================================================
@@ -88,6 +94,25 @@
#default: INFO
# MAM_LOG_LEVEL=INFO
# Optional xAI API Key for Grok Build CLI (if ~/.grok/auth.json is not present).
#default: (unset → reads ~/.grok/auth.json)
# XAI_API_KEY=replace_me
# Optional multi-provider API keys for OpenCode CLI and OpenAI API key for Codex CLI.
#default: (unset → reads ~/.local/share/opencode/auth.json or ~/.codex/auth.json)
# ANTHROPIC_API_KEY=replace_me
# OPENAI_API_KEY=replace_me
# GEMINI_API_KEY=replace_me
# GROQ_API_KEY=replace_me
# Optional override for Codex CLI state / session directory.
#default: $HOME/.codex
# CODEX_HOME=$HOME/.codex
# Optional inline JSON permissions configuration for OpenCode.
#default: (unset → defaults to --auto CLI bypass)
# OPENCODE_PERMISSION='{"*":"allow"}'
# Retention period (days) for delegate-job event logs.
#default: 7
# MAM_EVENT_RETENTION_DAYS=7
@@ -128,19 +153,38 @@
#default: 3
# SKS_EMPTY_GIVEUP=3
# Minimum columns a pane must retain after a vertical split (2xK layout engine).
#default: 40
# MAM_MIN_PANE_COLS=40
# Minimum columns a pane must retain after a horizontal/column split (2xK layout engine).
#default: 15
# MAM_MIN_PANE_COLS=15
# Minimum rows a pane must retain after a horizontal split (2xK layout engine).
#default: 20
# MAM_MIN_PANE_ROWS=20
# Minimum rows a pane must retain after a vertical split (2xK layout engine).
# Set to 0 to disable vertical row constraints (terminal scrollback handles height).
#default: 0
# MAM_MIN_PANE_ROWS=0
# Maximum number of columns a workspace may grow to before the engine reports
# 'overflow' (which makes lib.sh create a fresh workspace instead of splitting).
# Applies to both measured (GUI) and headless 0x0 layouts.
#default: (unset -> no column cap)
# MAM_MAX_PANE_COLS=3
#default: 2
# MAM_MAX_PANE_COLS=2
# Maximum number of rows per column before overflow. Default 2 guarantees an
# even 2x2 grid; do not raise this until a resize-normalisation pass exists.
#default: 2
# MAM_MAX_PANE_ROWS=2
# Kill the session instead of preserving it when TUI readiness times out.
#default: 0
# MAM_KILL_ON_READY_TIMEOUT=0
# Number of trailing non-blank pane lines scanned for blocking modal signatures.
#default: 8
# MAM_DIALOG_TAIL_LINES=8
# Consecutive empty captures before wait_for_tui_ready declares the pane unobservable.
# NOTE: distinct from SKS_EMPTY_GIVEUP, which governs send_keys_safe quiescence (default 3).
#default: 5
# MAM_READY_EMPTY_GIVEUP=5
# ==============================================================================
# deploy / distribution source (for forks/mirrors)
+1 -1
View File
@@ -9,7 +9,7 @@ This module implements the standalone backend REST API server, SQLite database s
```
+-------------------------------------------------------------+
| SQLite (anl.db) |
| 11 Relational Tables (Projects, Members, Pubs, Lectures) |
| 11 Relational Tables (fProjects, Members, Pubs, Lectures) |
+-------------------------------------------------------------+
▲ ▲
│ (cmd/seed) │ (SQL query)
+6 -4
View File
@@ -8,6 +8,7 @@ services:
args:
- NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL:-}
container_name: anl-app
user: "${UID:-1000}:${GID:-1000}"
restart: unless-stopped
ports:
- "${APP_PORT:-8080}:8080"
@@ -20,7 +21,8 @@ services:
- AUTO_MIGRATE=true
- ADMIN_TOKEN=${ADMIN_TOKEN:?ADMIN_TOKEN must be set -- see .env.example}
volumes:
- anl-db-data:/app/data
- ./volumes/data:/app/data
# - anl-db-data:/app/data
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8080/api/v1/health" ]
interval: 15s
@@ -28,6 +30,6 @@ services:
retries: 3
start_period: 5s
volumes:
anl-db-data:
name: anl-sqlite-storage
# volumes:
# anl-db-data:
# name: anl-sqlite-storage
@@ -11,9 +11,15 @@ const EDUCATION = [
const CAREER = [
{
period: "2024. 3 - Present",
role: "Dean",
org: "College of IT Engineering (CITE)",
period: "2004. 3 - Present",
role: "Professor",
org: (
<>
School of Computer Science and Engineering (CSE),
<br />
College of IT Engineering (CITE)
</>
),
inst: "Kyungpook National University (KNU)",
},
{
@@ -23,9 +29,9 @@ const CAREER = [
inst: "Kyungpook National University (KNU)",
},
{
period: "2004. 3 - Present",
role: "Professor",
org: "School of Computer Science and Engineering (CSE), College of IT Engineering (CITE)",
period: "2024. 3 - 2026. 2",
role: "Dean",
org: "College of IT Engineering (CITE)",
inst: "Kyungpook National University (KNU)",
},
{
@@ -37,11 +43,11 @@ const CAREER = [
];
const STANDARDIZATION = [
"ISO/IEC JTC1 SC6/WG7: Reliable/Mobile Multicasting (1999 ~ 2019): Project Editor",
"IEC TC100: Multimedia Systems and Equipment (2018 ~ Present): WG11 Convenor, Project Editor in WG12, WG30",
"ISO/IEC JTC1 SC41/WG5: Internet-of-Things (IoT) Applications (2020 ~ Present): Project Editor",
"ISO/IEC JTC1 SC6/WG7: Reliable/Mobile Multicasting (1999 ~ 2019): Project Editor",
"ITU-T SG13: Mobility Management (1999 ~ 2015): Project Editor",
"ITU-T SG20: VLC-based IoT (2018 ~ 2020): Project Editor",
"IEC TC100: Multimedia Systems and Equipment (2018 ~ Present): Project Editor, TA15 TAM, WG11 Convenor",
];
const MEMBERSHIPS = [
@@ -83,7 +89,7 @@ export function ProfessorDetailsDialog() {
ref={dialogRef}
aria-labelledby="prof-dialog-title"
onClick={handleBackdropClick}
className="bg-paper text-ink border border-line rounded-lg p-0 max-w-2xl w-[92vw] max-h-[85vh] supports-[height:100dvh]:max-h-[85dvh] backdrop:bg-ink/50 backdrop:backdrop-blur-sm open:flex open:flex-col shadow-2xl m-auto"
className="bg-paper text-ink border border-line rounded-lg p-0 max-w-fit w-[92vw] max-h-[85vh] supports-[height:100dvh]:max-h-[85dvh] backdrop:bg-ink/50 backdrop:backdrop-blur-sm open:flex open:flex-col shadow-2xl m-auto"
>
{/* Modal Header */}
<div className="flex items-center justify-between border-b border-line p-6 bg-paper sticky top-0 z-10">
+1 -10
View File
@@ -61,7 +61,7 @@ export default function MembersPage() {
</h2>
<div className="text-sm text-ink-mute leading-relaxed space-y-2">
<p>
Professor at the School of Computer Science and Engineering, Kyungpook National University, and Dean of the College of IT Engineering. He directs the AI Agent Networking Laboratory (ANL), leading research on QUIC/gRPC transport, A2A/ACP protocols, MCP &amp; SKILL architectures, and multi-agent orchestration, and serves as Project Editor in ISO/IEC JTC1, ITU-T, and IEC TC100.
He received B.S. and M.S. degrees in Management Science from KAIST, Korea in 1992 and 1994, respectively. He also received Ph.D. degree in Industrial Engineering from KAIST, Korea in 1998. From August 1998 to February 2004, he worked for Protocol Engineering Center in ETRI. Since March 2004, he has been with the school of Computer Science and Engineering in the Kyungpook National University as a professor. He directs the AI Agent Networking Laboratory (ANL), leading research on QUIC/gRPC transport, A2A/ACP protocols, MCP &amp; SKILL architectures, and multi-agent orchestration, and serves as Project Editor in IEC TC100, ISO/IEC JTC1 and ITU-T.
</p>
<div>
<ProfessorDetailsDialog />
@@ -74,15 +74,6 @@ export default function MembersPage() {
>
sjkoh@knu.ac.kr
</a>
<span className="text-ink-mute">|</span>
<a
href="https://github.com/sjkoh12"
target="_blank"
rel="noopener noreferrer"
className="text-ink hover:text-cobalt-dark hover:underline"
>
GitHub Profile ↗
</a>
</div>
</div>
<div className="lg:col-span-4 flex justify-center items-center">
+12 -14
View File
@@ -134,7 +134,7 @@ export default function Header() {
{/* Brand logo */}
<Link
href="/"
className="group flex items-center gap-3 min-w-0 desktop:shrink-0"
className="group flex items-center gap-3 min-w-0 nav:shrink-0"
onClick={() => setOpen(false)}
>
<div className="relative flex items-center justify-center w-9 h-9 sm:w-10 sm:h-10 rounded-xl overflow-hidden shadow-sm border border-line group-hover:border-cobalt/40 group-hover:shadow-md group-hover:scale-105 transition-all duration-300 shrink-0">
@@ -162,18 +162,16 @@ export default function Header() {
</svg>
</div>
<div className="flex flex-col leading-none min-w-0">
<span className="headline-ko text-lg text-ink sm:text-xl font-bold tracking-tight group-hover:text-cobalt-dark transition-colors">
ANL
</span>
<span className="kicker mt-1 transition-colors group-hover:text-cobalt-dark truncate">
AI Agent Networking LAB
</span>
{/* Stacked wordmark — the cobalt initials spell out ANL */}
<div className="font-sans flex flex-col min-w-0 text-[0.8rem] sm:text-[0.875rem] font-semibold leading-[1.15] tracking-tight text-ink transition-colors group-hover:text-cobalt-dark">
<span className="whitespace-nowrap"><span className="text-cobalt">A</span>I Agent</span>
<span className="whitespace-nowrap"><span className="text-cobalt">N</span>etworking</span>
<span className="whitespace-nowrap"><span className="text-cobalt">L</span>aboratory</span>
</div>
</Link>
{/* Desktop nav — small caps, wide tracking (visible at >= 1240px) */}
<div className="hidden items-center gap-4 desktop:flex">
{/* Desktop nav — small caps, wide tracking (visible at >= 1000px; compact spacing below 1240px) */}
<div className="hidden items-center gap-3 nav:flex desktop:gap-4">
<nav className="flex items-center gap-2" aria-label="Main Navigation">
{navItems.map((item) => {
const active = isActive(item.href);
@@ -182,7 +180,7 @@ export default function Header() {
key={item.href}
href={item.href}
aria-current={active ? "page" : undefined}
className={`group relative flex items-baseline gap-1.5 text-[0.78rem] font-semibold uppercase tracking-[0.18em] transition-all px-3 py-1.5 rounded-md ${
className={`group relative flex items-baseline gap-1.5 text-[0.78rem] font-semibold uppercase tracking-[0.1em] desktop:tracking-[0.18em] transition-all px-2 desktop:px-3 py-1.5 rounded-md ${
active
? "bg-cobalt-dark text-white dark:text-ivory shadow-sm font-bold"
: "text-ink hover:text-cobalt-dark hover:bg-paper/60"
@@ -204,8 +202,8 @@ export default function Header() {
<ThemeToggle />
</div>
{/* Mobile controls (visible under 1240px) */}
<div className="flex items-center gap-2 desktop:hidden">
{/* Mobile controls (visible under 1000px) */}
<div className="flex items-center gap-2 nav:hidden">
<ThemeToggle />
<button
type="button"
@@ -230,7 +228,7 @@ export default function Header() {
{open && (
<nav
id="mobile-menu"
className="mobile-menu-panel border-t border-ink bg-ivory desktop:hidden"
className="mobile-menu-panel border-t border-ink bg-ivory nav:hidden"
aria-label="Mobile Navigation"
>
<ul className="container-content flex flex-col py-2">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 KiB

After

Width:  |  Height:  |  Size: 389 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 KiB

+2
View File
@@ -29,6 +29,8 @@ const config: Config = {
theme: {
extend: {
screens: {
// Header swaps the mobile menu for the inline nav (compact spacing until `desktop`).
nav: "1000px",
desktop: "1240px",
},
colors: {