<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ageofclick</title>
    <description>The latest articles on DEV Community by ageofclick (@ageofclick).</description>
    <link>https://dev.to/ageofclick</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3937152%2Face31e13-9ef3-4de3-877c-90fa0208ccd2.png</url>
      <title>DEV Community: ageofclick</title>
      <link>https://dev.to/ageofclick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ageofclick"/>
    <language>en</language>
    <item>
      <title>GeekNews AI Weekly Deep Dive - 2026-06-08</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:36:34 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-06-08-5hib</link>
      <guid>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-06-08-5hib</guid>
      <description>&lt;p&gt;이번 주 AI 이슈는 모델 성능보다 실제 도입의 주변 조건이 더 크게 보인 한 주였습니다. 신규 대졸자 고용과 HN 논쟁은 AI가 노동시장과 개발자 문화에 미치는 긴장을 보여줬고, Codex 활용 사례와 Claude Code 알림 도구는 에이전트형 개발 워크플로가 일상 도구로 내려오는 모습을 보여줬습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 미국 신규 대졸자의 실업률이 이제 평균 노동자보다 높아졌다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 미국의 최근 대졸자는 과거 경기 침체기에도 평균 노동자보다 취업에서 유리했지만, 2019년 초부터 그 흐름이 뒤집혔고 2026년에는 격차가 기록적으로 벌어졌다. 글은 이 현상을 학위의 가치가 사라진 문제가 아니라 첫 일자리로 들어가는 통로가 약해진 문제로 보며, 원격근무로 인한 멘토링 감소와 AI 노출 직무의 축소를 주요 후보로 짚는다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.randalolson.com/2026/06/04/recent-grad-unemployment-flip/" rel="noopener noreferrer"&gt;https://www.randalolson.com/2026/06/04/recent-grad-unemployment-flip/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. 하네스 엔지니어링: 에이전트 우선 세계에서 Codex 활용하기
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: OpenAI 팀은 내부 베타 제품을 사람이 직접 코드를 쓰지 않는 제약 아래 Codex 중심으로 만들며, 엔지니어의 역할이 구현자에서 환경과 피드백 루프를 설계하는 쪽으로 이동한다고 설명한다. 효과를 내려면 지식과 규칙을 저장소 안에 구조화하고, 테스트·관찰성·리뷰·정리 작업까지 에이전트가 이해하고 반복할 수 있게 만들어야 한다는 점이 핵심이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://openai.com/index/harness-engineering/" rel="noopener noreferrer"&gt;https://openai.com/index/harness-engineering/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Show GN: Claude Code가 답변을 요구할 때 화면에 오버레이를 띄우는 플러그인
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이 도구는 Claude Code가 작업을 마치거나 사용자 선택을 기다릴 때 화면 전체 오버레이와 알림음으로 입력이 필요하다는 사실을 알려준다. 설치하면 훅이 자동으로 등록되고, 환경에 맞는 사전 빌드 실행 파일을 내려받아 검증하므로 사용자는 별도 설정 없이 데스크톱 환경에서 바로 알림을 받을 수 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://github.com/roeniss/claude-code-done-overlay/blob/main/README.ko.md" rel="noopener noreferrer"&gt;https://github.com/roeniss/claude-code-done-overlay/blob/main/README.ko.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. 거실의 스마트 TV는 AI 스크래핑 경제의 노드
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Bright Data의 SDK는 제휴 앱에 들어가 사용자의 휴대폰이나 스마트 TV를 주거용 프록시로 활용하며, 외부 고객의 웹 수집 트래픽을 가정용 IP에서 나간 것처럼 보이게 한다. 글은 특히 스마트 TV가 전원과 네트워크가 안정적이고 사용자의 감시가 적어 이런 프록시 네트워크에 유리하다고 지적하며, 동의 화면과 실제 대역폭·텔레메트리·VPN 우회 동작 사이의 간극을 보안 문제로 다룬다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://blog.includesecurity.com/2026/06/the-smart-tv-in-your-livingroom-is-a-node-in-the-aiscraping-economy/" rel="noopener noreferrer"&gt;https://blog.includesecurity.com/2026/06/the-smart-tv-in-your-livingroom-is-a-node-in-the-aiscraping-economy/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. LLM이 인간 같은 속성을 가진다면 Age of Empires II도 그렇다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 논문은 LLM 연구가 도덕성, 이해, 감정 같은 인간적 속성을 실험 설계 단계에서 암묵적으로 가정하면 결론이 순환적이거나 정보가 부족해질 수 있다고 비판한다. 저자는 Age of Empires II 안에서 신경망을 구현하고 학습시키는 예시로, 같은 입출력 행동도 구현 매체와 표현 방식에 따라 해석이 달라지므로 관찰 가능한 행동과 인간적 속성의 귀속을 분리해야 한다고 주장한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://arxiv.org/pdf/2605.31514" rel="noopener noreferrer"&gt;https://arxiv.org/pdf/2605.31514&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Ntsc-rs - 아날로그 TV와 VHS 아티팩트의 오픈소스 비디오 에뮬레이션
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: ntsc-rs는 단순히 낡은 화면 질감을 덧씌우는 필터가 아니라 NTSC 전송과 VHS 인코딩 방식을 모델링해 아날로그 TV와 비디오테이프 특유의 왜곡을 재현하는 무료 오픈소스 효과다. Rust로 작성됐고 멀티스레드와 SIMD 가속을 활용해 높은 해상도에서도 실시간 처리를 목표로 하며, 독립 실행형 앱과 웹 앱뿐 아니라 주요 영상 편집 도구용 플러그인으로도 제공된다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://ntsc.rs/" rel="noopener noreferrer"&gt;https://ntsc.rs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Ask HN: HN 이용자들은 왜 이렇게 AI에 반대하나요?
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 질문자는 AI가 빠른 실행과 제품 출시를 돕는다는 점을 강조하며, HN에서 AI 코드의 품질과 기술 부채를 비판하는 글이 반복되는 이유를 물었다. 댓글 흐름은 HN이 일방적으로 반AI라기보다 사회 전반처럼 의견이 갈라져 있고, 글 제목과 초기 반응에 따라 찬반 중 한쪽이 더 크게 드러난다는 쪽으로 모였다. 동시에 많은 개발자들은 AI를 유용한 도구로 보면서도, 큰 코드베이스와 장기 유지보수에서는 설계·정확성·책임 문제가 여전히 중요하다고 지적했다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://news.ycombinator.com/item?id=48420827" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=48420827&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;이번 주에는 AI를 단순 생산성 도구로만 보지 말고, 채용·협업·보안·평가 기준까지 함께 점검하는 것이 좋습니다. 에이전트 기반 개발은 저장소 규칙과 관측성부터 정리하고, 의인화 평가나 AI 반감 논쟁은 실제 행동과 장기 유지보수 책임을 분리해 보는 기준을 세워두세요.&lt;/p&gt;




