Mentions
Conversations linking to GitHub, newest first. Times are UTC.
Mentions by source
X
Bluesky
Hacker News
Lobsters
V2EX
Qiita
DEV
Mastodon
Latest posts
I have built an AI water tracker 💧 for beginners to follow FastAPI + LangChain + Streamlit + SQLite. Log your intake, get AI hydration feedback. With ~2 yrs in Agentic AI, I'm now building projects so you can learn too. azhad947/Agentic-Ai #AgenticAI #buildinpublic
The desktop app you scrape updated overnight: a version watch that re-checks what you depend on, once per change Disclosure: I'm the developer of the tool described here, and this post was drafted and published by an AI agent from the project's source code. Relaymote is unofficial; not affiliated with or endorsed by Anthropic. Relaymote (MIT, Node.js) is a phone remote for Claude Desktop's Code-tab sessions. Desktop has no API for that, so Relaymote reads two things it does not own: the Code tab's sidebar (through the debugger port) and the session transcripts on disk. Both can change shape whenever Desktop or the Claude Code it bundles updates, and nobody sends you a changelog for the parts you scrape. This post is about the small module that turns "it silently broke after an update" into one message on the day of the update: lib/claude-version-watch.js. The failure that started it One Desktop update (2.42304.2 to 3.1623.0) moved screen-reader-only status text inside each sidebar row's button. Relaymote read the row's text as the session title, so titles came out as "<session name> Awaiting input". 404 of 473 session titles were polluted before anyone noticed. Nothing crashed. Nothing logged an error. The data was just wrong. The lesson is not "write a better selector". Selectors for someone else's UI will keep breaking. The lesson is: notice the update, run a live check of every surface you depend on, and say the result once. Step 1: know the installed versions without asking the app Both versions are visible on disk. Desktop installs into app-<version> folders and Claude Code into version-named folders, so the newest folder name is the installed version: const cmpVer = (a, b) => { const x = String(a).split('.').map(Number), y = String(b).split('.').map(Number); for (let i = 0; i < Math.max(x.length, y.length); i++) { const d = (x[i] || 0) - (y[i] || 0); if (d) return d; } return 0; }; const newest = (names) => names.filter(n => /^\d+(\.\d+)+$/.test(n)).sort(cmpVer).pop() || null; Two details matter. Compare versions numerically, part by part: as strings, "3.999" sorts after "3.1623". And filter to names that look like versions, so a stray folder never becomes "the version". Step 2: the live check names problems in plain sentences check() does not compare against a stored snapshot of the UI. It asks questions whose answers must hold whatever the layout is: - Can we reach Desktop's debugger at all? - Did the sidebar read return any sessions? Zero rows means the session list moved. - Does any title match the known pollution pattern (/\s(Awaiting input|Unread response|Started (from|by) .*)$/)? - With 20 or more rows, does at least one show a status? If none do, the status labels changed. - Does the newest transcript parse, and does it contain record types we have never seen? Each failure is pushed as a sentence someone can act on ("the Code tab sidebar read 0 sessions — Desktop changed its session list"), not as a stack trace. Step 3: separate problems from notes New transcript record types are common: Claude Code adds them regularly (api-request, cost-state and several others appeared between Claude Code 2.1.300 and 2.1.304). Relaymote skips unknown types safely, so a new type is a note, not a problem: if (t.unknown.length) notes.push('new transcript record types (skipped safely): ' + t.unknown.map(([k, n]) => `${k}×${n}`).join(', ')); If every new record type raised an alarm, the alarm would be ignored by the second week. Keep "needs a fix" and "worth knowing" in different lists, and only the first makes the result not OK. To find the types cheaply, it reads only the last 2 MB of the most recently modified transcript and drops the first (probably cut) line. That is enough to see what the current version writes. Step 4: run on change, not on a schedule The watch ticks every few minutes, but almost every tick is a no-op: const was = load(); if (!was) { save({ ...now, at: new Date().toISOString(), checked: null }); return { first: true, now }; } if (was.desktop === now.desktop && was.code === now.code && !was.pending) return null; - First sight only records. On a fresh install there is no "before", so there is nothing to report. - Same versions, nothing pending: return. The expensive live check runs only when a version actually changed. - One alert per change. After the check, the new versions are saved with the result, so the next tick is quiet again. Step 5: don't blame the update for a restart An update usually restarts Desktop, and for a minute the debugger is simply not up yet. Reporting "cannot reach Desktop" at that moment would be a false alarm on every single update. So if the only problem is the unreachable debugger, the change is parked as pending and retried, up to six ticks: if (!r.ok && r.problems.every(p => /debugger link down/.test(p)) && (was.pendingTries || 0) < 6) { save({ ...was, pending: now, pendingTries: (was.pendingTries || 0) + 1 }); return { waiting: true }; } After six tries it reports anyway, because a debugger that never comes back is a real problem. What the message looks like One push notification, titled with what changed (Claude updated: Desktop <old> → <new>, Claude Code <old> → <new>, only the parts that changed) and a body that is either "everything it reads from Claude works" plus the notes, or the list of problems. The same line goes to the log. That is the whole output: no dashboard, nothing to open. Takeaways - If you scrape or parse an app you don't own, its updates are your incidents. Detect them from the install on disk. - Check invariants ("some row has a status"), not a frozen copy of the UI. - Split problems from notes, or the alert becomes noise. - Run the expensive check once per version change, and record the result so it doesn't repeat. - Give a restart time to finish before calling it a failure, with a hard limit on how long you wait. The code is in lib/claude-version-watch.js in the Relaymote repo, with its test in test/claude-version-watch.js. Relaymote is unofficial; not affiliated with or endorsed by Anthropic.
Turned my old budget phone (Xiaomi Redmi 10C) into a silent 24/7 homeserver running Nextcloud, Pi-Hole, Navidrome & a live status dashboard Instead of letting an old budget Android phone sit in an e-waste drawer, I set it up as a headless 24/7 home server. - Device: Xiaomi Redmi 10C - SoC: Snapdragon 680 - Power draw: ~2–3 W - Runs off the internal battery (With ACC Magisk Module and screen turned off) It Runs a Debian 13 chroot environment thanks to DesktopECHO/trixie.apk. I am hosting- - Pi-hole: Network-wide ad blocking + split-horizon local DNS. - Nextcloud Hub: File & photo sync (tuned with MariaDB, Redis, & notify_push). - Navidrome: Subsonic music streaming for my FLAC/MP3 library. - Cloudflare Tunnel: Remote access without open router ports or CGNAT issues. - Custom Status Page: Real-time monitoring (thanks to Antigravity). Far weaker than a mini PC but handles my needs 24/7 at ~2–3W with zero noise with a built-in battery backup.
@RoamResearch @JesseNichols 11. When the work is ready to leave Roam: Earlan Josh Sabillano’s Roam Publish shares selected pages and blocks through roam.pub. ejqs/roam-publish Here’s the author’s kitchen-sink example if you want to see what that looks like. roam.pub
桌上两套设备要装两套 200 多兆的套件,一套强制注册、一套启动就卡。 clicksync 跑在浏览器里,Web HID 直连设备:改 DPI/回报率/按键/灯光,多品牌通用,不装不注册。 nuitfanee/clicksync
【Python×Docker】金・銀時系列の相転移を攻略!5年1254日連続黒字の2段階ATRレジーム切替AI はじめに 個人開発している自律型AIヘッジファンド『Lumina AI』では、これまで日米株のマルチエージェントスイング運用(IBKR連携)および、Moomoo OpenDの60段階フル板(Level 3)を直結した米国株イントラデイ・クオンツエンジン(Lumina-Prop)を開発・公開してきました。 ramuza0113-sketch/lumina-ai-hedge-fund 前回の記事(米国株60段階フル板 × 1年97万本の負けトレード解剖)を公開した後、次なる研究テーマとして着手したのが、グローバル市場で最も流動性が高く、かつ単一パラメータの時系列モデルが最も破綻しやすいコモディティ領域——「金(GLD / XAUUSD)& 銀(SLV / XAGUSD)」です。 本記事では、既存の米国株クオンツ基盤から第3の完全独立Dockerチャンバーとして派生させ、過去5年間(2021〜2026年・全1,254営業日)のあらゆる市場サイクルおよび現物5分足100,000本(368営業日)のヒストリカル検証を「5年連続プラス・PF 1.91・日次ドローダウン基準超過ゼロ」で突破した貴金属クオンツエンジン『Lumina-Gold(v6.1 Surgical Master)』のアーキテクチャ、数理モデル、実装コードを共有します。 1. なぜ単一ロジックの貴金属アルゴリズムは長期運用で破綻するのか? 貴金属市場を対象とした従来のルールベース・アルゴリズムの大多数は、以下の3つの構造的要因によって長期バックテストや厳格なリスク制限下(日次最大許容損失 -5.0%、最大許容ドローダウン -10.0%)で破綻します。 要因①:グリッド・平均回帰モデルのテールリスク被弾 逆行するたびにポジションサイズを増加させる単純な平均回帰(Mean Reversion)モデルは、低ボラティリティのレンジ相場では高い勝率を記録しますが、FRBの金融政策転換や地政学ショックによるトレンド発生時にファットテール(極端な一方向変動)に巻き込まれ、日次リスク上限を一瞬で超過します。 要因②:「年度によって5分足ボラティリティが1.6倍以上激変する」相転移の無視 今回、過去5年間(2021年10月〜2026年10月・1,254営業日)の5分足データを定量分析した結果、金市場には看過できないボラティリティ・レジームの構造変化(相転移)が存在することが判明しました。 【金市場(GLD / XAUUSD)のボラティリティ相転移】 ┌───────────────────────────────────────┬───────────────────────────────────────┐ │ 🌊 2024〜2025年(低ボラ上昇期) │ 🔥 2025〜2026年(高ボラ沸騰期) │ ├───────────────────────────────────────┼───────────────────────────────────────┤ │ ・5分足平均レンジ(ATR): 0.1007% │ ・5分足平均レンジ(ATR): 0.1622% │ │ ・特徴: 浅い押し目で素直に伸びるトレンド│ ・特徴: 通常期の1.61倍の激しい上下動 │ │ ・逆張りSweep戦略を走らせると… │ ・順張りブレイク戦略を走らせると… │ │ ➔ 押し目が浅く置いていかれ、本当に │ ➔ 寄り付き高値ブレイク直後に大口の │ │ トレンド崩壊した日だけ拾って被弾 │ 流動性スイープで往復ビンタ被弾 │ └───────────────────────────────────────┴───────────────────────────────────────┘ つまり、「単一のロジック(順張りだけ、あるいは逆張りだけ)では、5年間の異なるボラティリティ環境を絶対に生き残れない」という事実です。 要因③:17:00 ET ロールオーバー時のスプレッド急拡大とマクロ指標発表時のスリッページ 貴金属市場は毎日 17:00 ET(日本時間早朝06:00〜07:00)のロールオーバー前後でビッド・アスク・スプレッドが通常の10倍以上に拡大します。また、米国重要経済指標(雇用統計・CPI・FOMC・ISM等)の発表前後2分間は流動性が一時的に枯渇するため、事前退避機構を持たないシステムは意図せぬスリッページで損失を被ります。 2. システムアーキテクチャ:VPS 3室完全隔離 & マルチコンテナ設計 既存の「本家スイング(IBKR)」および「米国株クオンツ(コンテナ #1 :8001)」とプロセス・SQLiteデータベース・執行パイプラインが一切干渉しないよう、Linux VPS上に第3の独立チャンバー(/opt/lumina-gold)と2台目の専用執行Dockerコンテナ(:8002)を構築しました。 +---------------------------------------------------------------------------------------------------+ | Linux VPS (Ubuntu 22.04 — 8 vCPU / 8GB RAM / 100GB NVMe) | | | | [ Chamber 1: 本家スイング ] [ Chamber 2: 米国株クオンツ ] [ Chamber 3: 貴金属クオンツ ] | | lumina-capital.service lumina-prop.service lumina-gold.service | | DB: hedge_fund_portfolio.db DB: prop_portfolio.db DB: gold_portfolio.db | | Mode: MAIN_IBKR Mode: PROP_US Mode: PROP_GOLD | | │ │ │ | | ▼ ▼ ▼ | | [ IB Gateway :4002 ] [ Bridge Container :8001 ] [ Bridge Container :8002 ] | | (IBKR Official API) (US Equities Universe) (Precious Metals Spot) | | Magic: 202607 Magic: 202608 | | └───────────────┬───────────────┘ | | ▼ | | [ Moomoo OpenD :11111 (US.GLD / US.SLV 60段フル板) ] | +---------------------------------------------------------------------------------------------------+ 3. 核心アルゴリズム:2段階ボラティリティ・レジーム自動切替エンジン(閾値 0.140%) 直近10営業日の5分足相対レンジ中央値(reg_atr10)を常時算出し、アブレーション検証で特定された真の物理的相転移点 0.140% を境に、2つの独立した戦略エンジンを決定論的に自動シフトします。 r_{d,i} = \frac{H_{d,i} - L_{d,i}}{C_{d,i}} \times 100, \qquad m_d = \mathrm{median}_{i} \left( r_{d,i} \right), \qquad \mathrm{ATR}_{10}(d) = \frac{1}{10}\sum_{k=1}^{10} m_{d-k} \mathcal{R}_d = \begin{cases} \text{Regime B (High-Vol SMC Liquidity Sweep)}, & \text{if } \mathrm{ATR}_{10}(d) \ge 0.140\% \ \text{Regime A (Calm/Normal 4-Phase ORB Pullback)}, & \text{if } \mathrm{ATR}_{10}(d) < 0.140\% \end{cases} 🌊 Regime A(通常・低ボラトレンド期:reg_atr10 < 0.140%) 【4フェーズ ORB(Opening Range Breakout)押し目継続モデル】 ボラティリティが落ち着いている環境では、逆張りを封印し、NY市場寄り付きの機関投資家の初動ブレイクを確認した後の「最初の浅い押し目」だけを狙います。 Phase 1(Opening Range 確定:09:30〜09:45 ET):NY寄り付き最初の15分間(5分足3本)の高値 orb_h・安値 orb_l を計測。 Phase 2(ORB ブレイクアウト確証):09:45 ET 以降の5分足が陽線実体で orb_h * 1.0003 を上抜いて引けることを確認。 Phase 3(NY午前ウィンドウ 10:00〜12:00 ET での EMA9 / ORB上限プルバック):ブレイク後12本(60分)以内に、価格が一度 EMA9 または orb_h 付近までクールダウンし、かつ日中 VWAP を割り込まずにサポートされることを確認。 Phase 4(反発トリガー & ギャップ・前日高値構造フィルタ):再び5分足が EMA9 および VWAP の上で強い陽線(終値位置強度 CLV >= 0.55)を形成した瞬間にエントリー。(※当日寄り付きギャップが -0.35% 未満の大幅ギャップダウン日は戻り売りトラップとなるため完全除外) 🔥 Regime B(高ボラ・ストップ狩り期:reg_atr10 >= 0.140%) 【SMC(Smart Money Concepts)流動性スイープ反転エンジン】 ボラティリティが沸騰している環境では、直近の流動性プール(Liquidity Pool)を一度スイープした直後のピンバー回帰を検出します。 NY_SWEEP_LONG(金・銀):直近6本安値または前日安値(PDL)を一瞬下抜いた後、同一5分足が 下ヒゲ比率 35% 以上・CLV >= 0.60 の陽線 でレンジ内へ即座に回帰した場面をロング。 NY_SWEEP_SHORT(金):直近6本高値をダマシ上抜けした後に 上ヒゲ比率 35% 以上・CLV <= 0.35 の陰線 で日中 VWAP 下へ反落し、かつ米ドル指数(UUP / DXY)が +0.05% 以上上昇(ドル高=金安の逆相関)している場面をショート。 LON_ASIAN_SWEEP_SHORT(金):ロンドン市場オープン直後(02:00〜04:00 ET / 16:00〜18:00 JST)において、アジア時間最高値をスイープした直後に陰線拒絶された場面をショート。専用ブリッジ(:8002)から直接リアルタイムBid/Askスプレッドを照合し、スプレッドが 0.08% を超える流動性低下時は発注を物理遮断します。 4. 実装コード:3段階マクロ指標退避 & 同一市場状況ピンポイント警戒メモリ ① 3段階・重要経済指標ブラックアウト&「発表6分前」自動退避プロトコル 重要経済指標の発表前後に発生するスプレッド拡大や逆指値スリッページを回避するため、保有ポジションを発表前に自動で成行退避させる3段階ガードを実装しています。 class MacroNewsProtectionShield: """ 3-Stage High-Impact USD Macro News Protection Protocol (v6.1) Stage 1 (T-6m00s to T-2m20s): Pre-News Position Evacuation (Flatten all open positions) Stage 2 (T-2m15s to T+2m15s): Hard Execution & SL/TP Modification Lock at Bridge layer Stage 3 (T-8m00s to T+5m00s / FOMC 14:40 ET): Surgical New-Entry Blackout """ @classmethod def check_news_shield(cls, dt_et, open_positions, broker_engine) -> str: Stage 1: 重要指標発表の6分前〜2分20秒前に全保有ポジションを強制退避決済 is_evac, ev_reason = MarketSession.is_us_prop_pre_news_flatten_window(dt_et) if is_evac and open_positions: for pos in open_positions: broker_engine.close_position( symbol=pos["symbol"], reason=f"MACRO_NEWS_EVACUATION ({ev_reason})" ) return "EVACUATED_ALL_POSITIONS" Stage 2: 発表前後2分15秒間はブリッジ通信を含め全操作を完全凍結 is_forbid, fb_reason = MarketSession.is_in_ftmo_strict_forbidden_window(dt_et) if is_forbid: return f"STRICT_FORBIDDEN_LOCK ({fb_reason})" Stage 3: 新規エントリーのみ外科的に遮断(指標がない通常日の午後トレンドは100%維持) if MarketSession.is_us_prop_macro_blackout_window(dt_et): return "NEW_ENTRY_BLACKOUT" return "CLEAR" ② 同一市場状況ピンポイント警戒メモリ(Condition-Matched Memory Feedback) 損切り後に無差別に次の全トレードのサイズを削ってしまうと、「ロンドン時間のショート逆張りで損切りした直後に、NY市場で強いロング順張りトレンドが発生した場面」で大きな利益機会を逃します。 そこで、「前回損切りした時と同一の市場状況(同じ売買方向 × 同じレジーム/戦略ファミリー)」に再突入する時のみピンポイントでサイズを 0.75x に縮小+60段フル板基準を厳格化し、別方向・別レジームのトレンドには標準サイズ(1.00x)で乗る設計としました。 def evaluate_condition_matched_lot_scale( last_memory: dict, candidate_side: str, candidate_setup: str, ob60_buy_pct: float ) -> tuple[bool, float]: """ 直近の損切り記憶と今回のエントリー候補の「売買方向 × レジーム/戦略ファミリー」を照合 """ if not last_memory or float(last_memory.get("realized_pnl", 0.0)) >= 0: return True, 1.00 last_side = "SHORT" if "SHORT" in str(last_memory.get("trade_type", "")) else "BUY" last_family = "ORB" if "ORB" in str(last_memory.get("lesson_learned", "")) else "SWEEP" cand_family = "ORB" if "ORB" in candidate_setup.upper() else "SWEEP" 同一売買方向 かつ 同一レジーム戦略ファミリーの場合のみピンポイント警戒発動 if last_side == candidate_side and last_family == cand_family: 60段階フル板(US.GLD / US.SLV)の要求水準を厳格化 if candidate_side == "BUY" and ob60_buy_pct < 35.0: return False, 0.0 # 板サポート不足につき遮断 if candidate_side == "SHORT" and ob60_buy_pct > 65.0: return False, 0.0 return True, 0.75 # 0.75倍にサイズを縮小して慎重に執行 別方向・別レジーム(ドテン順張り等)は標準1.00倍サイズを維持 return True, 1.00 5. バックテスト&ヒストリカル検証結果 ① 過去5年間(2021/10〜2026/10・全1,254営業日)市場サイクル別成績 基準元本 $100,000、スプレッド・スリッページ摩擦控除後、5年間の全市場サイクルを検証した結果です。 年度区分 期間 (営業日数) マクロ相場環境・特徴 勝敗 (トレード数) 勝率 (WR) PF 年度純損益 (PnL) 年度内最悪日次DD 初期元本比 最大下振れ Year 1 2021/10〜2022/10 (252日) FRB急速利上げ・ドル独歩高・金下落調整期 35回 (23勝12敗) 65.7% 1.71 +$4,812.34 -$2,432.91 (-2.43%) -$441.63 (-0.44%) Year 2 2022/10〜2023/10 (251日) インフレ鈍化・底打ちレンジ模索期 41回 (22勝19敗) 53.7% 1.53 +$5,249.78 -$2,067.97 (-2.07%) $0.00 (元本割れなし) Year 3 2023/10〜2024/10 (252日) 地政学リスク・最高値ブレイク期 44回 (24勝20敗) 54.5% 1.65 +$7,287.63 -$2,067.97 (-2.07%) $0.00 (元本割れなし) Year 4 2024/10〜2025/10 (250日) 低ボラ期(ATR 0.10%)・穏やかな上昇期 57回 (35勝22敗) 61.4% 1.67 +$7,090.30 -$1,541.16 (-1.54%) -$2,106.37 (年度初比) Year 5 2025/10〜2026/10 (249日) 高ボラ期(ATR 0.16%)・ストップ狩り急騰期 70回 (51勝19敗) 72.9% 2.68 +$22,897.18 -$2,422.13 (-2.42%) -$2,277.25 (年度初比) 🏆 5年合計 2021/10〜2026/10 (1,254日) 全5サイクル完全網羅(5年連続プラス) 247回 (155勝92敗) 62.8% 1.91 +$47,337.24 -$2,432.91 (-2.43%) -$441.63 (-0.44%) ② 現物5分足 100,000本 × 2銘柄(368営業日)アブレーション検証 5分足100,000本×2銘柄(2025年5月30日〜2026年10月30日・全368営業日)を用い、レジーム閾値のアブレーション検証を行った結果です。 検証構成(5分足 100,000本 × 2銘柄) 総トレード数 勝率 (WR) PF 全期間純損益 (368日) 平穏期5ヶ月 (2025/05〜10) 高ボラ期12ヶ月 (2025/11〜2026/10) 最悪日次DD 初期元本割れ最大DD 動的ATR閾値 (0.110〜0.140%) 案 110回 56.4% 1.44 +$13,185.79 +$10,656.83 +$2,528.96 -$1,825.09 $0.00 👑 v6.1 Surgical Master (0.140% 固定 + 指標窓遮断 + 現物スプレッド照合) 104回 58.7% 1.56 +$15,543.67 +$10,186.95 (PF 2.86) +$5,356.72 (PF 1.22) -$1,825.09 (-1.83%) $0.00 平穏期(2025/05〜2025/10 の5ヶ月間)単独でも純損益 +$10,186.95(勝率 60.0%・PF 2.86)を達成:高ボラ期だけでなく、穏やかな平穏期5ヶ月間だけでも +10.0% を超える高い安定性を実証しました。 0.140% が順張り(ORB)と逆張り(Sweep)の真の物理的相転移点:閾値をむやみに下げると中ボラ日の素直なトレンドまで逆張りスイープに切り替わって期待値が低下するため、0.140% 固定が数理・実証ともに最適解であることが確認されました。 おわりに これで私たちの自律型AIクオンツ基盤は、 本家『Lumina Capital』:日米株ファンダメンタルズ&サプライチェーンAIスイング 第2の矢『Lumina-Prop』:米国株50銘柄 × Moomoo 60段階フル板スナイパー 第3の矢『Lumina-Gold』:金・銀 × 2段階ボラティリティ・レジーム自動切替エンジン という3つの独立プロセスが24時間リレーしながら市場を監視・執行するトリニティ体制へと進化しました。 ベースとなるマルチエージェント&クオンツ基盤はGitHub上でオープンソースとして公開しています。時系列解析やAIエージェント設計に興味がある方は、ぜひリポジトリを覗いて Star ⭐ で応援していただけると励みになります! 🔗 GitHub リポジトリ ramuza0113-sketch/lumina-ai-hedge-fund ※本記事はアルゴリズム開発およびシステムアーキテクチャの技術記録であり、投資勧誘や特定銘柄の売買を推奨するものではありません。
⭐ Kanzo ⭐ emanuele-em/kanzo 1. 코딩 에이전트와 사람이 같이 쓰는 칸반 보드(할 일 관리판)가 나옴. 브라우저 보드와 에이전트용 MCP 서버가 프로그램 하나에 들어 있음 2. 계정도 서버도 설정도 없이 `kanzo`만 실행하면 끝. 사람은 보드, 에이전트는 MCP, 터미널은 명령어로 쓰고 파일을 직접 고칠 일은 없음 3. "다음 할 일 가져와서 해줘" 하면 에이전트가 카드를 doing으로 옮기고 댓글을 달면서 작업함. Human으로 표시한 할 일은 에이전트가 건드리지 않음. 여러 컴퓨터가 보드 하나를 같이 쓰거나 깃 저장소로 맞추는 것도 가능 4. 프로그램 4.5MB, 메모리 4.5MB, 시작 0.002초. 할 일 3,000개짜리 보드도 0.017초에 뜸. 에이전트 답변은 아주 짧은 글 한두 줄 수준 (Apple M4 기준) 5. AGPL-3.0 무료, 공개 8일 만에 스타 792개. 맥·리눅스·윈도우 지원, 라즈베리파이에서도 돌아감 설치: curl -LsSf github.com/emanuele-em/kanzo/releases/latest/down… | sh 에이전트 여러 개한테 할 일 나눠 주고 한 화면에서 진행 상황 보고 싶은 사람한테 좋을 듯 ━━━━━━━━━━ 🇺🇸 1. A kanban board (task tracker) that humans and coding agents share. A browser board and an MCP server for agents come in one program 2. No account, no server, no setup: just run `kanzo`. You use the board, agents use MCP, the terminal uses commands, and you never edit a file by hand 3. Say "take the next task and do it" and the agent moves the card to doing and comments as it works. Tasks marked Human are left alone by agents. Several computers can share one board, or sync it through a git repo 4. Program is 4.5 MB, memory 4.5 MB, starts in 0.002 seconds. A board with 3,000 tasks loads in 0.017 seconds. Agent replies are just a line or two of short text (measured on an Apple M4) 5. Free under AGPL-3.0, 792 stars in 8 days. Works on Mac, Linux, Windows, and even Raspberry Pi Install: curl -LsSf github.com/emanuele-em/kanzo/releases/latest/down… | sh Seems great if you hand tasks to several agents and want to watch the progress on one screen #AI #ClaudeCode #MCP #AIAgents #OpenSource
コード公開してます。 気軽にPRしてね! yukincom/nyamuru-image-hub
I made a open source version of Polyfork guys, we as a community can make models and improve them. Meet Polyspoon. polyspoon.com DITlieD/polyspoon #polyfork #lowpoly #3dmodelassets
Mario Kart World (Switch 2) running natively on Apple Silicon: open source, ~60fps on an M1 Max Hey everyone, I've been working on getting Mario Kart World running natively on my Mac, and it's finally in a good spot, so I wanted to share it. This isn't an emulator. The game's own code runs directly on the M-series chip, and the Switch 2 graphics get translated to Metal ahead of time. You end up with a normal Mac app you just double-click, like any other game. Repo: azmasm/switch2mac What is switch2mac? It's a personal project for building optimized native Mac versions of Switch 2 games. It's built on top of nxnative (which already does this for a bunch of Switch 1 games), with all the Switch 2 work and fixes it took to get Mario Kart World running well. You point it at your own dump, run a few Terminal commands, and it builds the app for you. No keys, no decryption, and no game files in the repo. Mario Kart World is just the first game. The repo has a guide covering everything I learned along the way, so anyone (or their AI assistant) can try bringing up the next Switch 2 game. How it runs on my M1 Max (64 GB, macOS 26.6): - Menus, Grand Prix, free roam with traffic, and cutscenes all work - Around ~60 fps in races at 2560x1440, using about 13-16 GB of memory - The first launch shows a short "preparing" screen (about a minute) so you don't get shader stutter while playing - FPS overlay on key 1, settings on key 2 Help welcome: - Share your pipelines: play courses or modes the list lacks, run `tools/pipelines.py new`, attach the file to an issue - A locked 60 fps (one reflection pass costs ~4 ms on Mac, cause unknown) - Lamp lights shining through walls at night - Testing on other Macs, especially 16 GB ones and newer M-series chips - Game updates (only 1.0.0 is tested) - More Switch 2 games Huge thanks to: seedds for nxnative, u/potentialad9091 for the original Switch 2 patches, Eglantine and Ryujinx for the shader tools, and MacNativeGames by ly05010419 for the shared shader list idea and the overlay/settings design. Edit: Guys pls stop asking me for game files or where to find them, its very easy to find yourself on google and I dont want to risk an account ban. Also disclaimer: This was made as a personal project and I thought it turned out pretty good on my device, so I figured why not share it instead of gatekeeping? I know there may be bugs/memory issues but the whole point is people can just take this repo and make it fully optimized for their own devices, share the fixes back to the project, or not. Thats the beauty of open source. If you wanna try it out go for it, if you see it as AI slop, power to you lol. Either way, its a free option!
Making My Portfolio Less Boring: 4 Small Redesigns That Made a Big Difference When I first launched my portfolio, it worked, but it felt empty. Some pages had big text and lots of blank space. Some sections said "Coming soon". Two pages almost looked the same. I didn't rebuild anything. I made four small changes, and the site felt much more finished. Here they are, with examples you can copy. 1. Replace "Coming soon" with real work My Projects page ended with two cards that said "Coming soon" and "A new piece is finding its final frame." They looked unfinished, and they told visitors there was nothing there. I deleted them and used real things I had already built instead: - A side project (a Python script that publishes a blog post every day with GitHub Actions) - My articles on dev.to Placeholder cards don't help anyone. If you have nothing new to show, remove the section. If you have something real, even a small project or an article, show that. <a href="https://github.com/your-username/your-repo" target="_blank" rel="noopener noreferrer" className="flex flex-col gap-3 rounded-2xl border border-[var(--border)] bg-[var(--surface)] p-5 transition-colors hover:border-[var(--accent)]" > <span className="text-xs uppercase tracking-wider text-[var(--text-muted)]">Project</span> <h3 className="text-lg font-semibold">Daily blog automation</h3> <p className="text-sm leading-6 text-[var(--text-muted)]"> A Python script that writes and publishes a blog post every day. </p> <span className="mt-auto text-sm font-semibold text-[var(--accent)]">View on GitHub →</span> </a> 2. Use the empty space next to a big heading My Contact page had a huge heading on one side and nothing on the other. A visitor had to scroll to find out how to reach me. I moved the contact options next to the heading as three clickable cards: Email, WhatsApp and LinkedIn. Under the heading, I added small chips for what I can help with. <div className="grid gap-8 lg:grid-cols-2 lg:items-center"> <div> <h1>Let's make something good.</h1> <p>Have a project in mind? I'd love to hear what you're thinking.</p> </div> <div className="flex flex-col gap-3"> {/* three contact cards here */} </div> </div> The same idea worked on my Skills page: the empty right side now shows four small cards that link to the skill details below. 3. Turn a row of small links into cards My "Find me online" section was a row of tiny text chips. They were easy to miss, and a visitor couldn't tell what each link was. I changed them into larger cards with an icon, a name and one short line, such as "Articles on web development and automation". Now each link explains itself before anyone clicks it. Keep each card focused on one job: an icon, a title, one line of description and one clear action. 4. Check your contrast My "Let's Work Together" banner had white text on a light lavender background. On my laptop it looked fine, but it was hard to read on a phone, and the button text was also light. The fix was simple: - Use a deeper purple for the banner background - Use white text on it - Make the button text the same deep purple on a white button If you can barely read something when you squint, a visitor with a small screen and bright sunlight will not read it at all. A bonus: make every page do a different job My Home and About pages used the same hero, the same photo and the same story. I changed them: - Home: a short hero, a few skills and clear buttons - About: the full story, what I'm currently learning, and my profiles When two pages say the same thing, a visitor sees no reason to open the second one. It can also confuse search engines. My rules for every change 1. Use only real content. No invented numbers, clients or promises. 2. One change at a time. Then I look at the page on a phone-sized window and a laptop. 3. Remove before adding. Often the best fix was to delete something. 4. Check on a real phone. Some problems only show up there. Wrapping up None of these changes needed a new framework or a big rewrite. They only needed me to look at my own site the way a visitor does. You can see the result here: ritika-rajput-portfolio.vercel.app. I also share videos on RitikaMoments. What is one thing on your portfolio that you know looks unfinished?
おれは松田先生に指導いただいたこともありますからね。 その頃から、シンギュラリティ論者でしたよ。 akiradeveloper/bphcuda
Hi, I’m calling all open-source contributors. We are open to contributions on Semlith repo. semlith/semlith
added borders around claude's final response for better visibility using this mod keshavatearth/for-your-eyes t.co
Releasing the Plume XPU stack, GPL-3.0 • 1.2.0 — Python-free, verified .russ pipeline: LKVexa/Blank-MIMIC-CIMIM • 1.3.0 — vectorised Wasm SIMD engine, 2.3× BF1/thread: LKVexa/MIMIC-CIMIM-Demonstration • SSD-RAM-XPU 1.1.0 — in-storage XPUs, self-healing frames: LKVexa/SSD-and-RAM-based-XPU t.co
Found a fun project — someone open-sourced every date and the whole Zi Wei Dou Shu algorithm Found this on GitHub and thought it was fun: someone open-sourced a Zi Wei Dou Shu engine — 675,000 charts, 56.6 GB of data, covering every single day from 1950 to 2026, plus the full algorithm. Renhuai123/ziwei-doushu Pick any day from 1950 to 2026 and you can look up the chart for it.Not sure if it's been posted here before, just passing it along. But the dataset itself is in Chinese.
Linuxで動く執筆専用マシン「Micro Journal Rev.2.1 mini」の紹介。横8インチなのに縦400pxで数行しか出ない画面、48キーの格子配列メカニカルキーボード、ノブでカーソル移動。中身はRaspberry Pi。 筐体からファームまでGitHubで全部公開されてる。 github.com/unkyulee/micro-journal/tree/main t.co
Harvestmoon BTN PC ported (No need for emulator) + Easy to mod GabrielBigardi/HarvestMoonBTN-Recomp Found a few days ago on github, you just need to follow the installation guide, it worked perfectly for me! All credits to Gabriel Bigardi You need to download a disc image of Harvest Moon: Back to Nature, USA version (SLUS-01115) in .cue + .bin format (search on google) and ask claude or gpt to build if you have difficulty following the guide yourself, it will take less than 3min
flutterfire#18872 割と困っているというか、ワークアラウンドするしかない状況が続いててうーんとなるやつ。
KeepMeOn 原生开源 macOS 在线状态保持工具 可以在用户短暂离开电脑时模拟活动,防止 Microsoft Teams 自动将状态从「有空」变为「离开」,让同事知道你仍然在线。 👉 christianmusumeci00/KeepMeOn t.co
I built a tiny desktop companion that tells me when Claude Code or Codex needs my input I often have a few agent sessions running across VS Code and terminals. Keeping track of which one is working and which one is waiting for an answer gets annoying. So I built Pip, a small animated desktop companion that brings those requests into one place. It can: - Show when an agent is working or needs attention. - Display permission requests, including the command and explanation. - Let you approve or reject supported requests. - Answer Claude Code questions, including custom text responses. - Jump back to the originating VS Code or Terminal session. - Switch between animated characters—including a panda with a laptop 🐼 Under the hood, it uses local Claude Code and Codex hooks to receive events and return supported responses. The agents continue running in their usual environment. The macOS app is built with Swift. There’s also a TypeScript/Electron version for Windows, although Windows support is still experimental and needs more testing. GitHub: manishmalik23/ai-companion I’d love feedback from people running multiple agents: how do you currently keep track of sessions waiting for your input?
@grinich @brian_psu Glad that you were able to counter that! the user agent it is public in the doc as well! They didn´t even bother to mask it. github.com/jiwoochris/artex-global/blob/main/docs…
Open-source AI tool you need to know 📌 Whisper.cpp is a fast C/C++ port of OpenAI's Whisper—running zero-dependency local speech-to-text on Apple Silicon, CPUs, & WASM. 🔗 ggml-org/whisper.cpp Bookmark this for voice AI! #OpenSource #GitHub #AI
Just got my Base Builder Code: bc_4ondkpg4 🛡️ Building secure on-chain AI agents on Base with the Planner/Executor pattern. Open-source code (MIT): meekail1996-a11y/miki-onchain-agent-patterns Feedback welcome 👀 @base @buildonbase
@neil_xbt 69 example folders is a lot for an agent to copy from, so Stageshow updates will matter too. skills-check-updates shows which installed skills changed upstream, and --details lists the commits and changed files. irekrog/skills-check-updates
转 Horizon,旧包还能用吗? Hopper 查兼容:整包拖进去,分内置、移植、能装、还没来,能装一键装。 适合转 Horizon 的玩家,Windows 便携版,未签名、SmartScreen 会警告,先确认来源。 你先查哪个模组,Sodium 还是 Create? #Minecraft #模组 @grok UpperSupervisor/horizon-modpack-compatibility
DeepSeek Built an AI Agent That Stays Quiet An AI agent built to stay quiet. DeepSeek published dsh-superagent-prototype. The README says: "Research prototype for reference only, not an official DeepSeek product." It is a proactive coding agent for one GitHub repository. It acts only when asked or when a rule the team wrote allows it, and speaks only when someone must act or can use a result. Work nobody asked for starts in observe mode, which only records what the agent would have done. Messages, comments and quoted documents cannot change permissions. Bots can never make an explicit request. A web panel shows what needs a person, and stop in the panel is a command. Source: deepseek-ai/dsh-superagent-prototype License: MIT. Credit to the DeepSeek Harness Team. Not affiliated. AI-assisted production (script, voice, diagrams). Visuals are text diagrams only. #NoShortAnswers #opensource #AIagents
启动器卡,搜应用还得等? Nanolight 是 Zig 原生启动器,约 2MB,三系统能用,应用、算术、Google 联想都在面板出。 适合嫌启动器重的人,Raycast 扩展要 Node 20 以上,AI、OAuth、菜单栏不支持。 你最常用它干什么,搜应用还是算数? #启动器 #开源工具 @grok justrach/nanolight
LensTaggerをLightroom Classic無しで使いたいからexiftool用の代替フロントエンドをOpenCodeで自作した QuunQuickKick/lenstagsetter
多个社媒账号,发一条得切好几个后台? LightPost 是自托管发帖面板,一个后台连多账号,写好定时发,还能管草稿、看各账号投递结果。 适合自己管多号、想把排期握在自己服务器上的人,先接一个账号试。 你发帖最烦什么,排期还是多号同步? #自托管 #社媒 @grok brainstormity/LightPost
I made an open source version of Polyfork. Meet Polyspoon. I saw Polyfork charging for AI low poly models made by code.. HOW CAN SOMEONE EVEN THINK OF THAT ? No.. no way.. This can be open source, we as a community can make a better engine for those models and improve it.. anyone can submit a new model or PR to improve the generation code.. They got 500k in cash from a hackathon.. for this.. I couldnt take it.. so i made my own, we can vote models, humans reviews, you can become a reviewer/moderator, you can have a ranking of who has the most voted/best models etc.. Lets make a big ass model market that is free for everyone.. to enter, to participate, to grow and improve. Its very early now, so all models i made are quite bad, and some stuff might break, thats the reality.. but its here and I will keep working on it.. So pls try it out, make some models, its free. I will be reviewing people models by hand to stop racism or porn stuff, but who knows maybe in the future i can add a NSFW store etc.. check it out at polyspoon.com and check the github and star it pls, would help me out.
kavyabarnadhya/multi-model-harness MIT licensed. Mac/Linux testers welcome. Open an issue with what breaks.
Some good amount of PR's merged in open source Have a look here: github.com/repowise-dev/repowise/pulls
默念一句话,不出声,电脑能猜到吗? Subvox 是 Mac 原型,用 AirPods Pro 头动数据测默念转文字,不用大模型,靠模板匹配加统计检验。 验证信号的原型,不是现成输入法,适合有 AirPods Pro 想复现的人,先跑测试。 你会先默念哪个词,名字还是密码? #Mac #AI实验 @grok joeblau/subvox
I made an open source version of Polyfork. Meet Polyspoon. I saw Polyfork charging for AI low poly models made by code.. HOW CAN SOMEONE EVEN THINK OF THAT ? No.. no way.. This can be open source, we as a community can make a better engine for those models and improve it.. anyone can submit a new model or PR to improve the generation code.. They got 500k in cash from a hackathon.. for this.. I couldnt take it.. so i made my own, we can vote models, humans reviews, you can become a reviewer/moderator, you can have a ranking of who has the most voted/best models etc.. Lets make a big ass model market that is free for everyone.. to enter, to participate, to grow and improve. Its very early now, so all models i made are quite bad, and some stuff might break, thats the reality.. but its here and I will keep working on it.. So pls try it out, make some models, its free. I will be reviewing people models by hand to stop racism or porn stuff, but who knows maybe in the future i can add a NSFW store etc.. check it out at polyspoon.com and check the github and star it pls, would help me out.
Wallpaper Engine port for MacOS From last few weeks i have been working on this, WE port for mac, it lets you play WE scene and video wallpapers in your mac. Just download -> steam login -> download wallpaper and play on your device or add your video play them And yes both in **DESKTOP** and **LOCK SCREEN** along with audio bars. there may be some bugs , i am heavily testing this and pushing updates. Wallpapers are major part for my desktop setup , so I thought I should post it here. It takes `300-600mb` when rendering some really heavy scene wallpapers , which is appx `900mb` less than other open source alternative I had tested against. And if you play only video it just takes `25mb` memory. If you guys wanna try, download from the releases page, what ever latest version available . And let me know which wallpapers giving problem. [Releases Page](github.com/NOOB-3301/LiveWallpaper/releases) | [Github](NOOB-3301/LiveWallpaper) | [Website](paperflowmac.vercel.app)
I mean @HackingLZ Could you tell something? The ¨attacker¨ didn´t even change the useragent 😮💨 github.com/jiwoochris/artex-global/blob/main/docs…
QwenGram boosts smaller Qwen model performance by transferring the n-gram PLE (Engram memory) from Qwen3.8-Flash-Next. Worth a look: Ninnix/qwen-ple-transfer
締め切りやばくてイベント行けなかったので、P-TOUCH CUBEのラベルメーカーつくってます。 検証&コントリビュートゆるぼしてます〜。デフォルトでスタックチャン顔を選べたっていい。みんなでラベル職人になりましょう(?) 🖤RRYZ09/p-touch-cube-mcp 🤍rryz09.github.io t.co
Ratchet and Clank is now playable in #VR on #Quest3 ! 🔗github.com/moistman42069/RatchetAndClank-Quest-VR… Thanks to "Todiogames" for Video. Thanks to "MewhenInamemyself" for creating the standalone port t.co
Your Canvas Is Freezing the Page. OffscreenCanvas Fixes That. You open the profiler, record a session, and the flame chart looks great. 60 frames a second, steady, no dropped frames. You ship it. Then someone clicks a button while the animation is running, and for half a second, nothing happens. Not a dropped frame — the whole page. The click just sits there, queued, waiting for a thread that's busy painting pixels nobody asked it to interrupt. Here's the part that doesn't show up in a frame-rate graph: your canvas animation was never competing with itself. It was competing with every click handler, every layout pass, every bit of input handling on the page — because by default, all of that runs on exactly one thread, and canvas drawing calls are first-class citizens on it. The fix everyone reaches for first The instinct is to blame the math. Heavy canvas work — thousands of particles, a live chart redrawing every tick, a game loop doing collision checks — looks like a computation problem, so people reach for a Web Worker to do the computation off-thread. // main.js const worker = new Worker("particles-worker.js"); worker.postMessage({ type: "tick" }); worker.onmessage = (e) => { const positions = e.data.positions; // ...now draw them, back on the main thread ctx.clearRect(0, 0, canvas.width, canvas.height); for (const p of positions) ctx.fillRect(p.x, p.y, 2, 2); }; This genuinely helps — the position math moves off the main thread. But watch what's still happening in that onmessage handler: clearRect, fillRect, every actual drawing call, is still running on the main thread, because that's the only thread with access to the <canvas> element's rendering context. You moved the arithmetic. You didn't move the part that was actually fighting your clicks for time. The part that's easy to miss: drawing itself blocks the page A <canvas> element's 2D or WebGL context has always been tied to the DOM, and anything tied to the DOM only exists on the main thread. That's not a performance detail, it's a structural one: a worker has no document, so it has never been able to hold a canvas context at all — until there was a way to give it one that isn't attached to the page. That's what OffscreenCanvas is. Not a faster canvas. A canvas whose rendering context can live somewhere other than the main thread, so the fastest possible canvas is one where the drawing calls stop queuing up behind your click listeners in the first place. The fix: move the context itself into the worker <canvas id="scene" width="600" height="400"></canvas> // main.js const canvas = document.getElementById("scene"); const offscreen = canvas.transferControlToOffscreen(); const worker = new Worker("render-worker.js"); worker.postMessage({ canvas: offscreen }, [offscreen]); // the main thread still owns input — forward what the worker needs canvas.addEventListener("pointermove", (e) => { worker.postMessage({ type: "pointer", x: e.offsetX, y: e.offsetY }); }); // render-worker.js let ctx; let pointer = { x: 0, y: 0 }; self.onmessage = (e) => { if (e.data.canvas) { ctx = e.data.canvas.getContext("2d"); requestAnimationFrame(loop); } if (e.data.type === "pointer") pointer = e.data; }; function loop() { ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.beginPath(); ctx.arc(pointer.x, pointer.y, 20, 0, Math.PI * 2); ctx.fill(); requestAnimationFrame(loop); } transferControlToOffscreen() detaches the canvas element from its own rendering context and hands you an OffscreenCanvas you can transfer to a worker like any other transferable object. Inside the worker, getContext("2d") gives back something that draws almost exactly like the context you're used to — same fillRect, same beginPath, same drawImage — except every one of those calls now runs on a thread that has nothing else to do but draw. The one thing that doesn't come along for free is input. A worker has no DOM, so it can't attach its own pointermove or click listeners to anything. The main thread stays the one place that owns events, and your job is to forward the few fields the worker actually needs — as shown above, just x and y, not the whole event object, which isn't transferable anyway. Why the page stays responsive now Open two tabs in your head. In the first, with everything on the main thread, a click has to wait in the same queue as every pending fillRect call — if the canvas is mid-frame, the click waits for the frame to finish. In the second, with OffscreenCanvas, the canvas's frame is happening on a different thread entirely. The main thread's event queue is short again, because the one thing that used to dominate it moved out. This is the distinction worth sitting with: OffscreenCanvas doesn't make your particle system compute faster, and it doesn't raise your frame rate. It makes the main thread's queue shorter by taking an entire category of work out of it. A canvas that was drawing 10,000 particles at 60fps before will still be drawing 10,000 particles at roughly 60fps after — the difference is that a click, a keypress, or a scroll now gets handled in the same frame instead of after it. <!-- playground:start --> 🎮 Try it yourself ▶️ Open the interactive playground → _Runs right in your browser — poke at it and watch the concept react live._ <!-- playground:end --> When the main thread was fine all along Not every canvas needs this. A sparkline that redraws once when new data arrives, a static chart, an icon you draw once on mount — none of that is holding the main thread hostage, because none of it is running every frame. The tell isn't "I use canvas," it's "my canvas work and my users' clicks are both trying to happen right now, repeatedly, for as long as the page is open." Games, live data visualizations, drawing tools, anything with a requestAnimationFrame loop that runs indefinitely — that's the category where this earns its complexity. It's also not free complexity. You lose direct DOM access inside the worker, so anything that reads layout, measures text against real fonts in edge cases, or needs synchronous access to other page state has to be designed around message passing from the start, not bolted on later. Is this safe to ship today? Yes. Chrome has supported OffscreenCanvas since 2018, Firefox enabled it for workers a few years after that, and Safari was the last to land it, in Safari 16.4 in March 2023. All three major engines have carried it for a while now, so there's no meaningful fallback story you need to write — check "OffscreenCanvas" in window if you want a belt-and-suspenders guard, but you're unlikely to need it. The next time a profiler shows you a perfectly smooth 60fps canvas sitting on top of a page that still stutters when someone clicks, you'll know the frame rate was never the number that mattered. What's the heaviest thing you're currently drawing to a <canvas> on the main thread? I'm curious how many of you are one transferControlToOffscreen() call away from fixing a bug you've been blaming on something else. <!-- quiz:start --> 🧠 Test yourself Think it clicked? Take the 7-question quiz → _Instant feedback, a hint on every question, and an explanation for each answer — right or wrong._ <!-- quiz:end --> <!-- related:start --> 📚 Read next - Your UI is freezing because you never gave the browser a break - localStorage Isn't Free — It's Blocking Your Main Thread - Your Tabs Each Open Their Own WebSocket. navigator.locks Elects One. <!-- related:end --> --- 🚀 Want more like this? Every guide, playground, and quiz lives on bestpractic.org — open it and sign up free so the next one finds you. Thanks for reading! Let's stay connected: - ⭐ GitHub — follow me and star the projects: github.com/parsajiravand - 💬 Discord — join the frontend best-practices community: discord.gg - 📸 Instagram — frontend best practices, daily: @bestpractice___
@bentlegen Ben are you stealing my OSS?? Boxdown lirantal/boxdown
StandUp Pal 1.7 🌙 At 8 pm my fitness pet shuts its laptop, yawns, walks to bed and tells me to log off too. "Off to bed" turns the screen off. Still at the Mac half an hour later? It checks again 👀 Free & open source 👇 github.com/deus42/standup-pal/releases/tag/v1.7.0 t.co
BEEP-8: call for C/C++ coders. ARM 4MHz, 1MB RAM, 60fps, browser fantasy console. Free SDK — join our retro dev team! #RetroGame #PixelArt #IndieDev #beep8 #Cplusplus #RetroDev #IndieGameDev 🕹️ beep8/beep8-sdk
Basically free wallpapers and background designs for eternity I'm a product/web designer and I solved one of the biggest problems I had. Halation is an infinite canvas where you can design, download and share your perfect background designs. It's completely open source and runs on your browser. It was a really fun side project and I dont gain anything, but a star on github would be awesome :p Repo: AR13X3/halation Live: ar13x3.github.io
Next.js 16.4 ensureStatic: Locking Routes Fully Static You ship a route you're sure is fully static. A teammate adds one fetch() call to a shared layout three weeks later — no cache directive, just a quick lookup they needed for a banner. Nothing errors. The build succeeds. The route still "looks" static in dev. It isn't anymore: that one call now forces the whole subtree to render on every request, and nobody notices until the latency dashboard does. This is written against Next.js 16.4.3 (verified against the framework's own GitHub release notes and documentation as of October 2026). The guardrail for exactly this scenario — ensureStatic — was stabilized in 16.4.0, after shipping unstable for a few releases. This series mentioned it in passing two weeks ago; this episode is the first real look at what it actually checks, and what it refuses to let you ship. What you'll learn By the end of this article you'll be able to: - Explain what ensureStatic actually guarantees, and why "the page renders fast in dev" isn't the same guarantee - Pick the right level — 'shell', 'prefetch', or 'navigation' — for a given route - Predict exactly which build failures ensureStatic = 'navigation' will produce, before you hit them - Apply the inheritance rules correctly across layouts, nested segments, and parallel routes - Tell ensureStatic apart from instant, a different, dev-time-only check with a similar name Who this is for: you're comfortable with the App Router and Server Components, and you've enabled Cache Components (cacheComponents: true) or are about to. If "use cache", cacheLife(), and the App Shell are new to you, this series' Cache Components Explained and Instant Navigations: How Partial Prefetching Works cover the pieces ensureStatic builds on — worth reading first, not required before this one makes sense. Contents - [The problem: "static" with no guarantee](#the-problem-static-with-no-guarantee) - [The mental model: four levels, one escalating promise](#the-mental-model-four-levels-one-escalating-promise) - [Staged walkthrough: shell, then prefetch, then navigation](#staged-walkthrough-shell-then-prefetch-then-navigation) - [What 'navigation' actually validates](#what-navigation-actually-validates) - [Edge cases and inheritance rules](#edge-cases-and-inheritance-rules) - [ensureStatic vs instant](#ensurestatic-vs-instant) - [Best practices](#best-practices) - [FAQ](#faq) - [Cheat sheet](#cheat-sheet) - [Key takeaways](#key-takeaways) The problem: "static" with no guarantee Say you run a documentation site. Every page lives under a shared layout — header, sidebar nav, footer — and the page content itself is cached: // app/docs/layout.tsx — looks static, isn't guaranteed to stay that way export default function DocsLayout({ children }: { children: React.ReactNode }) { return ( <div className="docs-shell"> <Header /> <Sidebar /> <main>{children}</main> </div> ) } // app/docs/[slug]/page.tsx async function getDoc(slug: string) { "use cache" return db.docs.findBySlug(slug) } export default async function DocPage({ params }: { params: Promise<{ slug: string }> }) { const { slug } = await params const doc = await getDoc(slug) return <Article doc={doc} /> } This is genuinely fast today. Nothing in the visible code is wrong. But nothing here asserts that it stays fast. Three weeks later someone adds a personalized "you're on the free plan" banner to <Header />, reading a cookie with a plain fetch to an account API — no "use cache", because it's "just a header, it's small." That one read makes the header request-scoped, which makes the layout request-scoped, which pulls every page under app/docs/ back to rendering per request. The build still succeeds. Nothing in the PR review catches it, because the diff is three lines in a component nobody thinks of as "the caching layer." ensureStatic exists so that instead of discovering this in a latency graph, you discover it as a build failure, pointing at the exact file and the exact API call that broke the guarantee — the moment it's introduced, not the moment someone notices the site got slower. The mental model: four levels, one escalating promise ensureStatic is a route segment config — exported from a page.tsx or layout.tsx, the same place you'd put dynamic or revalidate in the Pages Router-era App Router code. It requires Cache Components (cacheComponents: true) to be enabled; without it, exporting ensureStatic fails the build outright rather than doing nothing. type EnsureStatic = 'auto' | 'shell' | 'prefetch' | 'navigation' | false Each value names a different amount of the route's navigation lifecycle that must be static — and that lifecycle is the same one last episode's App Shell and Partial Prefetching work defines: 1. A default <Link> (no prefetch prop) loads the App Shell — the parts of the route that don't depend on URL data. 2. <Link prefetch={true}> also resolves that specific link's URL-dependent data ahead of the click. 3. The actual navigation renders whatever is left after someone clicks. | Value | What must be static | | --- | --- | | 'auto' (default — same as omitting the export) | Nothing extra required | | 'shell' | The App Shell loaded by a plain <Link> | | 'prefetch' | The App Shell and every per-link prefetch | | 'navigation' | The complete rendered route, including what streams in after the click | | false | No requirement — and it blocks child segments from requiring one either | Read it as an escalating promise: 'shell' is the cheapest to satisfy (it only constrains what's shared across every route under that layout), 'navigation' is the strongest (it constrains the entire page, every time, for everyone). 'shell' and 'prefetch' only mean anything when Partial Prefetching is on — without it there's no separate shell stage to pin down, so 'shell' quietly does nothing and logs a warning. 'navigation' is different: it only needs Cache Components, not Partial Prefetching, because it's asserting something about the full render, not about a separate shell stage. Staged walkthrough: shell, then prefetch, then navigation Take a small storefront: a cart layout shared by everything, product pages, and static buying guides. Step 1 — lock the shell. The cart layout reads a cookie to show an item count — personalized, so it can't be part of the shell. Wrap it in <Suspense> with a static fallback, then assert the rest of the layout stays shell-eligible: // app/(store)/layout.tsx export const ensureStatic = 'shell' export default function StoreLayout({ children }: { children: React.ReactNode }) { return ( <> <nav> <Logo /> <Suspense fallback={<CartBadge count={null} />}> <CartCount /> {/* reads a cookie — fine, it's inside Suspense */} </Suspense> </nav> {children} </> ) } If anyone later moves cookie-reading code above that Suspense boundary — directly into StoreLayout — the build fails immediately, naming the offending file. That's the whole point: the mistake from the earlier docs example gets caught here instead of in production. Step 2 — lock prefetch. Product pages are cached with "use cache", but the "in your cart" badge on each product card is personalized. ensureStatic = 'prefetch' on the product list route asserts every one of those per-link prefetches resolves to static output — so hovering over twenty product cards doesn't fire twenty personalized round-trips: // app/(store)/products/page.tsx export const ensureStatic = 'prefetch' async function getProducts() { "use cache" cacheLife({ stale: 300, revalidate: 3600, expire: 86400 }) return db.products.findAll() } Step 3 — lock full navigation. Buying guides are plain marketing content — no personalization, no request-time data, ever. That's the one case worth the strongest guarantee: // app/(store)/guides/[slug]/page.tsx export const ensureStatic = 'navigation' export async function generateStaticParams() { const guides = await db.guides.findAllSlugs() // must enumerate every slug return guides.map((g) => ({ slug: g.slug })) } async function getGuide(slug: string) { "use cache" cacheLife({ stale: 3600, revalidate: 86400, expire: false }) return db.guides.findBySlug(slug) } Here the whole page — not just a shared layout slice — must render to static output, for every one of the slugs generateStaticParams returns. What 'navigation' actually validates 'navigation' is the level worth understanding precisely, because it's the one that turns real mistakes into real build errors instead of silent regressions. With cacheComponents on, exporting ensureStatic = 'navigation' from a page makes the build (and the dev server) reject: - Uncached data — a bare fetch() or database call with no "use cache" wrapping it, and connection() (the explicit "this must be dynamic" escape hatch) - Runtime-only APIs — cookies(), headers(), or searchParams read on the server - Cache entries that are effectively dynamic anyway — "use cache" with an expire under five minutes, a stale under 30 seconds, or revalidate: 0; a cache that invalidates that fast isn't meaningfully static - Request-dependent promises passed into a Client Component — even if the server code itself looks cached, handing a promise whose value depends on the current request across the server/client boundary reintroduces a per-request dependency Dynamic segments must also export a generateStaticParams() that returns the complete set of params — a partial list isn't enough once you've promised the whole route is static. The same constraints apply to generateMetadata and generateViewport, since metadata generated from a live cookies() read would just as quietly break the promise. Edge cases and inheritance rules A few rules exist specifically to stop you from creating a guarantee that only holds in one place: - A child segment can tighten freely, but can't explicitly downgrade. A layout exporting 'shell' can have a page under it export 'navigation' (stronger) — that builds fine. Exporting 'auto' on that same page also builds fine: 'auto' is always treated as "no opinion," so it never conflicts with an ancestor's value — the layout's 'shell' requirement just keeps applying to the page underneath it. What actually fails the build is a child exporting a weaker concrete level than an ancestor already set, e.g. a page exporting 'shell' under a layout that requires 'navigation' — that's a real contradiction, not a deferral, and Next.js rejects it by name. - false and a level don't mix in the same tree. If a parent is false and a child tries to set 'shell', the build fails — false isn't "no opinion," it's an explicit "nothing here is required to be static," and a child can't retroactively impose a requirement its parent already waived. - Parallel routes rendered together must agree. If two parallel slots render side by side, they must all share the same ensureStatic value, leave it unset, or use 'auto' — one slot can't be 'navigation' while its sibling is 'shell'. - A value applies to the whole route it's exported from, parent layouts included — exporting it from a deep page doesn't exempt the layouts above it from the same requirement. ensureStatic vs instant They sound similar and ship in the same release, which invites confusing them. They check different things: - ensureStatic is a build-time (and dev-time) enforcement. Export it, and the build fails if the promise doesn't hold. It's a contract. - instant is a dev-time signal, not an enforced contract — it's a way to see, during development, whether a given navigation would paint instantly under the current code, without failing your build if it wouldn't. Use instant while you're exploring which routes are candidates for a stronger guarantee. Use ensureStatic once you've decided one of them needs that guarantee enforced going forward, not just observed today. Best practices - Start at 'shell' on your root and section layouts, not 'navigation' on every page — the shell is shared infrastructure, and locking it first catches the highest-leverage mistakes (a stray cookie read in a header) for the least ongoing cost. - Reserve 'navigation' for routes that are genuinely public and non-personalized — marketing pages, docs, buying guides. Forcing it onto a route that legitimately needs request-time data just means fighting the build instead of fixing the model. - Add it when a route is already correct, not to force it correct. ensureStatic is a regression guard, not a refactoring tool — get the caching right first with "use cache" and cacheLife(), confirm it behaves, then lock it in. - Treat a new ensureStatic build failure as a real signal, not an obstacle. It is almost always telling you that something just became request-scoped that your team didn't intend to make request-scoped. - Don't apply 'prefetch' to a route with dozens of simultaneously-visible links unless the per-link data is genuinely cheap and cached — it's an opt-in cost, not a free upgrade from 'shell'. FAQ Does ensureStatic work without Cache Components? No. It requires cacheComponents: true; exporting it without that flag fails the build rather than silently doing nothing. Can I export ensureStatic from a Client Component? No — doing so throws an error. It's a server-side route segment config, like dynamic or revalidate before it. Does 'shell' do anything if I haven't enabled Partial Prefetching? No. 'shell' and 'prefetch' only have teeth once Partial Prefetching is on — without it, Next.js logs a warning and the export has no effect. 'navigation' doesn't have this dependency; it works from Cache Components alone. What if I only want to guard one slow subtree, not the whole route? ensureStatic is a whole-route (or whole-layout) assertion. For a single subtree, the docs point to deferring it explicitly with await prefetch() (skip it during link prefetch) or await navigation() (skip it until the click) instead of reaching for a route-level export. Is this the same as the old export const dynamic = 'force-static'? No, and this is the important distinction. force-static (and dynamic generally) sets the rendering mode for the entire route as one unit, pre-Cache-Components. ensureStatic is built for a world where one route can legitimately mix prerendered, cached, and request-time content — it asserts a static guarantee over a specific slice (shell, prefetch, or full navigation) of a route that's otherwise allowed to be mixed. Will I hit this if I'm still on Next.js 15? No — ensureStatic is a 16.4+ API, and it depends on Cache Components, which itself isn't the default until a later major. On 15.x, write around it rather than approximating it with force-static, which doesn't carry the same per-slice guarantee. <!-- playground:start --> 🎮 Try it yourself ▶️ Open the interactive playground → _Runs right in your browser — poke at it and watch the concept react live._ <!-- playground:end --> Cheat sheet ensureStatic values (route segment config, requires cacheComponents: true): 'auto' — default, same as omitting the export. No extra requirement. 'shell' — the App Shell (needs Partial Prefetching; else: warning, no-op) 'prefetch' — App Shell + every per-link prefetch (needs Partial Prefetching) 'navigation' — the full rendered route (Cache Components alone is enough) false — no requirement; blocks children from requiring one 'navigation' build fails on: • fetch()/db call with no "use cache" • cookies() / headers() / searchParams • connection() • use cache with expire < 5m, stale < 30s, or revalidate: 0 • request-dependent promise passed to a Client Component • dynamic segment missing a complete generateStaticParams() Inheritance: • child can set a stronger concrete level freely (shell → prefetch → navigation) • child exporting 'auto' is always compatible — defers to the ancestor's level, never fails the build • child exporting a weaker CONCRETE level than an ancestor already set → build fails • false + a level in the same tree → build fails • parallel routes rendered together must share the same value (or 'auto'/unset) Not the same as: dynamic = 'force-static' (whole-route, pre-Cache-Components) Not the same as: instant (dev-time signal, not an enforced build contract) <!-- quiz:start --> 🧠 Test yourself Think it clicked? Take the 10-question quiz → _Instant feedback, a hint on every question, and an explanation for each answer — right or wrong._ <!-- quiz:end --> Key takeaways - ensureStatic turns "I'm pretty sure this route is static" into something the build actually checks, with four levels of increasing strength: 'auto', 'shell', 'prefetch', 'navigation'. - It requires Cache Components; 'shell' and 'prefetch' additionally require Partial Prefetching, while 'navigation' stands on Cache Components alone. - 'navigation' validates specifically: no uncached fetches, no runtime APIs, no short-lived cache entries, no request-scoped promises crossing into Client Components, and a complete generateStaticParams(). - A child can freely set a stronger level, and 'auto' on a child never conflicts — but explicitly exporting a weaker concrete level than an ancestor already set fails the build, and parallel routes rendered together must agree. - It's a regression guard for routes you've already made static, not a tool for making them static — and it's a different thing entirely from the dev-time instant signal. That cookie read someone adds to a shared header three weeks from now doesn't have to be a latency regression you discover in a dashboard. With ensureStatic on the layout it depends on, it's a build failure with your name on the stack trace — which is a much better place to find it. <!-- related:start --> 📚 Read next - Next.js 16 updateTag vs revalidateTag: What Changed - Next.js proxy.ts Explained (with Cheat Sheet) - Next.js Route Handlers: GET Stopped Caching in 15 — How to Cache in 16 <!-- related:end --> --- 🚀 Want more like this? Every guide, playground, and quiz lives on bestpractic.org — open it and sign up free so the next one finds you. Thanks for reading! Let's stay connected: - ⭐ GitHub — follow me and star the projects: github.com/parsajiravand - 💬 Discord — join the frontend best-practices community: discord.gg - 📸 Instagram — frontend best practices, daily: @bestpractice___