&lt;p&gt;출처: &lt;a href="https://news.hada.io" rel="noopener noreferrer"&gt;GeekNews&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>ai</category>
      <category>llm</category>
      <category>weekly</category>
    </item>
    <item>
      <title>GeekNews Frontend Weekly Deep Dive - 2026-06-08</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:36:15 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-06-08-49p4</link>
      <guid>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-06-08-49p4</guid>
      <description>&lt;p&gt;이번 주 프론트엔드와 웹 운영 이슈는 브라우저 실행 환경과 서버 배포 방식, 사용자 입력 도구, 규제 대응까지 넓게 퍼졌습니다. WASM 포팅과 eBPF 서버처럼 실행 환경을 바꾸는 실험이 눈에 띄었고, UUID 키 선택이나 주거용 프록시 SDK처럼 보이지 않는 인프라 선택의 비용도 함께 드러났습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 거실의 스마트 TV는 AI 스크래핑 경제의 노드
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Bright Data의 SDK는 소비자 앱에 들어가 사용자의 휴대폰이나 스마트 TV를 주거용 프록시 출구로 만들고, 고객의 웹 수집 트래픽을 가정용 IP에서 나가는 것처럼 처리한다. 글은 특히 스마트 TV가 상시 전원, 안정적인 와이파이, 긴 대기 시간, 낮은 감시 가능성 때문에 이런 네트워크에 유리하다고 설명한다. 연구자는 SDK가 공개 설정을 받아 기기 상태를 계속 보고하고 작업을 전달받는 구조와, 일부 환경에서 VPN 기반 관찰을 우회할 수 있는 점을 보안상 핵심 위험으로 짚는다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://blog.includesecurity.com/2026/06/the-smart-tv-in-your-livingroom-is-a-node-in-the-aiscraping-economy/" rel="noopener noreferrer"&gt;https://blog.includesecurity.com/2026/06/the-smart-tv-in-your-livingroom-is-a-node-in-the-aiscraping-economy/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. SQLite에서 UUID 기본 키의 위험성
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: SQLite에서 정수 rowid는 저장 순서와 잘 맞지만, 무작위 UUID를 기본 키로 쓰면 B-tree 중간중간에 삽입이 발생해 재정렬과 읽기·쓰기 비용이 크게 늘어난다. 글의 벤치마크에서는 UUID4를 rowid 없는 테이블의 기본 키로 쓸 때 정수 키보다 삽입이 크게 느려졌고, 프로파일링도 트리 균형 조정 비용 증가를 보여준다. 시간 순서가 있는 UUID7은 훨씬 낫지만 키 크기와 인덱스 비용 때문에 정수 rowid만큼 가볍지는 않다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://andersmurphy.com/2026/06/05/the-perils-of-uuid-primary-keys-in-sqlite.html" rel="noopener noreferrer"&gt;https://andersmurphy.com/2026/06/05/the-perils-of-uuid-primary-keys-in-sqlite.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Pokemon Emerald, WebAssembly로 포팅됨(100k FPS)
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 리버스 엔지니어링된 Pokemon Emerald 기반 프로젝트를 브라우저에서 실행할 수 있게 옮긴 데모로, 화면 안에서 게임과 조작 UI가 바로 로드된다. 방향키와 주요 버튼 매핑을 지원하고 속도 조절도 가능하지만, 사용자 피드백에서는 조작 안내가 더 명확해야 하고 일부 메뉴나 진화 진행에서 멈추는 문제가 보고됐다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://pokeemerald.com/" rel="noopener noreferrer"&gt;https://pokeemerald.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. fork() + exec()를 넘어
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Linux 커널에 제안된 spawn template은 같은 실행 파일을 반복 실행하는 프로그램을 위해 실행 파일 관련 정보를 커널에 캐시해 프로세스 시작 비용을 줄이려는 시도다. 리뷰 과정에서는 실제 병목이 기존 부모 프로세스를 복제하는 단계에 있다는 지적이 나왔고, 현재 제안은 받아들여지기보다 pidfd 기반의 빈 프로세스 생성과 사용자 공간 posix_spawn 구현 논의로 이어질 가능성이 커졌다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://lwn.net/SubscriberLink/1076018/16f01bbbb8e0d1f0/" rel="noopener noreferrer"&gt;https://lwn.net/SubscriberLink/1076018/16f01bbbb8e0d1f0/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Zeroserve: eBPF로 스크립팅할 수 있는 무설정 웹 서버
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: zeroserve는 웹사이트를 하나의 tarball로 묶어 그대로 제공하고, 포함된 eBPF 프로그램을 사용자 공간의 샌드박스 미들웨어처럼 실행해 요청 처리 방식을 결정하게 하는 웹 서버다. 라우팅, 헤더 조작, 인증, 속도 제한, 프록시 같은 동작을 별도 설정 파일 대신 프로그램 하나로 표현하는 것이 핵심이며, 벤치마크에서는 작은 정적 파일과 작은 프록시 응답에서 강하지만 큰 프록시 응답은 nginx가 더 낫다고 설명한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://su3.io/posts/introducing-zeroserve" rel="noopener noreferrer"&gt;https://su3.io/posts/introducing-zeroserve&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. 한국의 포럼/커뮤니티는 이제 모든 이미지를 AI 검열 도구로 검사해야 함
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Privacy Guides의 게시글은 전기통신사업법 관련 규제 변화로 한국의 온라인 커뮤니티와 포럼이 사용자 업로드 이미지와 영상을 AI로 검사해야 하는 상황이 됐다고 전한다. 정부가 필요한 장비를 제공하지 않아 운영자가 고성능 GPU와 검사 시스템을 직접 마련해야 한다는 점, 소규모 커뮤니티의 비용 부담과 표현의 자유 침해 우려가 함께 제기된다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://discuss.privacyguides.net/t/south-korean-online-communities-will-need-to-scan-every-images-with-ai-censorship-tools/38341" rel="noopener noreferrer"&gt;https://discuss.privacyguides.net/t/south-korean-online-communities-will-need-to-scan-every-images-with-ai-censorship-tools/38341&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Mouseless - macOS/Linux/Windows의 키보드 기반 제어
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Mouseless는 화면 좌표를 키보드로 입력해 클릭, 이동, 드래그, 스크롤 같은 마우스 작업을 처리하는 크로스 플랫폼 도구다. 마우스나 트랙패드로 손을 옮기는 시간을 줄이고, 반복 클릭으로 생기는 부담을 낮추는 생산성 및 접근성 용도로 설계됐다. 오버레이 없는 자유 이동 모드도 제공해 기존 운영체제의 키보드 마우스 기능보다 더 빠르고 세밀한 제어를 지향한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://mouseless.click" rel="noopener noreferrer"&gt;https://mouseless.click&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;이번 주에는 새 도구를 바로 도입하기보다 실행 환경과 운영 비용을 먼저 점검하는 편이 좋습니다. UUID·프로세스 생성·eBPF 서버처럼 성능 차이가 구조에서 생기는 항목은 작은 벤치마크로 확인하고, 업로드 검사나 주거용 프록시처럼 정책·보안 리스크가 얽힌 항목은 기술 대응과 사용자 고지를 함께 검토하세요.&lt;/p&gt;




&lt;p&gt;출처: &lt;a href="https://news.hada.io" rel="noopener noreferrer"&gt;GeekNews&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>frontend</category>
      <category>weekly</category>
      <category>deepdive</category>
    </item>
    <item>
      <title>GeekNews AI Weekly Deep Dive - 2026-06-01</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 01 Jun 2026 01:06:35 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-06-01-2cd2</link>
      <guid>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-06-01-2cd2</guid>
      <description>&lt;p&gt;이번 주 AI 이슈는 모델 자체보다 모델을 둘러싼 운영층과 검증 체계가 더 크게 보였습니다. 하네스, 엔지니어링 방어층, 앱 레이어 전략, 로컬 GPU 실험, 환각 인용 사례가 모두 같은 질문으로 이어집니다. AI가 더 많은 일을 하게 될수록 컨텍스트, 비용, 출처, 승인, 관측 가능성을 누가 통제할지가 제품 경쟁력의 중심이 됩니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI 이후의 소프트웨어: 하네스(Harness) 시대의 개막
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Tomasz Tunguz는 고정 워크플로우와 관리형 DB 중심의 SaaS 시대가 저물고, LLM을 실제 업무에 묶어 안전하게 쓰는 하네스가 새 경쟁력이 된다고 본다. 하네스는 컨텍스트와 메모리, 도구 호출, 오케스트레이션, 상태 저장, 샌드박스, 관측성, 비용 최적화 같은 구성요소로 이뤄지며, 모두가 같은 모델을 쓸 수 있는 시대에는 이 운영층을 더 잘 설계하는 팀이 이긴다는 주장이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://tomtunguz.com/harnessing-ai/" rel="noopener noreferrer"&gt;https://tomtunguz.com/harnessing-ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. LLM 시대의 엔지니어링
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Yair Weinberger는 LLM 시대의 병목이 코드 생산이 아니라 인간의 제한된 컨텍스트와 주의력이라고 말하며, 장황한 코드·문서·PR이 다시 LLM의 입력을 오염시키는 악순환을 경계한다. 모델링과 API 계약 같은 구조적 결정은 여전히 사람이 엄격히 맡아야 하고, 대규모 LLM 산출물은 코드 리뷰만으로 막기 어렵기 때문에 린터, LLM 저지, 작은 PR, 좋은 테스트와 eval 같은 자동 방어층이 필요하다고 정리한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://x.com/yairwein/status/2060058912351732137" rel="noopener noreferrer"&gt;https://x.com/yairwein/status/2060058912351732137&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. 노란 벽돌길에서 죽음을 피하는 법 - 앱 레이어는 아직 죽지 않았다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: AI 앱 스타트업은 OpenAI·Anthropic 같은 모델 랩의 정면 경로, 즉 코드 생성·글쓰기·범용 에이전트처럼 모델 성능과 유통망이 곧 제품 우위가 되는 영역을 피해야 한다는 주장이다. 기회는 산업별 워크플로우, 규정 준수, 권한·감사, 레거시 시스템 통합, 사람 승인 단계처럼 모델만으로 해결되지 않는 복잡한 업무 시스템에 있으며, 여기서는 데이터 플라이휠과 운영 지식이 방어력이 된다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.a16z.news/p/avoiding-death-on-the-yellow-brick" rel="noopener noreferrer"&gt;https://www.a16z.news/p/avoiding-death-on-the-yellow-brick&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. £200로 데이터센터 GPU를 게이밍 PC에 넣기
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 저자는 중고 Tesla V100 SXM2와 PCIe 어댑터를 약 200파운드에 구입해 RTX 4080과 함께 장착하고, 총 32GB VRAM으로 Qwen 27B급 로컬 LLM을 약 32 tok/s로 실행했다. 핵심 난관은 서버용 GPU의 소음과 구형 드라이버·CUDA 제약이었고, 팬 PWM 배선과 NixOS 설정으로 해결했지만 따뜻한 재부팅 뒤 GPU가 사라지는 문제는 남았다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://blog.tymscar.com/posts/v100localllm/" rel="noopener noreferrer"&gt;https://blog.tymscar.com/posts/v100localllm/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. EY Canada가 사이버보안 보고서를 냈고 인용 대부분이 환각이었다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: GPTZero는 EY Canada의 로열티 프로그램 사이버보안 보고서 인용을 추적한 결과, 다수의 URL이 404이거나 실제 문서와 맞지 않고 일부 Gartner·McKinsey 보고서는 존재하지 않는다고 밝혔다. 같은 2,000억 달러 수치가 전체 시장 규모와 미사용 포인트 가치라는 서로 다른 의미로 쓰이는 등 내부 모순도 있었고, 이런 오류가 유명 컨설팅사의 보고서를 통해 검색과 AI 리서치 도구에 재유통될 위험을 지적했다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://gptzero.me/investigations/ey" rel="noopener noreferrer"&gt;https://gptzero.me/investigations/ey&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Show GN: Nomad AI - 나만의 온디바이스 여행 도우미
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Nomad AI는 안드로이드 기기에서 직접 실행되는 오프라인 여행용 AI 도우미로, 네트워크가 없어도 여행 대화, 메뉴 OCR 번역, 실시간 번역, 대면 통역, 음성 응답을 지원한다. Gemma 계열 모델과 Supertonic 기반 음성 기능을 사용하며, 대화와 번역, 이미지 인식 데이터를 서버로 보내지 않고 로컬에서 처리한다는 점을 핵심 가치로 내세운다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://nomad-ai-android.github.io" rel="noopener noreferrer"&gt;https://nomad-ai-android.github.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. OpenRouter, 1억 1,300만 달러 Series B 유치
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: OpenRouter는 Alphabet의 CapitalG 주도로 1억 1,300만 달러 규모의 Series B 투자를 유치했고, NVIDIA, ServiceNow, MongoDB, Snowflake, Databricks 계열 벤처와 기존 투자자들이 참여했다. 회사는 최근 6개월 사이 주간 처리량이 5조 토큰에서 25조 토큰으로 늘었다고 밝히며, 멀티모달 추론, 엔터프라이즈 제어, 지능형 라우팅을 강화해 멀티모델 AI 인프라 계층을 키우겠다고 설명했다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://openrouter.ai/announcements/series-b" rel="noopener noreferrer"&gt;https://openrouter.ai/announcements/series-b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;이번 주에는 모델을 바꾸기 전에 하네스와 검증 절차부터 점검해 보세요. 에이전트나 LLM 산출물에는 작은 PR, 테스트, eval, 출처 검증을 붙이고, 앱 레이어 전략은 모델 랩이 쉽게 흡수할 수 없는 도메인 워크플로우와 권한·감사 요구에서 출발하는 편이 좋습니다. 로컬 추론 실험도 비용 절감만 보지 말고 드라이버, 냉각, 복구 가능성까지 운영 기준에 넣어야 합니다.&lt;/p&gt;




&lt;p&gt;출처: &lt;a href="https://news.hada.io" rel="noopener noreferrer"&gt;GeekNews&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>ai</category>
      <category>llm</category>
      <category>weekly</category>
    </item>
    <item>
      <title>GeekNews Frontend Weekly Deep Dive - 2026-06-01</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 01 Jun 2026 01:06:24 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-06-01-lf3</link>
      <guid>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-06-01-lf3</guid>
      <description>&lt;p&gt;이번 주 프론트엔드 흐름은 빌드 도구의 내부 구조, 플랫폼 디자인 기준, 웹 API 운영 방식, 사용자 경험의 방해 요소, 패키지 생태계의 AI 제출 정책까지 넓게 이어졌습니다. 새 도구를 빠르게 받아들이는 것보다 팀이 이해하고 검증할 수 있는 경계와 사용자가 방해받지 않는 인터페이스를 만드는 일이 더 중요해졌습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Zig: 빌드 시스템 재작업
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Zig의 빌드 시스템은 build.zig를 해석해 빌드 그래프를 구성하는 단계와 실제 빌드를 실행하는 단계를 더 분명히 나누는 방향으로 재작업되고 있다. 설정 결과를 캐시하고 실행 쪽을 최적화된 프로세스로 돌리면서 반복 빌드와 도움말 출력 같은 일상적인 작업이 빨라지지만, 빌드 스크립트가 인자를 직접 관찰하던 일부 패턴은 조정이 필요하다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://ziglang.org/devlog/2026/#2026-05-26" rel="noopener noreferrer"&gt;https://ziglang.org/devlog/2026/#2026-05-26&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. 2026 Apple Design Award 파이널리스트 발표
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Apple은 2026 Apple Design Awards 파이널리스트를 공개하며 앱과 게임을 Delight and Fun, Inclusivity, Innovation, Interaction, Social Impact, Visuals and Graphics 등 6개 부문으로 나눠 소개했다. 후보들은 접근성, 인터랙션 완성도, 시각적 표현, Apple 플랫폼 기술 활용을 기준으로 선정됐고, SwiftUI, Foundation Models, visionOS, Apple Arcade를 적극적으로 활용한 사례가 눈에 띈다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://developer.apple.com/design/awards/" rel="noopener noreferrer"&gt;https://developer.apple.com/design/awards/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. 공개 웹 API는 어떻게 버전 관리하나요?
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Lobsters 토론은 공개 웹 API에서 경로 버전과 별도 의미론적 버전을 함께 쓰면 계약이 두 곳으로 나뉘어 혼란이 생길 수 있다는 질문에서 출발한다. 댓글에서는 경로 버전이 깨지는 변경을 격리해 기존 클라이언트를 보호한다는 장점과, 실제 서비스형 API에서는 버전 번호보다 하위 호환성 유지, 점진적 추가, 종료 공지가 더 중요하다는 의견이 함께 제시됐다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://lobste.rs/s/g9u6b7/how_do_you_version_public_web_apis" rel="noopener noreferrer"&gt;https://lobste.rs/s/g9u6b7/how_do_you_version_public_web_apis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Dickover란 무엇인가?
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: John Gruber가 말한 dickover는 본문 위를 덮는 모달이나 커튼으로 쿠키 동의, 뉴스레터 가입, 앱 설치 같은 행동을 요구해 사용자의 흐름을 끊는 UX 패턴을 가리킨다. 그는 이런 장치가 사용자가 이미 주고 있는 관심을 빼앗는 방식이라고 비판하며, 실제 작업에 필요한 로그인·결제 모달이나 일부 영역만 차지하는 알림과는 구분한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://daringfireball.net/2026/05/what_is_a_dickover" rel="noopener noreferrer"&gt;https://daringfireball.net/2026/05/what_is_a_dickover&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Flathub, LLM 기반 제출을 허용하지 않음
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Flathub은 제출 PR과 앱 패키징 과정에서 AI나 LLM이 만든 manifest, metadata, patch, build script, 자동화된 PR을 제한하는 정책을 강화했다. 저노력 생성 제출이 늘면서 자원봉사 리뷰어의 검토 부담과 갈등이 커진 것이 배경이며, 성숙하게 관리되는 프로젝트에는 예외 여지를 두되 기존 게시 앱에는 소급 적용하지 않는다는 입장이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://social.treehouse.systems/@barthalion/116657011366876079" rel="noopener noreferrer"&gt;https://social.treehouse.systems/@barthalion/116657011366876079&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. AI는 프런트엔드의 잃어버린 10년을 반복하게 하는가?
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 글은 AI 코딩이 프로그래밍을 탈숙련화하는 모습이 지난 10년간 프레임워크와 툴링이 프런트엔드 전문성을 약화시킨 흐름과 닮았다고 본다. 다만 이를 단순한 퇴보로만 보지는 않고, 더 높은 추상화를 얻는 대신 그 추상화가 새는 순간 코드를 이해하고 품질과 사용자를 책임질 사람이 여전히 필요하다고 정리한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://mastrojs.github.io/blog/2026-05-23-is-AI-causing-a-repeat-of-frontends-lost-decade/" rel="noopener noreferrer"&gt;https://mastrojs.github.io/blog/2026-05-23-is-AI-causing-a-repeat-of-frontends-lost-decade/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;이번 주에는 빌드와 배포 자동화에서 캐시·버전·검토 책임이 어디에 놓이는지 점검해 보세요. 동시에 웹 UI에서는 사용자 흐름을 가리는 장치와 AI가 만든 변경을 그대로 통과시키는 절차를 줄이고, 실제 사용성과 유지보수성을 기준으로 작은 개선부터 적용하는 편이 좋습니다.&lt;/p&gt;




&lt;p&gt;출처: &lt;a href="https://news.hada.io" rel="noopener noreferrer"&gt;GeekNews&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>frontend</category>
      <category>weekly</category>
      <category>deepdive</category>
    </item>
    <item>
      <title>GeekNews AI Weekly Deep Dive - 2026-05-25</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 25 May 2026 00:33:54 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-05-25-bb8</link>
      <guid>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-05-25-bb8</guid>
      <description>&lt;p&gt;이번 주 AI/테크 흐름은 비용, 운영 통제, 공급망 재편이 핵심입니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 메모리는 AI 칩 부품 비용의 거의 3분의 2까지 커졌다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: AI 가속기 원가에서 HBM 비중이 빠르게 커지며, 2025년 말에는 주요 설계사 칩 부품 비용의 60%를 넘는 수준으로 추정된다. 로직 다이와 패키징보다 메모리 지출 증가가 훨씬 크고, 공급 부족과 가격 상승이 이어지면 2026년 데이터센터 투자 부담도 더 커질 가능성이 높다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://epoch.ai/data-insights/ai-chip-component-cost-shares" rel="noopener noreferrer"&gt;https://epoch.ai/data-insights/ai-chip-component-cost-shares&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. 호주 4일 근무제 연구 데이터, 생산성 향상 보여줘
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 호주 15개 기업의 100:80:100 실험에서는 임금은 유지하고 근무시간을 줄였지만 생산성 하락을 보고한 곳이 없었다. 핵심은 단순히 하루를 빼는 것이 아니라 회의, 반복 업무, 낮은 가치의 일을 줄여 업무 방식을 다시 설계한 데 있었고, 번아웃 감소도 중요한 성과로 나타났다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://scienceaim.com/australia-just-proved-the-four-day-work-week-works-here-is-what-the-data-actually-says/" rel="noopener noreferrer"&gt;https://scienceaim.com/australia-just-proved-the-four-day-work-week-works-here-is-what-the-data-actually-says/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. DeepSeek Reasonix - 높은 캐싱과 낮은 비용의 DeepSeek 네이티브 코딩 에이전트
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Reasonix는 DeepSeek API의 접두사 캐싱을 최대한 활용하도록 설계된 터미널 기반 코딩 에이전트다. 대화 흐름을 append-only 구조로 유지하고 도구 호출 복구, 추론 수집, MCP, 샌드박스와 계획 승인 흐름을 붙여 긴 코딩 세션의 비용을 낮추는 데 초점을 맞췄다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://esengine.github.io/DeepSeek-Reasonix/" rel="noopener noreferrer"&gt;https://esengine.github.io/DeepSeek-Reasonix/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Microsoft 보고서, AI가 인간 직원 고용보다 더 비싸다고 밝혀
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Microsoft와 Uber 같은 대기업 내부에서 AI 코딩 도구 사용이 빠르게 늘면서, 토큰 비용과 라이선스 비용이 예상보다 큰 운영비로 떠오르고 있다. 문제는 토큰 단가 하락 자체보다 에이전트형 사용량이 훨씬 더 빠르게 늘 수 있다는 점이며, 사용량을 생산성 지표처럼 장려하는 조직 문화도 비용 폭증을 키운다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://fortune.com/2026/05/22/microsoft-ai-cost-problem-tokens-agents/" rel="noopener noreferrer"&gt;https://fortune.com/2026/05/22/microsoft-ai-cost-problem-tokens-agents/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. 모든 카드에서 병렬 에이전트를 실행하는 오픈소스 Kanban 데스크톱 앱
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: KanBots는 칸반 카드마다 Claude Code나 Codex를 별도 git worktree에서 실행하고, 진행 상태와 비용, 결정 요청을 보드에 표시하는 로컬 우선 데스크톱 앱이다. 자동 실행 모드는 여러 페르소나가 작업을 나누고 검토하도록 돕지만, 병렬 에이전트 결과를 사람이 어떻게 검증하고 통제할지가 실제 도입의 핵심 과제로 남는다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.kanbots.dev/" rel="noopener noreferrer"&gt;https://www.kanbots.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. 이탈리아, Airbus A330 급유기로 전환
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이탈리아는 기존 Boeing KC-46 선택을 접고 Airbus A330 MRTT 6대를 도입하기로 하면서 공중급유와 전략 수송 전력을 유럽 공급망 쪽으로 옮겼다. 두 기종 모두 NATO 운용에는 맞지만, 이번 결정은 정비와 훈련, 장기 지원의 중심이 미국보다 유럽 항공우주 생태계에 가까워졌다는 의미가 크다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.euronews.com/my-europe/2026/05/21/italy-moves-to-airbus-a330-tankers-in-major-nato-aligned-shift" rel="noopener noreferrer"&gt;https://www.euronews.com/my-europe/2026/05/21/italy-moves-to-airbus-a330-tankers-in-major-nato-aligned-shift&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. 한컴, LG ‘챗엑사원’에 AI 에이전트 공급
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 한컴은 자체 AI 에이전트를 LG AI연구원의 챗엑사원 플랫폼에 결합해 공공과 민간 시장을 함께 공략하기로 했다. 이번 협력은 한컴의 업무 자동화 역량과 LG의 생성형 AI 서비스 인프라를 묶어 통합 솔루션으로 확장하려는 움직임으로 볼 수 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://showroom.exaone.ai/" rel="noopener noreferrer"&gt;https://showroom.exaone.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;AI는 더 넓게 쓰이고 있지만, 이제 관심은 성능 과시보다 누가 비용과 검증, 인프라 의존성을 감당하느냐로 옮겨가고 있습니다.&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>ai</category>
      <category>llm</category>
      <category>weekly</category>
    </item>
    <item>
      <title>GeekNews Frontend Weekly Deep Dive - 2026-05-25</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 25 May 2026 00:33:40 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-05-25-1pk6</link>
      <guid>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-05-25-1pk6</guid>
      <description>&lt;p&gt;이번 프론트엔드 묶음은 브라우저와 운영체제가 이미 제공하는 기본값을 어디까지 믿고, 어디서부터 개인화하거나 다시 만들어야 하는지를 다룬다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. omarchy는 배포판이 아니다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Omarchy를 둘러싼 논쟁의 핵심은 배포판이라는 이름보다, Arch 위에 개인 취향이 강한 설정과 상용 서비스 연결을 얹은 구성이 과도하게 포장되고 후원받는다는 데 있다. 독립적인 패키지 유지보수나 배포 기반이 약한 만큼, 리눅스 입문자에게는 실제 배포판을 고르고 필요한 설정을 직접 이해하는 편이 더 낫다는 지적이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://abyss.fish/your_dotfiles_are_not_a_distro" rel="noopener noreferrer"&gt;https://abyss.fish/your_dotfiles_are_not_a_distro&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. 내 writerdeck 을 공개합니다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 오래된 노트북에 콘솔 전용 Debian을 설치해 브라우저와 데스크톱 환경을 걷어내고, 글쓰기만 빠르게 시작할 수 있는 전용 장치로 바꾼 사례다. 핵심은 새 하드웨어나 복잡한 생산성 도구가 아니라, 네트워크·편집기·동기화만 최소한으로 남겨 산만함을 줄이는 의도적인 작업 환경을 만드는 데 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://veronicaexplains.net/my-first-writerdeck/" rel="noopener noreferrer"&gt;https://veronicaexplains.net/my-first-writerdeck/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. &amp;lt;dl&amp;gt;에 관하여 (2021)
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: HTML의 설명 목록은 용어집뿐 아니라 이름과 값이 짝을 이루는 UI를 의미 있게 표현하는 데 적합하다. 단순한 div 묶음으로도 화면은 만들 수 있지만, dl·dt·dd를 쓰면 보조 기술이 목록의 구조와 위치를 파악할 수 있어 탐색성이 좋아진다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://benmyers.dev/blog/on-the-dl/" rel="noopener noreferrer"&gt;https://benmyers.dev/blog/on-the-dl/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Minecraft 모드로 구현된 Wayland 컴포지터
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: waylandcraft는 Minecraft 월드 안에서 리눅스 앱 창을 띄우고 조작할 수 있게 만든 Fabric 클라이언트 모드다. 실제 Wayland 컴포지터 기능을 게임 안으로 가져온 실험적 프로젝트로, 창 간 드래그 앤 드롭이나 HUD 고정 같은 기능을 제공하지만 실행 환경은 Linux로 제한된다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://modrinth.com/project/9yAfrPwH" rel="noopener noreferrer"&gt;https://modrinth.com/project/9yAfrPwH&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Electrobun 2.0은 Rust 재작성으로 인해 Bun에서 분리될 예정
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Electrobun은 Bun의 Rust 재작성과 그 검증 과정에 대한 신뢰 문제를 이유로, 2.0에서 Bun 의존을 줄이는 방향으로 움직이고 있다. Rust 자체를 거부하는 결정은 아니며, 오히려 Rust·Zig·Go를 일급 지원 대상으로 두고 런타임 기반을 더 독립적으로 가져가려는 변화에 가깝다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://twitter.com/YoavCodes/status/2058064720553222567" rel="noopener noreferrer"&gt;https://twitter.com/YoavCodes/status/2058064720553222567&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. 직접 만들지 말라 …
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 웹 UI에서도 브라우저가 이미 잘 제공하는 스크롤, 링크 이동, 비밀번호 입력, 날짜 입력 같은 기본 동작을 성급히 다시 구현하면 사용자가 익숙한 조작 방식을 잃기 쉽다. 특수한 앱에서는 커스텀 동작이 필요할 수 있지만, 일반적인 업무용 웹에서는 플랫폼 기본 기능을 유지하는 쪽이 접근성·호환성·학습 비용 면에서 더 안정적이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://susam.net/do-not-roll-your-own.html" rel="noopener noreferrer"&gt;https://susam.net/do-not-roll-your-own.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. uv는 훌륭하지만 패키지 관리 UX는 엉망이다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: uv는 속도와 Python 실행 환경 관리에서는 강력하지만, 프로젝트 유지보수 단계에서 오래된 패키지를 찾고 일부만 갱신하는 흐름은 아직 덜 직관적이라는 비판을 받는다. 특히 애플리케이션에서는 상한 없는 버전 제약과 장황한 업그레이드 명령이 부담이 되며, 별도의 outdated·upgrade UX와 더 안전한 기본 제약이 필요하다는 주장이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.loopwerk.io/articles/2026/uv-ux-mess/" rel="noopener noreferrer"&gt;https://www.loopwerk.io/articles/2026/uv-ux-mess/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;공통된 결론은 단순하다. 새 도구나 커스텀 구현이 매력적이어도, 유지보수성과 사용자 경험을 해치지 않는지 먼저 따져야 한다.&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>frontend</category>
      <category>weekly</category>
      <category>deepdive</category>
    </item>
    <item>
      <title>Synology NAS에 OpenClaw 설치하기</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Wed, 20 May 2026 04:12:45 +0000</pubDate>
      <link>https://dev.to/ageofclick/synology-nase-openclaw-seolcihagi-1bmf</link>
      <guid>https://dev.to/ageofclick/synology-nase-openclaw-seolcihagi-1bmf</guid>
      <description>&lt;h2&gt;
  
  
  들어가며
&lt;/h2&gt;

&lt;p&gt;이번 글에서는 Synology NAS에 OpenClaw를 &lt;strong&gt;Docker Compose 기반으로 신규 설치&lt;/strong&gt;하는 과정을 정리한다.&lt;/p&gt;

&lt;p&gt;Synology DSM 환경은 일반적인 Ubuntu 서버와 다르다. NAS에 직접 Node.js/npm 기반으로 OpenClaw를 설치할 수도 있지만, 장기 운영 관점에서는 Docker Compose 기반 구성이 더 깔끔하다.&lt;/p&gt;

&lt;p&gt;Docker Compose로 구성하면 다음 장점이 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw 실행 환경을 Synology host와 분리할 수 있음&lt;/li&gt;
&lt;li&gt;gateway와 CLI 실행 환경을 일관되게 유지할 수 있음&lt;/li&gt;
&lt;li&gt;재부팅 후 자동 실행을 &lt;code&gt;restart: unless-stopped&lt;/code&gt;로 처리할 수 있음&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.openclaw&lt;/code&gt; 설정과 workspace를 volume으로 분리해 보존할 수 있음&lt;/li&gt;
&lt;li&gt;GitHub CLI, ripgrep, jq 같은 코딩 작업용 도구를 이미지에 함께 포함할 수 있음&lt;/li&gt;
&lt;li&gt;Synology 터미널의 TTY/리치 출력 문제를 우회하기 쉬움&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  최종 구성
&lt;/h2&gt;

&lt;p&gt;최종 디렉터리 구조는 다음과 같이 잡는다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/volume1/docker/openclaw
├── docker-compose.yml
├── Dockerfile
├── .env
└── .openclaw/
    ├── workspace/
    ├── logs/
    └── cron/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;컨테이너 내부에서는 OpenClaw 설정 경로를 다음처럼 사용한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/node/.openclaw
/home/node/.openclaw/workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;즉, NAS host의 실제 경로는 다음이지만,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/volume1/docker/openclaw/.openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;컨테이너 내부에서는 다음 경로로 보이게 한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/node/.openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 구조의 핵심은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw 설정과 workspace는 NAS의 &lt;code&gt;/volume1/docker/openclaw/.openclaw&lt;/code&gt;에 보존&lt;/li&gt;
&lt;li&gt;컨테이너는 언제든 삭제/재생성 가능&lt;/li&gt;
&lt;li&gt;OpenClaw CLI는 host에 직접 설치하지 않고 &lt;code&gt;openclaw-cli&lt;/code&gt; 컨테이너로 실행&lt;/li&gt;
&lt;li&gt;OpenClaw gateway는 &lt;code&gt;openclaw-gateway&lt;/code&gt; 컨테이너로 상시 실행&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  사전 준비
&lt;/h2&gt;

&lt;p&gt;Synology NAS에는 DSM의 &lt;strong&gt;Container Manager&lt;/strong&gt;가 설치되어 있어야 한다.&lt;/p&gt;

&lt;p&gt;SSH 터미널에서 Docker와 Compose가 정상 동작하는지 확인한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker version
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Synology에서는 일반 사용자 계정이 Docker daemon socket에 직접 접근하지 못하는 경우가 많다.&lt;/p&gt;

&lt;p&gt;확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-al&lt;/span&gt; /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;srw-rw---- 1 root root 0 docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 경우 일반 사용자로는 &lt;code&gt;docker pull&lt;/code&gt; 같은 명령이 실패한다.&lt;/p&gt;

&lt;p&gt;따라서 이 글에서는 모든 Docker 명령을 다음처럼 &lt;code&gt;sudo&lt;/code&gt; 기준으로 실행한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  설치 디렉터리 생성
&lt;/h2&gt;

&lt;p&gt;OpenClaw Compose 프로젝트용 디렉터리를 만든다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /volume1/docker/openclaw
&lt;span class="nb"&gt;cd&lt;/span&gt; /volume1/docker/openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenClaw 설정과 workspace를 저장할 &lt;code&gt;.openclaw&lt;/code&gt; 디렉터리도 미리 만든다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /volume1/docker/openclaw/.openclaw
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /volume1/docker/openclaw/.openclaw/workspace
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /volume1/docker/openclaw/.openclaw/logs
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /volume1/docker/openclaw/.openclaw/cron
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  권한 정리
&lt;/h2&gt;

&lt;p&gt;OpenClaw Docker 이미지는 컨테이너 내부에서 &lt;code&gt;node&lt;/code&gt; 사용자로 실행된다. 일반적으로 이 사용자의 UID는 &lt;code&gt;1000&lt;/code&gt;이다.&lt;/p&gt;

&lt;p&gt;따라서 host의 &lt;code&gt;.openclaw&lt;/code&gt; 디렉터리를 컨테이너 내부 사용자가 쓸 수 있도록 권한을 맞춘다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 1000:1000 /volume1/docker/openclaw/.openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;권한이 맞지 않으면 다음과 같은 에러가 발생할 수 있다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EACCES: permission denied, open '/home/node/.openclaw/logs/config-health.json'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  커스텀 Dockerfile 작성
&lt;/h2&gt;

&lt;p&gt;OpenClaw 기본 이미지만으로도 gateway 실행은 가능하다. 하지만 코딩 에이전트 용도로도 사용할 계획이라면 &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;ripgrep&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;를 함께 넣어두는 것이 편하다.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/volume1/docker/openclaw/Dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ghcr.io/openclaw/openclaw:latest&lt;/span&gt;

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; root&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; gh ripgrep jq &lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;각 도구의 용도는 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gh&lt;/code&gt;: GitHub CLI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripgrep&lt;/code&gt;: 빠른 코드 검색용 &lt;code&gt;rg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jq&lt;/code&gt;: JSON 출력 확인 및 가공&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;.env&lt;/code&gt; 작성
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/volume1/docker/openclaw/.env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENCLAW_CONFIG_DIR=/volume1/docker/openclaw/.openclaw
OPENCLAW_WORKSPACE_DIR=/volume1/docker/openclaw/.openclaw/workspace

OPENCLAW_GATEWAY_PORT=18789
OPENCLAW_TZ=Asia/Seoul

# GitHub CLI 또는 GitHub Copilot 연동이 필요할 경우 입력
GH_TOKEN=
GITHUB_TOKEN=
COPILOT_GITHUB_TOKEN=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;에는 GitHub token, Copilot token 같은 민감정보가 들어갈 수 있으므로 권한을 제한한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /volume1/docker/openclaw/.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  docker-compose.yml 작성
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/volume1/docker/openclaw/docker-compose.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openclaw-gateway&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local/openclaw-gh:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openclaw-gateway&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;HOME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_HOME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node&lt;/span&gt;
      &lt;span class="na"&gt;TERM&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xterm-256color&lt;/span&gt;

      &lt;span class="na"&gt;OPENCLAW_STATE_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_CONFIG_PATH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw/openclaw.json&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_CONFIG_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_WORKSPACE_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw/workspace&lt;/span&gt;

      &lt;span class="na"&gt;OPENCLAW_GATEWAY_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_GATEWAY_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_ALLOW_INSECURE_PRIVATE_WS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS:-}&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_DISABLE_BONJOUR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_DISABLE_BONJOUR:-}&lt;/span&gt;

      &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GH_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GITHUB_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;COPILOT_GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${COPILOT_GITHUB_TOKEN:-}&lt;/span&gt;

      &lt;span class="na"&gt;TZ&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_TZ:-Asia/Seoul}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:${OPENCLAW_GATEWAY_PORT:-18789}:18789"&lt;/span&gt;
    &lt;span class="na"&gt;extra_hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host.docker.internal:host-gateway"&lt;/span&gt;
    &lt;span class="na"&gt;cap_drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NET_RAW&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NET_ADMIN&lt;/span&gt;
    &lt;span class="na"&gt;security_opt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;no-new-privileges:true&lt;/span&gt;
    &lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dist/index.js"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gateway"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lan"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;18789"&lt;/span&gt;
      &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-e"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fetch('http://127.0.0.1:18789/healthz').then((r)=&amp;gt;process.exit(r.ok?0:1)).catch(()=&amp;gt;process.exit(1))"&lt;/span&gt;
        &lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20s&lt;/span&gt;

  &lt;span class="na"&gt;openclaw-cli&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local/openclaw-gh:latest&lt;/span&gt;
    &lt;span class="na"&gt;network_mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service:openclaw-gateway"&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;HOME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_HOME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node&lt;/span&gt;
      &lt;span class="na"&gt;TERM&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xterm-256color&lt;/span&gt;

      &lt;span class="na"&gt;OPENCLAW_STATE_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_CONFIG_PATH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw/openclaw.json&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_CONFIG_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_WORKSPACE_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw/workspace&lt;/span&gt;

      &lt;span class="na"&gt;OPENCLAW_GATEWAY_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_GATEWAY_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;OPENCLAW_ALLOW_INSECURE_PRIVATE_WS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS:-}&lt;/span&gt;

      &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GH_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GITHUB_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;COPILOT_GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${COPILOT_GITHUB_TOKEN:-}&lt;/span&gt;

      &lt;span class="na"&gt;BROWSER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo&lt;/span&gt;
      &lt;span class="na"&gt;TZ&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_TZ:-Asia/Seoul}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace&lt;/span&gt;
    &lt;span class="na"&gt;cap_drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NET_RAW&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NET_ADMIN&lt;/span&gt;
    &lt;span class="na"&gt;security_opt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;no-new-privileges:true&lt;/span&gt;
    &lt;span class="na"&gt;stdin_open&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dist/index.js"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;openclaw-gateway&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;여기서 중요한 점은 두 가지다.&lt;/p&gt;

&lt;p&gt;첫째, &lt;code&gt;.env&lt;/code&gt;의 &lt;code&gt;OPENCLAW_CONFIG_DIR&lt;/code&gt;와 &lt;code&gt;OPENCLAW_WORKSPACE_DIR&lt;/code&gt;는 &lt;strong&gt;NAS host 경로&lt;/strong&gt;다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENCLAW_CONFIG_DIR=/volume1/docker/openclaw/.openclaw
OPENCLAW_WORKSPACE_DIR=/volume1/docker/openclaw/.openclaw/workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;둘째, compose의 &lt;code&gt;environment&lt;/code&gt; 안에 있는 &lt;code&gt;OPENCLAW_CONFIG_DIR&lt;/code&gt;와 &lt;code&gt;OPENCLAW_WORKSPACE_DIR&lt;/code&gt;는 &lt;strong&gt;컨테이너 내부 경로&lt;/strong&gt;다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;OPENCLAW_CONFIG_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw&lt;/span&gt;
&lt;span class="na"&gt;OPENCLAW_WORKSPACE_DIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/node/.openclaw/workspace&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;둘을 혼동하면 컨테이너 안에서 host 경로를 만들려고 하거나, permission error가 발생할 수 있다.&lt;/p&gt;




&lt;h2&gt;
  
  
  bridge 모드로 운영하는 이유
&lt;/h2&gt;

&lt;p&gt;이 compose 파일은 Docker bridge 모드를 기준으로 한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:18789:18789"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 설정은 OpenClaw gateway를 NAS의 &lt;code&gt;127.0.0.1:18789&lt;/code&gt;에만 노출한다.&lt;/p&gt;

&lt;p&gt;즉, 같은 내부망에 있는 다른 기기에서 직접 &lt;code&gt;http://NAS_IP:18789&lt;/code&gt;로 접근할 수 없고, SSH 터널을 통해서만 접근한다.&lt;/p&gt;

&lt;p&gt;이 방식의 장점은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gateway를 외부 네트워크에 직접 노출하지 않음&lt;/li&gt;
&lt;li&gt;기존 SSH 터널 접속 방식과 잘 맞음&lt;/li&gt;
&lt;li&gt;Synology 방화벽과 별개로 노출 범위를 줄일 수 있음&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  왜 gateway bind는 &lt;code&gt;lan&lt;/code&gt;인가
&lt;/h2&gt;

&lt;p&gt;처음에는 gateway를 &lt;code&gt;loopback&lt;/code&gt;으로 두는 것이 더 안전해 보인다.&lt;/p&gt;

&lt;p&gt;하지만 Docker bridge 모드에서는 컨테이너 내부의 &lt;code&gt;loopback&lt;/code&gt;은 NAS host의 loopback이 아니라 &lt;strong&gt;컨테이너 자기 자신의 loopback&lt;/strong&gt;이다.&lt;/p&gt;

&lt;p&gt;따라서 host의 published port를 통해 컨테이너 gateway에 접근하려면, 컨테이너 내부 OpenClaw는 &lt;code&gt;loopback&lt;/code&gt;이 아니라 &lt;code&gt;lan&lt;/code&gt;으로 bind하는 것이 안전하다.&lt;/p&gt;

&lt;p&gt;compose에서는 다음처럼 설정했다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dist/index.js"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gateway"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lan"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;18789"&lt;/span&gt;
  &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;host 쪽 포트는 여전히 &lt;code&gt;127.0.0.1:18789&lt;/code&gt;에만 열어두기 때문에 외부 노출 범위는 제한된다.&lt;/p&gt;




&lt;h2&gt;
  
  
  커스텀 이미지 빌드
&lt;/h2&gt;

&lt;p&gt;Compose 프로젝트 폴더로 이동한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /volume1/docker/openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;커스텀 이미지를 빌드한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;캐시 없이 다시 빌드하려면 다음 명령을 사용한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose build &lt;span class="nt"&gt;--no-cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  OpenClaw gateway 실행
&lt;/h2&gt;

&lt;p&gt;gateway를 실행한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;빌드와 실행을 한 번에 하려면 다음 명령을 사용한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;상태 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;로그 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  health check
&lt;/h2&gt;

&lt;p&gt;NAS host에서 gateway health check를 확인한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; http://127.0.0.1:18789/healthz
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; http://127.0.0.1:18789/readyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;정상이라면 HTTP 응답이 반환된다.&lt;/p&gt;




&lt;h2&gt;
  
  
  SSH 터널로 대시보드 접속
&lt;/h2&gt;

&lt;p&gt;이 구성에서는 gateway가 NAS의 &lt;code&gt;127.0.0.1:18789&lt;/code&gt;에만 노출되어 있으므로, 외부 기기에서는 SSH 터널을 통해 접속한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 18789:127.0.0.1:18789 agent@&amp;lt;NAS_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;그 다음 브라우저에서 접속한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:18789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 방식은 브라우저의 localhost secure context 조건을 만족시키기 쉽고, OpenClaw gateway를 내부망에 직접 노출하지 않아도 된다.&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenClaw CLI 실행 방식
&lt;/h2&gt;

&lt;p&gt;Docker Compose 구조에서는 host에 &lt;code&gt;openclaw&lt;/code&gt; CLI를 직접 설치하지 않는다. 대신 &lt;code&gt;openclaw-cli&lt;/code&gt; 서비스를 통해 실행한다.&lt;/p&gt;

&lt;p&gt;버전 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;상태 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli status &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;doctor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;모델 상태 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli models status &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cron 목록 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli cron list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;code&gt;-T&lt;/code&gt; 옵션을 언제 쓰고 언제 빼야 하나
&lt;/h2&gt;

&lt;p&gt;Docker Compose에서 &lt;code&gt;-T&lt;/code&gt;는 pseudo-TTY 할당을 끄는 옵션이다.&lt;/p&gt;

&lt;p&gt;Synology 터미널에서 리치 출력이 불안정하거나, JSON 출력만 확인할 때는 &lt;code&gt;-T&lt;/code&gt;를 붙이는 편이 안정적이다.&lt;/p&gt;

&lt;p&gt;예:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli status &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;하지만 로그인, wizard, device auth처럼 interactive TTY가 필요한 명령에는 &lt;code&gt;-T&lt;/code&gt;를 붙이면 안 된다.&lt;/p&gt;

&lt;p&gt;잘못된 예:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli models auth login &lt;span class="nt"&gt;--provider&lt;/span&gt; github-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 경우 다음 에러가 날 수 있다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models auth login requires an interactive TTY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;올바른 예:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli models auth login-github-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;정리하면 다음과 같다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;상태 확인, doctor, JSON 출력 → -T 사용
로그인, wizard, device auth → -T 제거
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  컨테이너 내부 shell 접속
&lt;/h2&gt;

&lt;p&gt;CLI 컨테이너 shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; sh openclaw-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;실행 중인 gateway 컨테이너 shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;openclaw-gateway sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;명령만 실행:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; sh openclaw-cli &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'pwd &amp;amp;&amp;amp; ls -al'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;설치한 도구 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; sh openclaw-cli &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'gh --version &amp;amp;&amp;amp; rg --version &amp;amp;&amp;amp; jq --version'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  GitHub CLI 토큰 설정
&lt;/h2&gt;

&lt;p&gt;컨테이너 안에서 &lt;code&gt;gh&lt;/code&gt;를 사용하려면 GitHub token을 &lt;code&gt;.env&lt;/code&gt;에 넣는다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GH_TOKEN=github_pat_xxxxxxxxxxxxxxxxx
GITHUB_TOKEN=github_pat_xxxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; 수정 후 gateway를 재시작한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose restart openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;컨테이너 안에서 gh 인증 상태 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; gh openclaw-cli auth status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;repo 접근 확인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; gh openclaw-cli repo list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;에는 민감정보가 들어가므로 공개 저장소에 올리면 안 된다.&lt;/p&gt;




&lt;h2&gt;
  
  
  자주 쓰는 명령어
&lt;/h2&gt;

&lt;h3&gt;
  
  
  프로젝트 폴더 이동
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /volume1/docker/openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  이미지 빌드
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  캐시 없이 빌드
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose build &lt;span class="nt"&gt;--no-cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  gateway 실행
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  빌드 포함 실행
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  gateway 로그 확인
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  gateway 재시작
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose restart openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  중지 및 컨테이너 제거
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  상태 JSON 확인
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli status &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  doctor 실행
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  shell 접속
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; sh openclaw-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  설치 도구 확인
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; sh openclaw-cli &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'gh --version &amp;amp;&amp;amp; rg --version &amp;amp;&amp;amp; jq --version'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  업데이트
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose pull
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose build &lt;span class="nt"&gt;--no-cache&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose down
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; openclaw-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  자주 만난 에러와 해결
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;no configuration file provided: not found&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;no configuration file provided: not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;원인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose.yml이 없는 디렉터리에서 docker compose 실행
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;해결:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /volume1/docker/openclaw
&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;또는 compose 파일 경로를 직접 지정한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; /volume1/docker/openclaw/docker-compose.yml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-file&lt;/span&gt; /volume1/docker/openclaw/.env &lt;span class="se"&gt;\&lt;/span&gt;
  run &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. &lt;code&gt;.openclaw&lt;/code&gt; EACCES
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EACCES: permission denied, open '/home/node/.openclaw/logs/config-health.json'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;원인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;컨테이너 내부 node 사용자(uid 1000)가 host bind mount 폴더에 쓰기 불가
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;해결:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 1000:1000 /volume1/docker/openclaw/.openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Docker socket permission denied
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;permission denied while trying to connect to the Docker daemon socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;원인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent 계정이 /var/run/docker.sock 접근 권한 없음
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;해결:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Synology에서는 Docker socket 권한을 넓히는 것보다 &lt;code&gt;sudo&lt;/code&gt; 또는 DSM Container Manager UI를 쓰는 편이 안전하다.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;code&gt;models auth login requires an interactive TTY&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models auth login requires an interactive TTY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;원인:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interactive login 명령에 -T 옵션을 붙임
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;해결:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw-cli models auth login-github-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;상태 확인이나 JSON 출력에는 &lt;code&gt;-T&lt;/code&gt;를 쓰고, 로그인류 명령에는 &lt;code&gt;-T&lt;/code&gt;를 빼면 된다.&lt;/p&gt;




&lt;h2&gt;
  
  
  DSM Container Manager에서 관리하기
&lt;/h2&gt;

&lt;p&gt;SSH에서 Compose를 실행해도 되지만, DSM UI에서는 Container Manager의 &lt;strong&gt;Project&lt;/strong&gt;로 관리할 수 있다.&lt;/p&gt;

&lt;p&gt;흐름:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/volume1/docker/openclaw&lt;/code&gt; 폴더 생성&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;docker-compose.yml&lt;/code&gt; 작성&lt;/li&gt;
&lt;li&gt;DSM Container Manager → Project → Create&lt;/li&gt;
&lt;li&gt;경로를 &lt;code&gt;/volume1/docker/openclaw&lt;/code&gt;로 지정&lt;/li&gt;
&lt;li&gt;compose 내용을 확인하고 생성&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이렇게 하면 DSM UI에서도 컨테이너 상태, 로그, 재시작을 확인할 수 있다.&lt;/p&gt;




&lt;h2&gt;
  
  
  마무리
&lt;/h2&gt;

&lt;p&gt;Synology NAS에 OpenClaw를 Docker Compose로 신규 설치하면 host 환경에 직접 의존하지 않고 안정적으로 gateway와 CLI를 운영할 수 있다.&lt;/p&gt;

&lt;p&gt;이번 구성에서 가장 중요한 포인트는 다음 네 가지다.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;.openclaw&lt;/code&gt;는 host에 보존하고 컨테이너에는 &lt;code&gt;/home/node/.openclaw&lt;/code&gt;로 mount한다.&lt;/li&gt;
&lt;li&gt;OpenClaw 컨테이너는 uid &lt;code&gt;1000&lt;/code&gt;의 &lt;code&gt;node&lt;/code&gt; 사용자로 실행되므로 host 폴더 권한을 맞춘다.&lt;/li&gt;
&lt;li&gt;bridge 모드에서는 gateway bind를 &lt;code&gt;lan&lt;/code&gt;으로 두고, host에는 &lt;code&gt;127.0.0.1:18789&lt;/code&gt;만 노출한다.&lt;/li&gt;
&lt;li&gt;CLI 명령은 &lt;code&gt;openclaw-cli&lt;/code&gt; 컨테이너로 실행하고, 비대화형 명령에는 &lt;code&gt;-T&lt;/code&gt;를 붙인다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이 구조를 잡아두면 OpenClaw gateway 실행, CLI 상태 확인, Telegram 채널 설정, 모델 인증, cron 테스트까지 모두 Docker Compose 안에서 일관되게 관리할 수 있다.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>nas</category>
      <category>synology</category>
    </item>
    <item>
      <title>GeekNews AI Weekly Deep Dive - 2026-05-18</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 18 May 2026 04:21:53 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-05-18-234a</link>
      <guid>https://dev.to/ageofclick/geeknews-ai-weekly-deep-dive-2026-05-18-234a</guid>
      <description>&lt;p&gt;이번 주 AI 이슈는 새 모델 과시보다 실제 운영 단위에서 AI를 어떻게 끼워 넣고 통제할지에 더 무게가 실렸습니다. 제품 경험에 자연스럽게 녹이는 통합 전략, 실제 하드웨어·예산에 맞는 선택, 그리고 프로세스 병목을 정확히 짚는 운영 감각이 공통 화두로 떠올랐습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI는 기술이지, 제품이 아니다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이 글은 AI를 독립적인 ‘킬러 제품’으로 보기보다, 무선 네트워킹처럼 모든 제품에 스며드는 기반 기술로 봐야 한다고 주장합니다. 저자는 AI가 아이폰 사용 경험을 바꾸는 것은 맞지만, 2030년에도 호출·소통·확인 같은 핵심 상호작용의 중심 기기는 여전히 스마트폰일 가능성이 높다고 봅니다. 결론적으로 애플의 경쟁력은 AI 자체를 전면에 내세우는 것이 아니라, 사용자가 기술을 의식하지 않게 제품 경험으로 통합하는 데 있다는 관점입니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://daringfireball.net/2026/05/ai_is_technology_not_a_product" rel="noopener noreferrer"&gt;https://daringfireball.net/2026/05/ai_is_technology_not_a_product&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. whichllm - 내 하드웨어에서 실제로 돌아가고 최고 성능을 내는 로컬 LLM 찾기
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: whichllm은 하드웨어에서 ‘돌아가기만 하는’ 모델이 아니라, 실제 벤치마크와 최신성·신뢰도 보정을 반영해 가장 성능이 좋은 로컬 LLM을 고르는 CLI 도구입니다. GPU·CPU·RAM 자동 감지 후 모델을 랭킹하고, 근거 수준 태깅과 계보 기반 감점으로 오래되거나 과장된 점수의 영향력을 줄여 추천 정확도를 높입니다. 또한 run·plan·upgrade 같은 명령으로 즉시 실행, 구매 전 시뮬레이션, 업그레이드 비교까지 한 흐름에서 지원해 실사용 의사결정을 단순화합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://github.com/Andyyyy64/whichllm" rel="noopener noreferrer"&gt;https://github.com/Andyyyy64/whichllm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. AI 구독은 엔터프라이즈의 시한폭탄
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이 글은 주요 AI 기업들이 낮은 구독 가격으로 기업 도입을 빠르게 늘렸지만, 실제 토큰 비용과의 격차가 커 향후 가격 인상·사용량 제한·종량제 전환이 불가피하다고 주장합니다. 특히 에이전트형 사용이 늘면서 좌석당 계산 자원이 급증해, 현재는 작아 보이는 비용이 기업 예산에서 별도 관리가 필요한 수준으로 바뀔 수 있다고 경고합니다. 따라서 기업은 좌석 수가 아니라 실제 사용량을 기준으로 비용을 추적하고, 가격 충격에 대비한 시나리오와 벤더 대안을 미리 준비해야 한다고 제안합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://www.thestateofbrand.com/news/ai-subscription-time-bomb" rel="noopener noreferrer"&gt;https://www.thestateofbrand.com/news/ai-subscription-time-bomb&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. AI가 여러분의 프로세스를 더 빠르게 만들지는 않을 것 같습니다
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이 글은 소프트웨어 개발 속도의 핵심 병목이 코딩 자체가 아니라 모호한 요구사항을 실행 가능한 문제로 정제하는 상류 과정에 있다고 설명합니다. AI가 코드 생성을 빠르게 해도 도메인 지식과 상세한 맥락이 부족하면 결과 품질이 떨어지므로, 실제로는 더 정교한 입력과 지속적인 사람의 개입이 필요하다는 점을 강조합니다. 결국 프로세스 개선의 우선순위는 병목 단계에 고품질·예측 가능한 입력을 공급하는 구조를 만드는 것이며, AI는 그 기반 위에서만 의미 있게 속도를 높일 수 있다고 결론짓습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://frederickvanbrabant.com/blog/2026-05-15-i-dont-think-ai-will-make-your-processes-go-faster/" rel="noopener noreferrer"&gt;https://frederickvanbrabant.com/blog/2026-05-15-i-dont-think-ai-will-make-your-processes-go-faster/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. dev3000 - AI 디버깅을 위한 웹 앱 개발 타임라인 통합 캡처 도구
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: dev3000은 개발 서버 실행 중 발생하는 서버 로그, 브라우저 콘솔, 네트워크 요청, 사용자 상호작용, 자동 스크린샷을 시간순으로 통합 기록해 AI가 문제 맥락을 한 번에 이해하도록 돕는 디버깅 도구입니다. 수집된 기록은 프로젝트별 로그와 스크린샷으로 저장되며, 통합 에러 조회·심층 분석·URL 크롤링 같은 진단 명령을 통해 원인 파악과 수정 과정을 빠르게 반복할 수 있도록 설계되었습니다. 또한 다양한 웹 프레임워크와 Chromium 계열 브라우저, 헤드리스 실행, 에이전트 분할 화면 연동을 지원해 로컬 개발부터 CI 환경까지 동일한 흐름으로 활용할 수 있습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://github.com/vercel-labs/dev3000" rel="noopener noreferrer"&gt;https://github.com/vercel-labs/dev3000&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. AI와 함께 일하며 복리처럼 쌓아 성장하는 법
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 이 글은 AI 협업 성과를 누적시키는 핵심 원칙으로 컨텍스트를 체계적으로 정리하고, 선호와 작업 규칙을 설정 파일에 명시하며, 저비용 검증 루프를 앞단에 배치하고, 더 큰 단위의 일을 위임한 뒤 피드백을 다시 시스템에 반영하는 과정을 제시합니다. 특히 프로젝트 문서와 메모리 계층을 구조화해 세션마다 빠르게 온보딩하고, 스킬과 가이드를 지연 로딩 방식으로 운영해 컨텍스트 비용을 줄이면서도 재현 가능한 워크플로를 만드는 점을 강조합니다. 나아가 병렬 세션 운영과 드리프트 점검, 트랜스크립트 기반 규칙 개선을 통해 개인 생산성을 팀 단위 협업 품질로 확장할 수 있다고 설명합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://eugeneyan.com/writing/working-with-ai/" rel="noopener noreferrer"&gt;https://eugeneyan.com/writing/working-with-ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Google의 생성형 AI 검색 기능 최적화 공식 가이드
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Google은 AI Overviews·AI Mode 같은 생성형 검색 기능도 기존 검색 랭킹·품질 시스템 위에서 동작하므로, 기술적 SEO 기본기와 사람 중심의 고유한 콘텐츠 전략이 여전히 핵심이라고 명확히 안내했습니다. 특히 LLMS.txt, 인위적 청킹, AI 전용 문체 재작성, 부자연스러운 멘션 확보 같은 이른바 AEO/GEO ‘핵’은 효과가 없거나 비권장하며, 대신 크롤링 가능 구조·중복 최소화·이미지/영상 품질·사용자 만족도를 우선하라고 강조했습니다. 또한 브라우저 에이전트 등 에이전틱 경험 확산에 대비해 사이트 접근성과 구조적 명확성을 갖추는 것이 중장기 가시성에 유리하다고 정리했습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;실무적으로는 더 강한 모델을 붙이는 것보다 비용 구조, 하드웨어 적합성, 입력 품질, 운영 제어 지점을 함께 설계하는 팀이 유리해 보입니다. 특히 AI를 별도 마법 상자로 다루기보다 기존 제품과 워크플로에 어떻게 스며들게 할지까지 포함해 판단해야 시행착오를 줄일 수 있습니다.&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>ai</category>
      <category>llm</category>
      <category>weekly</category>
    </item>
    <item>
      <title>GeekNews Frontend Weekly Deep Dive - 2026-05-18</title>
      <dc:creator>ageofclick</dc:creator>
      <pubDate>Mon, 18 May 2026 04:21:23 +0000</pubDate>
      <link>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-05-18-1doi</link>
      <guid>https://dev.to/ageofclick/geeknews-frontend-weekly-deep-dive-2026-05-18-1doi</guid>
      <description>&lt;p&gt;이번 주 프론트엔드 흐름은 웹 개발 도구가 더 정교한 실행 맥락과 작업 기록을 다루는 방향으로 진화하는 한편, 검색 노출과 텍스트 UI처럼 오래된 문제도 생성형 AI 시대 기준으로 다시 재설계되고 있음을 보여줬습니다. 특히 디버깅, 문서 탐색, 업무 기록, 에이전트 실행 환경이 한층 더 운영 친화적인 형태로 묶이는 흐름이 두드러졌습니다.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. dev3000 - AI 디버깅을 위한 웹 앱 개발 타임라인 통합 캡처 도구
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: dev3000은 개발 서버 실행 중의 서버 로그, 브라우저 콘솔, 네트워크 요청, 자동 스크린샷, 사용자 인터랙션을 시간순으로 함께 수집해 AI가 문제 맥락을 한 번에 파악하도록 돕는 디버깅 도구입니다. Chrome DevTools Protocol 기반 모니터링 결과를 프로젝트별 로그와 스크린샷으로 저장하고, 에러 조회·심층 분석·크롤링 같은 명령으로 원인 추적을 빠르게 수행할 수 있게 설계되었습니다. 프레임워크 종류와 무관하게 적용 가능하며 에이전트 연동, 헤드리스 실행, 프로젝트별 브라우저 프로필 유지까지 지원해 실전 개발 흐름에 바로 붙일 수 있습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://github.com/vercel-labs/dev3000" rel="noopener noreferrer"&gt;https://github.com/vercel-labs/dev3000&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Google의 생성형 AI 검색 기능 최적화 공식 가이드
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Google은 AI Overviews와 AI Mode 같은 생성형 검색에서도 기존 SEO 원칙이 그대로 유효하다고 밝히며, 단기적인 ‘AEO/GEO 핵’보다 사용자에게 실제로 유용한 독창적 콘텐츠를 우선하라고 권고합니다. 특히 인덱싱 가능성과 크롤링 접근성, 명확한 페이지 구조, 중복 최소화 같은 기술 기반을 갖추고, 검색 변형별 억지 페이지 양산이나 AI 전용 재작성 같은 조작적 전략은 피해야 한다고 강조합니다. 또한 로컬·이커머스 정보 정비와 에이전트 친화적 웹 준비를 병행하되, 핵심은 사람 중심의 신뢰 가능한 비범용 콘텐츠를 꾸준히 제공하는 것이라고 정리합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. 끝까지 네이티브로, 텍스트가 필요해지기 전까지
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 작성자는 SwiftUI·AppKit·TextKit을 오가며 Markdown 채팅 UI를 구현했지만, 전체 선택과 스트리밍 안정성 같은 기본 요구를 만족시키는 과정에서 성능 저하와 복잡성이 반복된다고 지적합니다. 반면 WebKit과 Electron에서는 텍스트 선택, 렌더링 품질, 타이포그래피, 통합 동작이 비교적 자연스럽게 확보되어 장문 대화형 UI에서 웹 기반 접근이 실용적이라는 결론에 이릅니다. 결국 문제의 핵심은 네이티브 기술의 우열보다도, 현대 텍스트 인터페이스를 제품 수준으로 빠르게 완성할 수 있는 구현 경로가 어디에 더 성숙해 있는가에 있다는 주장입니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://justsitandgrin.im/posts/native-all-the-way-until-you-need-text/" rel="noopener noreferrer"&gt;https://justsitandgrin.im/posts/native-all-the-way-until-you-need-text/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Show GN: glowed - Ghostty용 터미널 Markdown 브라우저/에디터
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: glowed는 실행한 디렉터리를 기준으로 Markdown 파일을 스캔해 검색·미리보기·원문 편집을 한 흐름 안에서 처리하고, 선택한 문맥을 외부 LLM CLI 세션으로 넘길 수 있게 설계된 Ghostty 중심 TUI 도구입니다. 작성자는 보안 자격 증명을 앱이 직접 다루지 않고 기존에 로그인된 CLI를 호출하는 방식과, 백업을 포함한 원자적 저장 등 실사용 안정 장치를 초기 버전에 반영했다고 설명합니다. 다만 현재는 macOS+Ghostty 환경 최적화와 제한적인 호환성 검증을 전제로 하며, 사용자별 포크와 Homebrew tap 배포를 권장하는 분산형 운영 모델을 채택하고 있습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://github.com/khw1031/glowed" rel="noopener noreferrer"&gt;https://github.com/khw1031/glowed&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Show GN: 셜록 - 당신이 오늘 뭘 했는지를 다 알고 있는 AI 노트 앱
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 셜록은 회의 기록에 한정된 기존 노트 도구와 달리, 사용자의 화면에서 실제 업무 맥락을 읽어 일과를 자동으로 정리해 주는 Mac용 AI 노트 앱입니다. 별도 앱 연동 없이 브라우징·메신저·문서 작업 흐름을 기반으로 요약과 후속 할 일을 만들어 주며, 필요한 경우 하루 업무를 질문형 챗으로 다시 꺼내볼 수 있게 설계됐습니다. 데이터는 로컬 저장을 기본으로 하고 캡처 중지·기록 삭제 같은 제어권을 사용자에게 두어 프라이버시 우려를 줄이려는 방향이 분명합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://getsherlock.xyz" rel="noopener noreferrer"&gt;https://getsherlock.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Zerostack - 순수 Rust로 작성된 Unix에서 영감을 받은 코딩 에이전트
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: Zerostack은 Rust로 만든 초경량 코딩 에이전트로, 낮은 메모리 사용량과 빠른 반응성을 강점으로 내세우며 다양한 LLM 제공자와 도구 실행 흐름을 지원합니다. 파일 편집·검색·셸 실행 같은 핵심 기능에 권한 모드와 승인 체계를 붙여 자동화 편의성과 안전성 사이를 조절할 수 있고, 세션 재개·프롬프트 전환·반복 루프·워크트리 연계 등 장기 개발 작업을 위한 운영 기능도 폭넓게 갖췄습니다. 커뮤니티 반응은 특히 저사양 환경에서의 실사용성과 확장 가능성에 주목하면서도, 일부 제공자 호환성과 기능 성숙도는 추가 개선이 필요하다는 평가를 함께 보여줍니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://crates.io/crates/zerostack/1.0.0" rel="noopener noreferrer"&gt;https://crates.io/crates/zerostack/1.0.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Google 검색의 생성형 AI 기능을 위한 웹사이트 최적화
&lt;/h2&gt;

&lt;p&gt;핵심 내용 요약: 구글은 AI Overviews·AI Mode 같은 생성형 검색에서도 별도의 비법보다 기존 SEO 원칙이 여전히 핵심이라고 명확히 밝히며, AI 응답 역시 검색 인덱스 기반의 RAG와 쿼리 팬아웃으로 신뢰 가능한 페이지를 찾아 구성된다고 설명합니다. 따라서 흔한 정보 재가공보다 고유한 관점과 실제 경험이 담긴 비범용 콘텐츠, 그리고 크롤링·인덱싱·접근성·페이지 경험 같은 기술적 기반을 꾸준히 갖추는 것이 장기적인 노출 성과를 좌우한다고 강조합니다. 반대로 llms.txt 신설, 기계적 청킹, 과도한 롱테일 삽입, 인위적 언급 늘리기 같은 ‘AEO/GEO 해킹’은 불필요하거나 스팸 정책 위험이 있어 피해야 한다고 정리합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;원문 링크: &lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  이번 주 실행 제안
&lt;/h2&gt;

&lt;p&gt;실행 관점에서는 새 도구의 데모보다 팀 워크플로에 안전하게 붙는지, 원문 품질과 맥락 보존을 실제로 개선하는지를 먼저 검증하는 편이 좋습니다. 특히 검색 최적화나 에이전트 도구 도입은 눈에 띄는 편법보다 구조적 접근성, 기록성, 검수 가능성을 확보하는 쪽이 오래 남습니다.&lt;/p&gt;

</description>
      <category>geeknews</category>
      <category>frontend</category>
      <category>weekly</category>
      <category>deepdive</category>
    </item>
  </channel>
</rss>
