Mentions

Conversations linking to GitHub, newest first. Times are UTC.

Mentions by source

X

6,044
Nov 8, 01:00Nov 9, 01:00

Bluesky

2,020
Nov 8, 04:00Nov 9, 04:00
Nov 8, 03:00Nov 9, 03:00
Nov 8, 03:00Nov 9, 03:00
Nov 8, 04:00Nov 9, 04:00
Nov 8, 03:00Nov 9, 03:00
Nov 8, 03:00Nov 9, 03:00
Nov 8, 04:00Nov 9, 04:00
Oct 14, 21:00Oct 15, 21:00

Delayed · data through Oct 15, 21:00 UTC

DEV

729
Nov 8, 04:00Nov 9, 04:00
Nov 8, 04:00Nov 9, 04:00
Nov 8, 01:00Nov 9, 01:00
Nov 8, 04:00Nov 9, 04:00
Oct 28, 01:00Oct 29, 01:00

Delayed · data through Oct 29, 01:00 UTC

Zenn

104
Nov 8, 04:00Nov 9, 04:00
Nov 8, 04:00Nov 9, 04:00

Latest posts

  1. X@gitrepos · 2 likes · 139 views

    OwnPilot ⭐ 429 OwnPilot is an AI assistant platform with autonomous agents, built for developers. 🔗 ownpilot/OwnPilot #opensource t.co

  2. DEV@gabrielanhaia · 1 reaction · 1 comment

    Why One Emoji Breaks Your Coding Agent's TUI Borders: wcwidth vs Grapheme Clusters - Book: AI That Acts - The series: AI in TypeScript — 5 books, from your first LLM call to agents in production — all five here - My project: Hermes IDE | GitHub — an IDE for developers who ship with Claude Code and other AI coding tools - Me: xgabriel.com | GitHub --- Paste 🫪 into Claude Code 2.1.207 and the text after it slides one cell to the right. That is the report in anthropics/claude-code#80475, opened July 23, 2026: stray characters bleeding into neighbouring rows, inverse-video blocks between words, and a mess that stays until Ctrl-L or a window resize forces a full repaint. The emoji is U+1FAEA, DISTORTED FACE, which arrived with Unicode 17.0 in 2025. The terminal drew it two cells wide. Claude Code's width table was older than the emoji and counted fewer. In the maintainer's closing comment, the fix "came from updating the Unicode width tables in the runtime Claude Code ships with," and from 2.1.221 on, both 🫪 and 🫩 (U+1FAE9, FACE WITH BAGS UNDER EYES, reported later in the same thread) measure as two cells. Claude Code and the terminal disagreed on how many columns U+1FAEA takes, and every cell after it inherited the gap. Two programs, one grid A terminal is a grid of cells. A TUI like Claude Code, Codex or Gemini CLI never sees that grid. It writes bytes, and to draw a box it has to predict where the cursor will be after each string. The right border of a box sits at "left edge plus the width I computed." The terminal then advances the cursor by the width it computed. When those two numbers agree, borders line up. When they differ by one, everything the program draws after that character lands one column off, and every partial redraw targets the wrong cells. That is why these bugs show up as smearing and duplicated lines across the whole screen. kitty's text sizing protocol docs put it bluntly: if the client program and the terminal disagree on cell counts, "the entire user interface can be broken". !A terminal grid with two rulers, one from the program and one from the terminal, measuring the same emoji tile and ending one cell apart The program and the terminal each measure the same character. One cell of disagreement moves every border after it. Three counts, none of them is width Start with what JavaScript can count. Save this as count.mjs and run it with node count.mjs: const seg = new Intl.Segmenter("en", { granularity: "grapheme", }); const samples = { ascii: "A", cjk: "中", heart: "\u{2764}", heartVS16: "\u{2764}\u{FE0F}", thumbTone: "\u{1F44D}\u{1F3FD}", family: "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}", distorted: "\u{1FAEA}", }; console.log("ICU Unicode:", process.versions.unicode); for (const [name, s] of Object.entries(samples)) { const units = s.length; const points = [...s].length; const clusters = [...seg.segment(s)].length; console.log(name.padEnd(10), s, units, points, clusters); } .length counts UTF-16 code units. Spreading the string counts code points. Intl.Segmenter counts grapheme clusters, which UAX #29 defines as user-perceived characters. Its rule GB11 says: "Do not break within emoji modifier sequences or emoji zwj sequences." The family is three emoji glued together by two ZERO WIDTH JOINERs (U+200D), so it is five code points and eight UTF-16 units but one grapheme, while the skin-tone thumbs-up and the heart followed by U+FE0F are two code points and one grapheme each. A Chinese character is one code point and one grapheme, and it still takes two cells. The first line prints the Unicode version your Node's ICU knows. The Node docs example shows unicode: '17.0'. Unicode 18.0 is dated September 16, 2026. Every program that measures width carries a snapshot of some version, and they are rarely the same snapshot. Now draw a box the naive way, one cell per code point: const rows = [ "plain text", "中文", "\u{2764}\u{FE0F} ok", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467} team", ]; const width = (s) => [...s].length; const inner = 16; const edge = "+" + "-".repeat(inner) + "+"; console.log(edge); for (const r of rows) { console.log("|" + r + " ".repeat(inner - width(r)) + "|"); } console.log(edge); The plain-text row lines up. The 中文 row overshoots by two cells in every terminal, because each character is one code point and two cells. The heart and family rows are where terminals disagree: run the script in two emulators and compare where those right borders land. Where width actually comes from The width a terminal assigns usually starts from the East_Asian_Width property in UAX #11. Its values are A (ambiguous), F (fullwidth), H (halfwidth), N (neutral), Na (narrow) and W (wide). W and F take two cells, and W also covers "characters that have the UTS51 property Emoji_Presentation." For ambiguous characters the annex says: "If the context cannot be established reliably, they should be treated as narrow characters by default." That covers single code points. Emoji sequences are where the tables run out. UTS #51 defines U+FE0F, VARIATION SELECTOR-16, as the character "used to request an emoji presentation." The plain heart U+2764 has no Emoji_Presentation, so on its own it is a text-style, one-cell character. Add VS16 and you ask for the two-cell emoji. A per-code-point width function sees one narrow character plus a variation selector that takes no cells of its own, and so the total depends on whether the function knows the sequence. The Python wcwidth library documents exactly this split. wcwidth('\U00002640'), the plain ♀ (U+2640), is 1. wcswidth('\U00002640\U0000FE0F'), the same sign with VS16, is 2. Ask for VTE's behaviour with wcstwidth(..., term_program='vte') on that same VS16 string and the docs show 1. Its four-person family example measures 2 by default and 8 with term_program='alacritty', a correction the docs put down to Alacritty not supporting emoji ZWJ. Here is the Python side of the same experiment: # pip install --upgrade wcwidth import unicodedata from wcwidth import wcwidth, wcswidth print("UCD", unicodedata.unidata_version) for ch in ["A", "中", "\U00002764", "\U0001FAEA"]: eaw = unicodedata.east_asian_width(ch) print(f"U+{ord(ch):04X}", eaw, wcwidth(ch)) print(wcswidth("\U00002640\U0000FE0F")) # wcwidth docs: 2 unicodedata follows the Python release, not the wcwidth package. The Python 3.15 docs say its data comes from UCD 17.0.0. An older interpreter or an older wcwidth will give a different answer for U+1FAEA, which is the same kind of mismatch as the Claude Code bug. It goes the other way too. In gemini-cli#25369, Ink, the React renderer Gemini CLI draws with, used Intl.Segmenter to merge a Thai consonant and SARA AM (U+0E33) into one cluster of width 1, while tmux and xterm.js drew it across two columns. The symptom was one streamed line repeated 8 to 10 times and an input line that kept jumping down. It was closed as completed on October 23, 2026, via PR #29883. This time the program was the one counting by clusters, and the terminal in front of it counted differently. !Three code points, a man, a woman and a girl, fusing through two joiner links into one emoji tile on a terminal grid A ZWJ sequence is several code points and one grapheme. Whether it takes two cells or eight depends on who is counting. Mode 2027: asking the terminal to count graphemes Some terminals now let a program opt into one shared rule. Contour's terminal-unicode-core spec defines DEC private mode 2027. CSI ? 2027 h turns it on, CSI ? 2027 l turns it off, and CSI ? 2027 $ p asks whether the terminal supports it. With the mode on, a grapheme cluster lives in one place on the grid, and a VS16 in the cluster promotes it to emoji presentation, which makes it two cells wide. You can probe your terminal from Node: process.stdin.setRawMode(true); const timer = setTimeout(() => done("no reply"), 500); function done(msg) { clearTimeout(timer); process.stdin.setRawMode(false); console.log(msg); process.exit(0); } process.stdin.once("data", (b) => done(JSON.stringify(String(b)))); process.stdout.write("\x1b[?2027$p"); The answer is a DECRPM report shaped like CSI ? 2027 ; Ps $ y. Ps 0 means the terminal doesn't recognise the mode, 1 means it is set, 2 means reset, 3 and 4 mean permanently set or reset. The timeout matters: a terminal that ignores the query sends nothing at all. Support is uneven. In the ucs-detect results, which measure terminals by printing test strings and asking for the cursor position afterwards, Ghostty, WezTerm, foot and Windows Terminal report mode 2027. kitty, iTerm2, Alacritty and xterm.js do not. The page gives no test date and says results are provided as-is, so check the version next to each row. Ghostty exposes the trade-off as a setting. grapheme-width-method defaults to unicode, which the docs call correct but able to desync the cursor with programs that measure the legacy wcswidth way. legacy matches those programs and can get skin-tone emoji wrong. A program that turns on mode 2027 forces unicode regardless. kitty went a different direction with OSC 66, where the program states the width with w= and the terminal stops guessing. The two-pane test Put two agent TUIs side by side and the disagreement becomes something you can locate. I build Hermes IDE, so weigh this section with that in mind. Hermes runs every agent's own interface in a real terminal and lets you split panes right or down, so Claude Code and Codex can sit next to each other on the same screen. !Two agent sessions side by side in Hermes IDE: Codex on orders-types and Claude Code on orders-api, each in its own hermes/ worktree, with the sessions sidebar on the left Hermes IDE 2.3.4: Codex on orders-types and Claude Code on orders-api, side by side, each in its own hermes/ worktree, with the sessions sidebar showing status, context use, cost and branch. Paste the same string with an emoji into both. Both panes live in the same app, so the terminal side of the comparison stays fixed. If one pane's border breaks and the other's holds, the difference is in the agents. Codex's TUI is built on Ratatui and pulls in the unicode-width and unicode-segmentation crates (its Cargo.toml), and Claude Code ships its own width tables in its runtime, so the two can carry different Unicode snapshots. Then flip it. Run the same agent in a second terminal emulator. If the border is fine there, the agent agrees with that emulator and the first one is the odd one out. The rest is cheap: 1. Update the agent first. claude update is the whole fix for #80475. 2. Repaint with Ctrl-L or a resize to clear a smeared screen. 3. Keep fresh emoji out of the strings an agent draws in its chrome: session names, branch names, status lines. 4. If you write a TUI, measure grapheme clusters, query mode 2027 and turn it on when the reply shows the mode is recognised (Ps 1 or 2). Where it isn't, test against the terminals your users actually run. Hermes is free, source-available under BSL 1.1, and runs on macOS, Windows and Linux. It isn't affiliated with Nous Research, Anthropic, OpenAI or Google. Download it and the source is on GitHub. Finding the character Next time an agent's box comes out with a jagged right edge, skip the font settings and find the character just before the break. Compare the width your agent gives it with the width your terminal draws, then check which Unicode version each was built with. If the versions match, compare how each one segments that cluster; the Gemini CLI Thai bug was that kind. --- If this was useful If you're building your own agent in TypeScript, the terminal is only the surface. AI That Acts covers the part underneath it: tool calling, functions, and getting a first working agent to do real work in Node, so the thing drawing those borders has something worth showing. ![AI That Acts — AI in TypeScript](amazon.com) It is book 3 of AI in TypeScript, a five-book series that runs from your first LLM call to agents in production. ![AI in TypeScript — the five-book series](xgabriel.com)

  3. 🚗 Livery Organizer for FH6 車種データ更新! FH6公式リストの11月公開分667車種に対応(10車種追加)。一部の車名も修正。 アプリ内「車種データ更新確認」から更新できます。 yomogigari/fh6-livery-organizer #ForzaHorizon6 #FH6 #LO4FH6

  4. X@kind_technology · 1 like · 13 views

    @Creatives_Rule @X Hey there, I am tech youtuber(youtube.com) and developer. Let's connect 🤝 AleksandarDamnjanovic/Forge-Node

  5. Seven things happened in AI today; the one worth your attention is Reflex. Here is the rundown. 💰 1. Reflex: Reflex reportedly raised $14M in a Series A led by Standard Capital with Databricks Ventures participating, bringing its total funding to $19M (reported). techbuzz.ai 🔬 2. Kakeya conjecture: OpenAI and Anthropic reportedly claim to have solved the 27‑year‑old Kakeya conjecture, releasing the result after expert advice recommended publishing it as‑is (reported). science.org 🚀 3. GPT-6.1 Terra: OpenAI announced GPT-6.1 Terra, a visual‑reasoning model that scored 51 on AAII v5 and is offered via ChatGPT Work, Codex and the API with standard prices of $1‑$5 per million output (announced). patmcguinness.substack.com 💰 4. Anthropic: Anthropic reportedly filed for an IPO, a corporate event documented in a federal registration statement (reported). medium.com 🔐 5. New York’s RAISE Act: The RAISE Act, pre‑filed in New York, expands the definition of a critical safety incident to include model evasion of developer controls and adds state access to unredacted model copies (announced). transparencycoalition.ai 🛠️ 6. Mellea Legal Requirements Checker (Mellea-LRC): The researchers announced Mellea‑LRC, an open‑source tool that flags AI‑generated hallucinated legal citations and includes a new validation dataset on Hugging Face for benchmarking (announced). newswise.com 🔐 7. Humans First: The Humans First AI safety group reportedly urged tighter vetting of foreign AI workers and stronger guardrails, warning that unchecked expansion and lack of federal oversight could pose national security risks. foxnews.com 💾 Save this if you are tracking AI releases and funding. Daily AI digest, with a source link under every item. --- Originally shared on LinkedIn. An AI interview question every day, leadership for tech people and hands-on AI learning: - Follow me on LinkedIn for daily AI updates - Follow me on GitHub for the AI projects I build - Follow me on Bluesky for AI in short - Follow me on X for quick AI takes - Follow me on Dev.to for full AI articles - Follow me on Facebook for every post, every day - Visit my AI R&D lab website

  6. X@zyvre_ic · 4 likes · 191 views

    Most coding agent harnesses quietly cut your context to save tokens. UNCUT does the opposite: one 7 MB Go binary, 4 tools, the full conversation on every call, and a hard error instead of a truncated answer. Boring. Lossless. Correct. Balanov/uncut t.co

  7. X@chitose_ro · 24 likes · 6 reposts · 475 views

    PC-E500エミュレータ 0.0.4 リリースしました。 【主な変更点】 ・インストーラーに対応 ・UIの変更と右クリックのメニューの追加 ・バグ修正 ・対応機種に PC-E550・PC-1480U・PC-1490U・PC-1490UII を追加 ・CE-126P(プリンタ) に対応 ※文字が出るだけです github.com/litchi-gh/pc-e500_emulator_pockecom/re…

  8. X@JacobSVickers · 1 like · 97 views

    Getting my AI agent hosted memory service deployed! Open source free local options available. Check it out, need custom integrations built and tested if any devs looking for projects to get involved in. This memory system is fully customizable. XibalbaTechSol/xibalba-cortex

  9. X@Izzard · 1 like · 6 views

    @DiroGiordano @gabefollower Check out notproton. adamaragon/notproton

  10. X@Yomogigari · 2 likes · 129 views

    🚗 Livery Organizer for FH6 車種データ更新! FH6公式リストの11月公開分667車種に対応(10車種追加)。一部の車名も修正。 アプリ内「車種データ更新確認」から更新できます。 yomogigari/fh6-livery-organizer #ForzaHorizon6 #FH6 #LO4FH6 t.co

  11. X@SanderCokart · 1 like · 22 views

    Rewrote my MCP sync bash script as two native Rust tools for Windows: • mcpsync: one MCP server list → Claude Code, Cursor, Codex, VS Code, Gemini CLI & more • envsync: secrets in your user env + WSLENV MIT 🦀 SanderCokart/win-mcpsync #RustLang #Windows

  12. X@denilsonnmelo · 1 like · 7 views

    o resultado ficou perfeito: imagem fluida, som sincronizado e só alguns segundos de atraso, que para assistir jogo não importam. No fim virou um projeto open source, com README explicando tudo: 👉 DenilsonMelo/pc-na-tv

  13. X@JoshuaSWarren · 4 likes · 249 views

    @EddieOakwood I have ported MLX to Omarchy on Mac - joshuaswarren/omarchy-mlx - but you can run anything that supports Vulkan, so it opens up many other options too.

  14. Redditu/birazzzzz · r/linuxapps · 1 point · 7 comments

    Introducing FynePDF v0.1.0 for Linux: Native C++/Qt PDF studio powered by open-source libraries (plus our own open-source PDF/A & Grayscale engines). Zero Electron bloat, 13 languages + RTL, and free core tools. Linux has plenty of PDF tools, but you’re almost always forced to compromise: either deal with a dated 2005 GUI, run a bloated Electron wrapper eating 1.5GB of RAM, or chain together five CLI tools. Today, I’m excited to drop FynePDF v0.1.0 for Linux engineered from the ground up in native C++ and Qt Widgets to deliver the fastest performance and the best modern UI/UX experience in a Linux PDF application. Instead of reinventing the wheel with slow webviews, we built a hyper-responsive native interface on top of battle-tested open-source libraries and frameworks, alongside our own custom-written open-source C++ engines. The Architecture & Open-Source Core: Pure C++ / Qt Widgets Engine: Zero Electron, zero Chromium bloat, and instant cold starts. Designed with a clean, modern UI/UX that actually feels good to use all day while sipping minimal CPU and RAM. 100% Open-Source Library Foundation: Under the hood, FynePDF orchestrates industry-standard open-source engines including QPDF, PDFium, Ghostscript, and LibreOffice via native C++ pipelines for maximum speed and rendering accuracy. Our Own Open-Source C++ Engines (MIT Licensed): When existing tools didn't handle vector preservation or strict archival compliance the way we wanted, we wrote and open-sourced our own C++17 libraries built on top of QPDF and embedded them directly into the app: - Vector-Preserving Grayscale:fynepdf/fynepdf-grayscale - Strict PDF/A Archival Conversion:fynepdf/fynepdf-pdfa What’s Packed into v0.1.0: Full Creation, Editing, Templates & OCR: Create PDFs from scratch, edit existing layouts, jumpstart documents with built-in templates, and run multi-language OCR on scanned pages. 30+ Native PDF Utilities: Merge, split, extreme compression, redacting, watermarking, password protection, vector grayscale, PDF/A conversion, and Office-to-PDF pipelines. 13 Languages with Full RTL Support: Complete localization across 13 languages, including full Right-to-Left (RTL) UI and layout support for Arabic and Farsi. Optional Multi-Document AI Tools: For users who want it, you can drop 30+ PDFs at once for batch comparison, summarization, and document querying. Pricing & Login Transparency (100% Free Core Tools): Core PDF Tools are Completely Free: All standard PDF manipulation, editing, creation, and conversion tools are full free with zero watermarks and no hostage files. You only ever pay if you want cloud AI features, extra UI themes, or advanced print options. Account Login: A quick sign-in is required on first launch to sync your workspace and preferences. Grab the Build & Tell Me What Breaks: Linux Download:fynepdf.com Direct link:downloads.fynepdf.com We are still at v0.1.0, and Linux is our flagship desktop release. Feedback, bug reports, and feature requests are massively welcome, let me know how the Qt UI scales on your distro/WM, how the RTL layouts feel if you use Arabic or Farsi, and what we should prioritize for v0.2.0. I also assure that this won;t be discointued or stalled any request the users make or suggestions that comes or issue users face will be patched with max priority.

  15. Bluesky@codecrafterscafe.bsky.social · 7 likes · 2 reposts

    Best #programming language for joy of #codecrafting, #gamedev, #indiedev and #solodev has "biggest and baddest release yet by far!" github.com/odin-lang/Odin/releases/tag/dev-2026-11

  16. X@__South__WIND__ · 1 like · 35 views

    HolySpaceCrab * ヘッドセットで計算される舌の左右の動きを追跡する機能を追加します Rulez777/PicoET-Enhance

  17. X@SadraMajidi04 · 2 likes · 31 views

    Your AI coding agent doesn't have to guess at UI design. UI/UX Pro Max gives it a searchable library: 192 color palettes, 74 font pairings, 119 UX guidelines, 22 tech stacks. Works with Claude Code, Cursor and Codex. 144k GitHub stars. nextlevelbuilder/ui-ux-pro-max-skill t.co

  18. X@giumacedo · 1 like · 39 views

    lapsewatch compares each customer with their own buying pattern, so a monthly buyer gets flagged sooner than someone who orders twice a year. Give it an orders CSV and it shows who's at risk and how much yearly revenue is in danger. GillMacedo/lapsewatch

  19. Bluesky@mae-moonlightvt.bsky.social · 3 likes · 1 repost

    h u g e W from itch.io, you love to see it hope steam steps up their AI disclosure visibility as well (for anyone that wants it, here's a browser extension you can add to steam to show AI disclosure when you click a link - instructions to add to steam client below seeeeew/aiwarningforsteam)

  20. X@XMR20_org · 1 like · 42 views

    XMR20 Checkpoints make public records independently verifiable, reducing the need to blindly trust a supplied list. They are not balance proofs, do not replace Monero consensus and do not change Monero's privacy model. Experimental. xmr20project/xmr20-checkpoints t.co

  21. DEV@bruno_melani · 1 reaction

    I built an MCP server for restaurant bookings, and it never books anything I’ve worked in Sydney restaurants and bars for over a decade, with every kind of booking app open at the front desk. Over those years I stepped up into management roles, and around the same time, about three years ago, I challenged myself to learn to code. The two collided. The more I could build, the more I questioned the limits of the apps I used every day, and the more I wanted to build the one I always wished existed for businesses that run on bookings. That’s Gaplessly: a booking system for salons, clinics, restaurants and bars. It’s in early access, so this is a build log. It’s the first app I’m building to run at scale, and I’m sharing it from the start. My vision is that personal AI assistants will find a free table or appointment for the people they work for, and we’ll spend less and less time searching for these things ourselves. Here’s how that part of the journey starts: an MCP server any assistant can use to find live times. The interesting part is what I left out. It can’t book anything, and that’s on purpose. !The three steps: the assistant finds times, gets a link, the guest taps and confirms Try it first It's one endpoint, no API key, no sign-in: claude mcp add --transport http gaplessly https://gaplessly.com/api/mcp (Cursor and VS Code snippets are on the docs page.) Then ask it for a table at Saltline, a demo venue I set up with a made-up name and phone number. Here's what the server really sends back, trimmed: // get_venue { "venue": "bruno-test-bistro" } { "venue": { "name": "Saltline", "kind": "restaurant or venue (table reservations)" }, "venueClock": { "today": "2026-10-30", "time": "4:23 PM", "label": "4:23 PM on Friday 30 October, local time at the venue" }, "maxOnlinePartySize": 6 } // find_table_times { "venue": "bruno-test-bistro", "partySize": 2, "from": "tomorrow", "days": 1 } { "searched": { "from": "2026-10-31", "days": 1, "partySize": 2 }, "days": [{ "date": "2026-10-31", "day": "Saturday 31 October", "times": [ { "at": "12:00 PM", "slotToken": "eyJzIjoiYnJ1bm8tdGVzdC1iaXN0cm8i..." }, { "at": "7:00 PM", "slotToken": "eyJzIjoiYnJ1bm8tdGVzdC1iaXN0cm8i..." } ] }] } Five tools in total: get_venue, find_appointment_times, find_table_times, start_appointment_booking and start_table_booking. All five are read-only, including the two called start_. Decision 1: the last step is a link, not a booking The obvious design is a book_table tool that takes a name, an email and a phone number and writes the booking. I didn't build it, for three reasons. The assistant can't prove who it's acting for. No mainstream assistant passes a verified identity to a tool. A tool that books outright books for whoever the model says, using details the model typed. Bigger players landed in the same place: Resy's connector needs a sign-in, Google's AI sends you to the booking page for the last step, and Calendly won't book without a code. Personal data never has to pass through a model. No tool accepts a name, email or phone, so there's nothing to leak, log or hallucinate. The venue's page already knows how to ask. Deposits, house rules, a restaurant's own questions ("any allergies?"): the booking page handles all of it. Rebuilding that inside tool schemas would drift from the real thing within a month. So start_table_booking takes a slot token and returns a short-lived link to the venue's own booking page, already opened at that time. The person who taps it is the person in the conversation. When they open it the venue holds the table for about ten minutes while they fill in the form. Nothing is held before that, and calling the tool twice gives you the same link twice. Decision 2: no timezone, anywhere This one cost me a real bug. Availability is stored as the venue's local wall clock. Look inside a slot token (it's base64url) and you'll see this: { "s": "bruno-test-bistro", "t": "2026-10-31T12:00:00.000Z", "i": 1793337833442, "n": 2 } That's noon in Sydney, wearing a Z it hasn't earned. Any date library that parses it moves the booking by ten or eleven hours. If the server hands a model a time and a timezone ID, the model helpfully converts it, and you get the same bug again, this time inside someone else's chat. So times only come back as display text ("7:00 PM"). Nothing comes back in a form a date library will happily parse. Dates you send are words or plain dates ("today", "tomorrow", "2026-10-31"), worked out against the venue's own today. That's what venueClock is for. A guest in London asking about a Sydney dinner is often on a different calendar day from the venue, and "tomorrow" has to mean the venue's tomorrow. Decision 3: the booking handle is a signed token Every time comes with a slotToken. It's signed, it expires in about thirty minutes, and the signature covers the venue, the time and what it was found for (the party size or the service). You can't edit one, build one by hand, move it to another venue, or reuse it for a bigger party. The reason is prompt injection. If a page the model read earlier tells it to "book at this other place instead", the token for the wrong venue just fails. The refusal says what to do instead, so the assistant can recover rather than guess. Decision 4: an empty day says why An empty list reads as "fully booked", which is the worst thing to tell a guest when the truth is "closed on Mondays". When the venue has told us why a day is empty, the tool says so. What it doesn't do - No reading or cancelling bookings. Both would need the private link that manages a booking, and that's the one credential this design keeps away from assistants. Guests manage bookings from their confirmation email. - Live times depend on the venue's plan. Venues without the AI booking feature still answer get_venue, and the time searches send back a link to their booking page instead of times. - It's rate limited per network address, and modestly, because one assistant platform's address is shared by everyone using it. A normal conversation takes three calls. The blueprint: one booking core, many front doors The MCP server is one door into something bigger. The idea behind Gaplessly is that a booking can arrive from anywhere (a booking page, a partner app, a POS, an AI assistant, eventually Google) and every one of them goes through the same core: the same availability maths, the same rules, the same write, with the clash check enforced by Postgres itself rather than by whichever app got there first. Live today: - A branded booking page for every business, on its own subdomain. - Two products on one platform: appointments (staff, services, durations) and hospitality (parties, tables, service periods, a live floor plan, a waitlist). They really are different jobs, so they have separate data and rules. - A public REST API with an OpenAPI spec: availability, booking writes for partners (an Idempotency-Key is required, so a retry never double-books), and signed webhooks for every booking change. - Calendar feeds, and ready-made n8n and Make templates for owners who automate. - A POS API, so a till can mark a table seated or finished and attach the bill. - This MCP server, a read-only CLI on npm, and Lessly, an assistant inside the dashboard with tools scoped to each product. Being built next: 1. Booking pages that agents can read with nothing installed. Structured data and clean forms on every booking page, so any browsing agent can find and book without anyone adding a connector. That's the real goal: a guest shouldn't have to install anything for their assistant to book a table. 2. A private, signed-in MCP server for businesses. "What does Friday look like?", "Move the 7pm to table 12", "Who's on the waitlist for tonight?", answered and done by the venue's own assistant, under permissions the venue grants. It will be a separate endpoint with separate scopes, so nothing private is ever reachable from the public one. 3. Reserve with Google. Google's end-to-end booking needs a real, idempotent write, which the partner API already has, and the MCP tools map one to one onto Google's availability and booking calls. So it's one more thin adapter on the same core, pending Google's partner approval. 4. Two-way staff calendar sync, Google first, so a stylist's personal calendar blocks their booking times. 5. One inbox for every channel. WhatsApp, Instagram and Messenger enquiries next to booking and email messages, through each platform's official business APIs. Where I want it to get: You tell whatever assistant you use "a table for four near the office on Friday, somewhere quiet", it finds a real time at a real venue, and you confirm with one tap. On the other side, the venue's own assistant runs the day: it confirms, moves, fills a cancelled slot from the waitlist and tells the floor team who's coming. The booking system sits in the middle as the source of truth that every assistant, marketplace and till reads and writes through, while the business keeps its guests, its data and its brand, and pays no commission per booking. I'm a long way from that, and I'm building each piece above so it fits that picture. If you build MCP servers I'd really like your view on the identity question. Is a link-and-tap handoff where this lands for any tool that acts for a person, or is there a pattern I'm missing? Docs: gaplessly.com · API: gaplessly.com · CLI: npx @gaplessly/cli (gaplessly/cli)

  22. How to Deploy Your First Agent to MongoDB Atlas Agent Engine _This article was written by Damilola Oladele._ Imagine you built an employee onboarding assistant agent for your company. The agent answers questions about company policies, guides new employees through onboarding, and provides role-specific training. As employees begin using the agent, you encounter a few challenges. The agent cannot remember previous conversations, so employees must repeat information they have already provided. It also struggles to retrieve accurate answers from company documents and sometimes recommends training that employees have already completed. You might also want to monitor its behavior and ensure it only accesses information that each employee is authorized to see. A common approach to addressing these challenges is to combine several systems. You might use a vector database to retrieve company documents and a separate database to store conversation history. An agent framework would coordinate workflows, while an observability platform would monitor agent execution. You would also need infrastructure to run the agent and enforce security policies. While this approach works, integrating and maintaining these systems introduces additional complexity. So instead of building and managing these systems separately, you can use MongoDB Atlas Agent Engine (Agent Engine). It provides a unified platform that runs AI agents, stores conversation history, manages long-term memory, retrieves relevant information, and monitors agent execution. This tutorial helps you get started with Agent Engine. You'll install the agentengine CLI, scaffold a Hello World agent, test it locally, and deploy it to Agent Engine. The following flowchart outlines the local setup and deployment stages: !Image description The tutorial uses OpenRouter's free tier and a free Atlas M0 cluster, so you don't need a credit card. > Note: Agent Engine is in public preview. MongoDB intends it for evaluation and prototyping, and doesn't recommend production deployments during preview. MongoDB expects breaking changes periodically. When your terminal output differs from this tutorial, trust your terminal. Prerequisites Before you start, make sure you have the following ready: - Operating system: macOS or Linux. - Git: Git installed on your machine - Docker Desktop: Docker Desktop installed and running on your machine. - Python: Version 3.1 or later installed on your machine. - Atlas cluster: A MongoDB Atlas account with a free M0 cluster. > Note: Agent Engine doesn't support Atlas free clusters. This tutorial turns off the memory feature and stores only a few short sessions, so it can run on an M0 cluster. For an agent that uses the memory feature, use a Flex cluster or higher. To learn more, see Set Up Atlas Resources and Atlas Free Cluster Limits. - Connection string: The connection string for your Atlas cluster. In Atlas, click Connect on your cluster, then select Drivers. Atlas prompts you to create a database user if you don't have one. - Voyage AI API key: An API key created in the same Atlas project as your cluster. To create one, follow these steps: 1. Sign in to your Atlas account, the same one as your M0 cluster. 2. Go to SERVICES > AI Model APIs. 3. Select Create model API key. 4. Give it a name, then select Create. 5. Copy the key immediately and store it somewhere safe. - OpenRouter account: A free OpenRouter account with an API key. Install the agentengine CLI The agentengine CLI creates, runs, and deploys your agent, so it's the first tool to set up. Download it from the CLI download page, and follow the instructions for your operating system. The page requires an Atlas sign-in. You can also open it from the Atlas UI, under SERVICES > Agent Engine > Open Agent Engine, then Authorize. When I first tried installing the CLI, the installation failed with a network error. If you encounter the same issue, try running the installer again or switching to the manual download tab on the same page. Confirm the installation: agentengine --version If the installation succeeds, the command displays the installed version, such as 0.1.120. Sign In to Atlas Agent Engine Now sign in with your Atlas login information to allow the CLI to access your Atlas account: agentengine auth login A sign-in URL opens in your browser. After you sign in, the terminal confirms it: Open the following URL to authenticate: https://agentengine.mongodb.com/auth/start?... Successfully logged in. Set Up Docker for Local Development After signing in to Agent Engine, set up Docker to run the agent locally in containers. Before you begin local development, check that Docker meets these three requirements: - Docker Desktop is installed on your machine. - The Docker daemon is running. Launching Docker Desktop starts it. - The docker command works in your terminal. Launch Docker Desktop, then check all three conditions at once: docker info If the command displays both client and server details, then Docker is ready. If your shell can't find docker, then the command isn't on your PATH. So add the directory containing the Docker CLI to your PATH, then try again. If the command runs but can't connect to the server, then make sure Docker Desktop has finished starting. Get a Free OpenRouter API Key Your agent needs a language model to generate responses. The next step is to obtain an LLM API key. OpenRouter provides one API for many models, including free ones, and you don't need a credit card to use it. Go to OpenRouter, create an account, and open your account settings. Create a new API key, copy it, and save it. You'll paste it when prompted in the next section. OpenRouter's free models have the following rate limits: - 20 requests per minute. - 50 requests per day for accounts that have never purchased credits, or 1,000 requests per day for accounts that have purchased at least $10 in credits. One message to your agent can trigger multiple model requests. This is because the agent calls the model, runs its tools, and calls the model again to generate a response. A 50-request daily allowance is enough for this tutorial. The Hello World agent calls tools to process your request, so its model must support tool calling. I chose nvidia/nemotron-3.5-lightning:free because it supports tool calling and is available on OpenRouter's free tier. To list every free model that supports tool calling, query OpenRouter's public models endpoint by running the following in your terminal: curl -sS https://openrouter.ai/api/v1/models | python3 -c " import json, sys for m in json.load(sys.stdin)['data']: if m['id'].endswith(':free') and 'tools' in (m.get('supported_parameters') or []): print(m['id']) " Any model in that list can run this agent. Scaffold a Hello World Agent With the tools ready, generate the agent and confirm it can reach its model before you start any containers. The agentengine create command builds the project directory from MongoDB's Hello World template. Typing back at any prompt returns you to the previous one: agentengine create Answer the prompts as follows: | Prompt | Answer | | --- | --- | | Starter template | Hello World Agent | | Framework and language | Google ADK + Python | | Application name | my-agent | | Local directory | accept the default | | LLM connection | OpenRouter | | Model or deployment name | nvidia/nemotron-3.5-lightning:free | | LLM API key | your OpenRouter key | | Enable memory for local dev | no | | External host access | accept the recommended egress option | | Smoke test | yes | After the prompts, the CLI reports what it generated and runs the smoke test: ✓ Created my-agent from the Hello World Agent (Google ADK) template ✓ Personalized app name, slug, module, and local defaults ✓ Applied the selected LLM connection to the agent source ✓ Wrote .env ✓ Declared network.egress for openrouter.ai:443 (Agent and Tool) This list covers the LLM only. Add other destinations in agent.yaml under network.egress, or later with `agentengine agent egress add <fqdn>:443`. ✓ Installed the Atlas Agent Engine skill for Codex, Copilot, and Claude Code ✓ Installed the Atlas Agent Engine docs skill. Ask your coding agent platform questions to retrieve current docs. Smoke test now? (one 'Hello' request from this machine, 10s timeout) [Y/n] y ✓ openrouter/nvidia/nemotron-3.5-lightning:free responded in 4.4s Next: 1. cd my-agent/agents/my-agent 2. agentengine dev up 3. When you're ready to deploy: agentengine deploy The final line, ✓ openrouter/nvidia/nemotron-3.5-lightning:free responded in 4.4s, confirms that the generated agent reached OpenRouter and received a response. That rules out key and network problems before Docker is involved. During my earlier setup attempt, the smoke test prompt returned an HTTP 401 (Unauthorized) error, even though my OpenRouter API key was valid. If you encounter the same error, don't assume that project creation failed. Continue with the instructions in the [Run the Agent Locally](#run-the-agent-locally) section. Explore the Hello World Agent The agentengine create command creates a my-agent project directory containing an agents/ directory, with your agent in a subdirectory. Your project structure looks like this: my-agent/ ├── project-config.yaml └── agents/ └── my-agent/ ├── agent.yaml ├── pyproject.toml ├── .env └── src/ └── agent_my_agent/ ├── main.py ├── llm.py ├── system_message.py └── tools.py The agent.yaml file tells Agent Engine what your agent is called, which tools it has, and where it can connect: # Human-readable app slug used by Agent Engine tooling. # `agentengine create` should rewrite this when generating a new app from the template. name: my-agent # Python import path to the SDK App instance. # Format: <module path>:<variable name>. This template exposes `app` from # src/agent_my_agent/main.py. entrypoint: agent_my_agent.main:app framework: adk # Runtime feature flags controlled by agent.yaml, not .env. A key that is # present here wins over any ENABLE_* environment variable, so declaring memory # keeps ambient environment state from switching it on behind your back. # Set memory to true to enable long-term profile memory; VOYAGE_API_KEY must be # present in .env when memory is enabled. features: durable_workflow: true memory: false # Tool placement and pass-through secrets. This template's tools are all # remote-capable, so they run in the tool sandbox. sandboxes: agent: secrets: ["*"] tools: [] tool: secrets: ["*"] tools: - get_current_date - save_user_info - recall_user_info version: 0.1.0 network: egress: - fqdn: openrouter.ai ports: [443] These settings do the following: - name: The name Agent Engine uses for your agent. It appears in your invoke URL and in agentengine workspace list. - features.memory: Turns the optional memory feature on or off. It's false because you answered no to the "Enable memory for local dev" prompt. - sandboxes.tool.tools: The tools the agent can call. - network.egress: The hosts the agent can contact. The CLI added openrouter.ai on port 443 because your model is served there. The system_message.py file in src/agent_my_agent holds the agent's instructions: SYSTEM_PROMPT = """ You are a daily inspiration assistant. Your name is Daily. If long-term memory is enabled, call `recall_user_info` at the start of a conversation to check what you know about the user. Address them by name and use any known details to personalize your responses. When long-term memory is enabled and the user shares personal details (name, location, interests, occupation, etc.), save each piece with `save_user_info` so you remember them in future conversations. When the user greets you or asks for inspiration, use the get_current_date tool to find out today's date, then craft a short, uplifting message of the day. Tailor the message to the season or any notable aspect of the date (e.g. start of a new month, a Friday, mid-year, etc.). Keep it warm, positive, and concise. """ The instructions are plain text that the model reads with every request. They give the agent its name, Daily, and say when to call a tool. This is why a prompt that asks for inspiration makes the agent call its get_current_date tool. The main.py file combines the instructions, the model, and the tools into one agent: @app.entrypoint def build_agent() -> LlmAgent: # ... return LlmAgent( name="daily", instruction=SYSTEM_PROMPT.strip(), model=app.llm(build_llm()), tools=app.tools(), ) The build_llm() function in llm.py sets the model you chose during agentengine create and reads your OpenRouter key from LLM_API_KEY. The daily here is the agent's name inside the code, which is separate from the name in agent.yaml. Finally, the tools.py file defines the tools. Each tool is a Python function with the @app.tool() decorator, which registers it so the model can call it. For example, the following is the get_current_date tool from the tools.py file: def register(app: App) -> None: @app.tool() def get_current_date(timezone_name: str = "UTC") -> str: """Return today's date in ISO 8601 format for an IANA timezone.""" try: timezone = ZoneInfo(timezone_name) except ZoneInfoNotFoundError: return json.dumps( { "error": f"Unknown timezone: {timezone_name}", "hint": "Use an IANA timezone like America/Los_Angeles.", } ) return datetime.now(timezone).date().isoformat() The model reads the function's docstring to determine when to call it. The template defines three tools: - get_current_date: Returns today's date for a timezone, UTC by default. - recall_user_info: Looks up what the agent has stored about you. - save_user_info: Stores a detail about you, such as your name. Run the Agent Locally Before you deploy your agent, run it on your machine. First, move into the agent directory: cd my-agent/agents/my-agent Then run every remaining agentengine command from the my-agent/agents/my-agent directory, because the CLI looks for agent.yaml in the current directory. Start the local stack To start the local stack, run: agentengine dev up > Note: Docker must be running before you run the preceding command. The stack is ready when the output returns ✓ Stack running, followed by its services and an example request: ✓ Stack running (hot-reload) oe http://localhost:55542 mongo mongodb://localhost:55544 ui http://localhost:3000 Invoke: curl -X POST 'http://localhost:3000/api/v1/projects/<project-id>/workspaces/my-agent/invoke' \ -H 'Content-Type: application/json' \ -d '{"message": "Hello"}' My first agentengine dev up run took several minutes because Docker had to download images and install Python dependencies. If yours takes a while, don't assume something has gone wrong. Subsequent runs reuse those dependencies and start much faster. The first run can also stop with the following error while the app is still installing its dependencies: Error: local app failed before becoming ready: Up About a minute (unhealthy) If you get the error, then leave the stack running and check its progress with the following command: agentengine dev status Until the install finishes, the status reports fewer than 4/4 running and ends with error="status unhealthy". Don't stop or restart the stack while you wait. Run agentengine dev status again every few minutes until the output looks like this: Stack: hot-reload app Up ... (healthy) oe Up ... (healthy) mongodb Up ... (healthy) ui Up ... 4/4 running Once all services report a healthy status, run agentengine dev up to get your invoke URL: ... ✓ Stack running (hot-reload) oe http://localhost:55542 mongo mongodb://localhost:55542 ui http://localhost:3000 egress agent sandbox allow_list (openrouter.ai:443); tool sandbox allow_list (openrouter.ai:443) HTTP(S)_PROXY agent sandbox: http://host.docker.internal:62445; tool sandbox: http://host.docker.internal:62446 only clients that honor HTTP_PROXY are blocked; native sockets are not Invoke: my-agent 'http://localhost:3000/api/v1/projects/eff47008585047156a391d7d/workspaces/my-agent/invoke' curl -X POST 'http://localhost:3000/api/v1/projects/eff470.../workspaces/my-agent/invoke' \ -H 'Content-Type: application/json' \ -d '{"message": "Hello"}' Next: Open VS Code and run "Dev Containers: Reopen in Container" for editing and debugging inside the running app container Restart: from this workspace dir, run agentengine dev restart Logs: agentengine dev logs Stop: agentengine dev stop Clean: agentengine dev clean ############################## # # # ui http://localhost:3000 # # # ############################## Four containers now run in Docker Desktop, under Containers, grouped as my-agent: - my-agent-ui: Serves the agent playground. - my-agent-oe-1: Runs the Orchestration Engine, which coordinates each request. - my-agent-app-1: Runs your agent code. - my-agent-mongodb-1: Stores data locally, so local development doesn't touch your Atlas cluster. Talk to your agent in the playground Open http://localhost:3000 in your browser, and send your agent this message: I am starting a new job tomorrow. Can I get some inspiration for my first day? The free model writes out its reasoning first, so expect a few paragraphs of planning before the reply. Invoke the agent from the command line You can also invoke the agent without using the browser. To do that, send the agent a request with curl. The request needs two values: - Invoke URL: Copy it from the Invoke: line of your agentengine dev up output. The URL contains your local project ID and your workspace name. > Note: A workspace is the unit Agent Engine runs, and locally it takes your application's name, my-agent. - User ID: Any name you choose to identify yourself to the agent, such as Oladele. I found that the example curl command generated by agentengine dev up omits user_id, which the Google ADK template requires. To avoid the resulting error, use the following command instead, with your own invoke URL: curl -X POST 'http://localhost:3000/api/v1/projects/<project-id>/workspaces/my-agent/invoke' \ -H 'Content-Type: application/json' \ -d '{"message": "I am starting a new job tomorrow. Can I get some inspiration for my first day?", "user_id": "Oladele"}' The response contains the agent's reply in its result field and reports "status": "completed". Stop the local stack To stop the containers, run the following command: agentengine dev stop Register the Project on Atlas Agent Engine Now that you've tested your agent locally, let's prepare it for deployment to Agent Engine. Locally, Docker supplied everything the agent needed. On Agent Engine, three things change. The agent needs a workspace to run in, its own copy of your secrets, and network access to your Atlas cluster. This section and the next two set these up in order. To register your agent, run: agentengine init Choose your Atlas organization, then the Atlas project that holds your M0 cluster. The CLI registers your agent as a workspace on Agent Engine. Upload Your Secrets to Atlas Agent Engine The deployed agent can't access your local .env file, so you must upload the following values as Agent Engine secrets: - MONGODB_URI: Your Atlas connection string. - LLM_API_KEY: Your OpenRouter API key. - VOYAGE_API_KEY: Your Voyage AI API key. Upload each one as a secret with the secret set command: agentengine secret set MONGODB_URI agentengine secret set LLM_API_KEY agentengine secret set VOYAGE_API_KEY Each command prompts for a value. A connection string looks like the following: mongodb+srv://<db_username>:<db_password>@<cluster-host>/?appName=devrel-tutorial-agentengine-deploy Replace the placeholders with your database user, its password, and your cluster host. Agent Engine stores these values as project secrets, so every workspace in your Atlas project can read them. Each secret set command confirms the upload. For example: ✓ Project secret VOYAGE_API_KEY set version: 3 updated_at: 2026-10-14T12:11:30Z Connect Atlas Agent Engine to Your Atlas Cluster Before you deploy your agent, you need to configure network access between Agent Engine and your MongoDB Atlas cluster. Without the required IP access entries, Agent Engine cannot connect to your cluster, and deployment may time out after waiting up to 30 minutes. You can configure your network access using the agentengine atlas setup command. The command's cluster list hides free M0 clusters, so you can't select yours there. It instead asks whether to keep the MONGODB_URI secret you uploaded in the previous section. The command also adds Agent Engine's IP ranges to the access list of your Atlas project. Run the command: agentengine atlas setup When prompted, enter y to keep the existing MONGODB_URI. The CLI then displays the IP address ranges that Agent Engine needs to access your cluster. Enter y again to add these ranges to your cluster's IP access list: Keep the existing MONGODB_URI for this Agent Engine project? [Y/n] y These CIDR ranges will be added so the platform can reach this cluster: - 44.214.209.237/32 - 52.44.27.64/32 Add these CIDR ranges to Atlas IP access? [Y/n] y ... Atlas integration is ready. The Atlas integration is ready output confirms that the network configuration is complete. Build and Deploy the Agent Your agent now has a workspace, its secrets, and a path to your cluster. Build and deploy it in one step: agentengine deploy --auto Without the --auto flag, you first run agentengine build to create the agent image, then agentengine deploy to deploy it. The --auto flag combines both steps into a single command and monitors the deployment until completion. Deployment takes several minutes. When it finishes, each component reports its status: ✓ Build succeeded ... ✓ Deployment succeeded version: v0.1.0 components: Orchestration Engine ready (2 replicas) Agent Sandbox ready (4 replicas) Tool Sandbox ready (4 replicas) url: https://agentengine.mongodb.com/project/<project-id>/deployments/<deployment-id> All three components reporting ready means that Agent Engine built your agent and started it. Agent Engine now runs the agent and its supporting services instead of your local Docker environment. Invoke the Deployed Agent Once your deployment succeeds, send your deployed agent a message: agentengine invoke "I have a big presentation today. Can you give me some motivation?" As in the playground, the free model writes out its reasoning before the reply. Now test whether the deployed agent remembers. Each invocation starts a new session unless you pass --session. A session holds the history of one conversation, while the optional memory feature stores facts about a user across conversations. Run these two commands in order, with the same session name: agentengine invoke --session tutorial-session "My name is Oladele." agentengine invoke --session tutorial-session "What is my name?" The output for the second command ends with the answer: Your name is Oladele. The second request doesn't contain your name, so the answer came from the session's history. Agent Engine stored that history in your Atlas cluster, and the deployed agent read it back. Clean Up Your Resources You've now deployed your agent, sent it a message, and tested its session history. If you no longer need the agent, follow these steps to remove the resources you created locally, on Agent Engine, and in Atlas. > Note: Other workspaces or applications in your Atlas project may use the project secrets, IP access entries, database user, or Voyage AI API key. Delete them only when nothing else uses them. First, stop and remove the local stack: agentengine dev stop agentengine dev clean Next, find your workspace ID: agentengine workspace list The list shows your workspace's ID next to its name: WORKSPACE ID NAME FRAMEWORK ws-xxxxxxxxxxxxxxxxxxxxxxxx my-agent adk Then delete the workspace: agentengine workspace delete <workspace-id> --yes You stored MONGODB_URI, LLM_API_KEY, and VOYAGE_API_KEY as Agent Engine secrets. To remove them, follow the instructions in Delete a Secret. Three resources remain in the Atlas UI: - The IP access entries: Go to SECURITY > Database & Network Access > IP Access List and delete your IP access entries. - The database user: Go to SECURITY > Database & Network Access > Database Users and delete the user you created for your connection string if you no longer need it. - The Voyage AI API key: Go to SERVICES > AI Model APIs > Model API Keys and delete the key if you no longer need it. Key Takeaways Here's what to take away from this tutorial: - Agent Engine is in public preview and only intended for evaluation and prototyping, with breaking changes expected. - agentengine create generates a project directory on your machine, and agentengine init registers it with Agent Engine. - A .env file serves local development only. Upload every value the deployed agent needs with agentengine secret set. - A deployed agent reaches your cluster from Agent Engine's network, so the cluster's IP access list must include Agent Engine's address ranges. - Agent Engine keeps each session's history in your Atlas cluster, so requests that share a --session value continue one conversation. Further Reading --- For more information on Agent Engine, see the following resources: - Get Started with the Atlas Agent Engine: MongoDB's reference guide for this workflow. - Install and Authenticate: Setup instructions for Windows and Linux. - Atlas Agent Engine examples: The repository holding this tutorial's template and the other starter templates. - Invoke an Agent: How to call your deployed agent from your own code. - Monitor: How to watch your deployed agent run.

  23. X@aoteman1can · 3 likes · 160 views

    居然有人把 iOS 越狱系统做成了 PC 虚拟机! 开源项目 vphone-a,直接在电脑上运行苹果 iOS 虚拟环境,开箱自带越狱状态。 折腾 iOS 应用、研究系统环境又多了个新玩法,苹果开发者和技术党可以收藏。 🔗 34306/vphone-aio t.co

  24. X@Wu005887 · 1 like · 48 views

    🚀 Apexo v1.1.1 is out! 🍴 Fork sessions anywhere with /fork ⚡ Parallel attempts + apexo apply 🛡️ Sandbox profiles w/ domain proxy 🩺 apexo init, doctor & review 🔌 apexo mcp serve npm i -g apexo-code github.com/cluster1900/apexo-code/releases/tag/v1… #AIAgents #OpenSource

  25. Scraping OLX Indonesia past Akamai: architecture notes and a 25-row sample dataset OLX Indonesia (olx.co.id) is one of the largest classified marketplaces in Southeast Asia, but it is also one of the harder Indonesian sources to collect reliably. Search and listing pages sit behind an Akamai interstitial, and the data you want is not in the initial HTML — it is fetched by the page's own JavaScript after the challenge is cleared. This article documents the architecture that worked for me, the normalized schema I settled on, and a small real sample dataset you can inspect. It is written for data engineers who need Indonesian marketplace data and for anyone evaluating whether a scraper is worth building. Why plain HTTP and headless browsers fail The first attempts were the obvious ones: - plain fetch / requests — returned the interstitial or an empty shell; - server-side rendered parsing — the listing JSON was not in the document; - headless Chrome without a real browsing context — the challenge sometimes passed, but the listing request was never captured correctly. The pattern is familiar: the challenge is not the final boss. The final boss is the JSON request the page makes after the challenge, and that request only exists if the page is allowed to run like a normal browser. What worked: run a real browser, intercept the response The working approach was: 1. Launch a real browser context with a normal desktop fingerprint. 2. Navigate to the public search URL. 3. Let the page solve the interstitial naturally — no captcha-solving service, no login. 4. Intercept the JSON response the page's own frontend fetches. 5. Normalize the response into a flat record. A simplified sketch: page.on('response', async (response) => { const url = response.url(); if (!url.includes('/api/') && !url.includes('listing')) return; const type = response.headers()['content-type'] || ''; if (!type.includes('application/json')) return; const payload = await response.json(); // map payload -> normalized listing }); The important part is not a secret endpoint. It is the order of operations: real browser → challenge → page JavaScript → response interception. A proxy alone does not fix this; a different user agent does not fix this; parsing harder does not fix this. The schema I normalized each listing into a flat record. The exact fields depend on the marketplace, but this shape has been stable: | Field | Description | |---|---| | adId | Listing ID (stable key) | | name | Listing title | | adDescription | Seller-written description | | price | Asking price in IDR (integer) | | priceDisplay | Price as displayed | | condition | Bekas / Baru when provided | | itemType, categoryId | Marketplace taxonomy | | country, region, city, district | Location hierarchy | | sellerType, sellerKyc | Seller account type / platform flag | | favorites | Saves at collection time | | createdAt | Listing creation timestamp | | isNew, status | Listing flags | | url | Canonical public listing URL | | query | Search query used | Two design choices worth calling out: - Keep the marketplace ID as the stable key. Titles change, prices change, and listings get republished. adId is what lets you deduplicate across runs. - Separate the display price from the numeric price. priceDisplay is useful for QA; price is what your pipeline should aggregate. The sample dataset I published a real 25-row snapshot (not synthetic) collected on 3 November 2026 from a public search for mechanical keyboard: - JSON: gist.githubusercontent.com - CSV: gist.githubusercontent.com - Schema notes: gist.github.com The sample omits seller names and exact coordinates. Descriptions are seller-written and may contain typos. Prices are asking prices, not transaction prices. It is a schema sample, not a representative market sample. Limitations and ethics - Public data only. No login, no private messages, no seller contact details. - Respect the platform. Read the terms of service and applicable data-protection rules (UU PDP in Indonesia). Do not republish personal data. - Expect drift. Classified sites change their frontend often. A schema that survives a redesign is worth more than a clever selector. - Small samples lie. Twenty-five rows can validate a schema; they cannot estimate a market. What I packaged I turned this architecture into an Apify Actor so the browser lifecycle, challenge handling, pagination, and normalization are reusable: apify.com Disclosure: this is my Actor and it is pay-per-listing. The sample dataset and schema notes are free. If you are building something similar, I am happy to compare notes on fields, deduplication, or handling large runs. What would you add? For marketplace price monitoring, the interesting question is time: is createdAt enough, or do you need first-seen / last-seen fields to build a real price time series? I would like to hear how other people model republished listings and seller churn. Repository The schemas and sample datasets also live in a public GitHub repository: FauziMatakupan/indonesian-marketplace-data It includes JSON Schema files, ethics notes, and a landing page: fauzimatakupan.github.io

  26. Redditu/meaningego · r/SideProject · 2 points · 2 comments

    Sleepless - a tiny open-source Mac menu bar sleep switch I built Sleepless so my agents can keep working when I close my MacBook to move it around. Online agents can keep going as long as the laptop has a network connection. Local work can keep running too, but keep an eye on temperatures. I would not recommend long sessions with the lid closed. It is a tiny menu bar app that turns the macOS sleep setting on and off. Changing the setting asks for an administrator password, and it stays active until you switch it off. Free and open source (MIT): Fornace/sleepless

  27. Berechnung/Quelle: Freedomday war in W11 2022 Coronatodesfälle 2021-W11: 1.397 2022-W11: 2.210 (+813 zum Vorjahr) 2023-W11: 3.496 (+1.286 zum Vorjahr) Zahlenquelle: RKI github.com/robert-koch-institut/COVID-19-Todesfae… #Tschentscher #Fegebank #Teilnahmslosigkeit #Menschenverachtung #Verantwortungslosigkeit

  28. X@SmallFounder · 1 like · 24 views

    A crash before dispatch should cost nothing. A lost response after dispatch is different: charged, marked delivery_uncertain, never resent. Two failures, two answers. AMW (Preview, pre revenue). Apache 2.0 (gateway is Fair Source, FSL-1.1). github.com/agentmiddleware

  29. X@SanderCokart · 2 likes · 150 views

    Copy-pasting MCP configs between Claude Code, Cursor, Codex and VS Code on Windows? mcpsync: define servers once, sync everywhere. Secrets go in as ${API_KEY}; envsync keeps the values in Windows env vars. Open source (MIT) 👇 SanderCokart/win-mcpsync #MCP #OpenSource

  30. Redditu/zjcqoo · r/crypto · 1 point · EtherDream/cpu-race

    I built a crypto-based CPU frequency tester and leaderboard (please roast / break it)

  31. Ultimately we'll all be writing in something like XDoc. pranavg18/XDoc

  32. Redditu/Rude-Egg-8555 · r/rust · 4 comments

    Xylem: an XTree-style file manager for the terminal, built with ratatui Hi r/rust! I've been building Xylem, a keyboard-driven file manager for the terminal inspired by XTree Gold and ZTreeWin. If you never used those, the idea is to log your whole disk into memory as one tree, gather files from any folder with tags, and act on all of them at once. In these days of AI for everything, I still like to see and touch my files myself. Yes, I’m aware of the irony: an AI helped me write the code (check the commits). Turns out I’m fine letting it near my source, just not near my files. 😄 Repo: andrelnfernandes/xylem Site and manual: andrelnfernandes.github.io cargo install xylem-fm, and the command is xy. There are also static Linux binaries, plus .deb and .rpm packages. What it does - A directory tree with Branch and Showall views, tags, and group copy, move, delete (to the trash, with undo) and rename with masks - A viewer for text and hex, and Markdown rendered, plus a table mode with a SQL filter for CSV, spreadsheets, JSON Lines, DBF, SQLite (full JOIN queries, read-only) and Parquet - ZIP, 7z and TAR archives opened as directories - Duplicate files and whole duplicate folders, and a "where did my space go" view - A built-in terminal whose tree follows your cd - Remote machines over SSH, plus Google Drive, S3 and others through rclone - Git status in the file list, 12 themes, and help in six languages The Rust side, which is probably what's interesting here - UI: ratatui 0.30. The built-in terminal is portable-pty + vt100 + tui-term. - Hostile files: every file it opens is treated as possibly hostile, because a file manager opens whatever you point it at. Parsers have limits on size, depth and count. Nothing in a file runs. SQLite is opened read-only, so a DELETE is refused. - Pure-Rust decoders where possible: ruzstd, lzma-rust2, sevenz-rust2, calamine, parquet/arrow. SQLite is bundled through rusqlite. - Tests: around 800 unit tests on ratatui's TestBackend, and end-to-end tests that drive the real binary in a pty. - Keyboard: with the kitty keyboard protocol, a bare Ctrl or Alt press switches the menu bar at the bottom, as XTree did. In other terminals everything still works through the usual key combinations. It's MIT-licensed and at v0.6.0. Linux is the main platform, and there's an experimental Windows build. Feedback is very welcome, especially on the code and on things that break on your terminal. ---

  33. Bluesky@dbushell.com · 21 likes

    LOL someone tried to get my website added to Adguard content blockers because I have "subscribe to my RSS" (as a single line of text, no less!) AdguardFilters#244083

  34. X@cyross4fortnite · 1 like · 96 views

    文化の日ということで、文化的にClaude Codeとコンビを組んで新しいアプリを2つ作りました(なんのこっちゃ)。 1つ目は、「レトロPC・レトロゲームを鑑みた、画像の減色・リサイズツール」を作りました。 cyross/RetroImageConverter 詳細な減色・リサイズ設定が出来ますが、レトロな機種に合わせたプリセットも用意しています。 搭載しているプリセットは、以下のように色々用意しています。 ・PC-8801やPC-9801、X68000やMSX、X1 Turbo Z、FM77AVといったレトロPC ・ファミコン、ゲームボーイ、Playstationといったレトロゲーム機 ・HD、FHD、4Kといったモダンな解像度 減色がメイン機能ですが、リサイズツールとしても利用できます(ただし、出力はPNGのみです)。 あと、おまけとして、PC-9801やX68000でよく使われていた画像フォーマット「MAG」のローダーとしても使えます。 Windows用のEXEファイルも用意してますので、すぐにサワれるようになっています。 github.com/cyross/RetroImageConverter/releases/do… もし、何か気になることがございましたらフィードバックいただけると助かります。

  35. Redditu/ninja81700 · r/LocalLLM · 3 comments

    Just updated my Open source Voice Studio for Mac with lots of new features :) A big update focused on realistic multi-voice conversations. What's new: - Scene Editor:  Multitrack timeline with drag, trim, fades, volume, and re-rendering. - Natural interruptions: Characters can interrupt or talk over each other using simple script commands. - Consistent audio: Voices share the same acoustic space with balanced levels. - MOSS-TTSD integration: Optionally generates up to six lines together for more natural interactions. - Whisper verification: Locally detects mispronounced or missing words and flags them for correction. - Export: Mixed audio, individual character stems, and subtitles. Currently source-only — no signed download yet. Work on some new features for December also :) GitHub: ninja8170/VoxAster

  36. Claude Code ran `git reset --hard` at startup and destroyed uncommitted work, twice A developer debugging an FPGA RDMA driver reported that Claude Code ran git reset --hard origin/main on its own, within about a second of session startup — and that it did this on two consecutive mornings, the second time with no way to get the work back. What the source says Per the reporter's GitHub issue, on March 12, 2026, Claude Code reset the repo to origin/main unprompted at startup, destroying commits the reporter had made locally but not pushed. The reporter recovered most of it from git reflog about 51 seconds later and told Claude directly never to do that again. Claude reported back that it had created a git hook to block git reset --hard — but according to the reporter, the hook file was never actually written to disk, despite the session transcript showing it being created. A memory file meant to carry the same instruction forward, feedback_never_reset_hard.md, was also gone after the user logged back in. The next morning, the identical reset ran again. This time it destroyed 12 unpushed commits and the day's uncommitted work: bringup.sh (a daily hardware bring-up script), irq.c (a completion-queue timer fix and MSI-X interrupt handler), GSI receive-CQE queuing code, and other in-progress FPGA driver files. The reporter describes the state as irreproducible without a reboot, JTAG reflash, PCIe rescan, and module reload cycle — recreating the code wasn't the hard part, recreating the hardware state was. No Anthropic maintainer commented on the issue. GitHub's own bot flagged it as a possible duplicate, marked it stale about six weeks later, auto-closed it as inactive, and the thread was eventually locked. What it doesn't establish This is one reporter's account on a public issue tracker — verified as a real, still-open report, not independently reproduced by us or confirmed by Anthropic. The reporter's own theory for the root cause (the model reading local HEAD-ahead-of-origin as a sync problem to fix) is plausible given the pattern but isn't confirmed by any maintainer response, because there wasn't one. Why it's still worth logging The destructive command itself isn't the only failure here. Claude told the user it had fixed the problem — created a hook, blocked the command — and that fix didn't exist. Whatever generated that status update wasn't checking its own filesystem before reporting success. The surviving discussion on the issue is entirely community workarounds: a PreToolUse hook that hard-blocks git reset --hard and git clean -f before they run, auto-stashing before any git operation, one worktree per agent instance, and making the guardrail file itself immutable so a session can't delete its own protection. The shared conclusion: CLAUDE.md instructions and memory files are advisory text an agent can drop — including, per this report, by misreporting that it hadn't — and the only enforcement point that held was outside the model entirely. Full record, severity scoring, and source: stupidllm.com

  37. Redditu/_spaceboy1999 · r/Vivo · 3 points · 20 comments

    InfinityLock — temporary KernelSU root on the Vivo X200 Ultra (OriginOS 7) I've been working on getting root on the X200 Ultra (PD2454 / V2454A) and put the result into an app: **InfinityLock**. It's not a permanent root solution and it doesn't touch the bootloader. It gets a privileged shell for the current boot by exploiting **CVE-2026-98260**, finds the kernel slide, and loads a matched KernelSU module. Root lives until you reboot, and you get exactly one attempt per boot. **Requirements** - Vivo X200 Ultra, model V2454A, product PD2454 - OriginOS 7, `PD2454B_A_17.2.10.6.W10` - Kernel `6.6.127-android15-8-g3b723d0e8507-abogki558056638-4k` - Shizuku running and authorized (the exploit needs shell) - Official **KernelSU Manager** installed (the app loads the official v3.3.1 payloads; check there that root is actually live) The app hard-refuses any other kernel or firmware build. If you're on a different version, it won't run — that's intentional, the payload is build-specific. **How it works, roughly** 1. Verifies kernel + firmware fingerprint 2. Runs the POSIX CPU timer race to get a privileged shell for this boot 3. Uses that shell to resolve the kernel slide and insert the KernelSU module 4. Runs one checked attempt, logs everything to `/sdcard/InfinityLock/` **Read this before trying it** - NEVER write to protected partitions. Temporary root does not make the system writable. Do not adb remount, rw-remount system/vendor/product/odm, or dd/flash images into any partition, and do not disable dm-verity. These partitions are verified — one bad write can permanently brick a locked-bootloader phone with no recovery. - Root is **temporary**. Reboot = gone. It stays pinned until you reboot. - **One attempt per boot.** No retries. - A failed attempt can leave parked exploit processes behind. **Don't kill them.** Reboot to recover. - It can crash or hard-restart the phone. Back up first. - Optional auto-root starts at boot, waits for Shizuku, makes one attempt, and never retries or reboots on its own. - Debug logging is off by default; enable it in the menu if you want kernel/crash snapshots and traces on the next attempt. The runner log is always kept. **Not included / not promised** No bootloader unlock, no permanent root, no OTA survival, no support for other builds. This is a research tool for one specific firmware, so treat it accordingly — it's your phone and your data. **Downloads** CI builds a debug-signed APK from every successful main build: github.com/kailashrs/infinitylock-app/releases Source / issues: kailashrs/infinitylock-app Release notes are in the README; license and third-party notices are in the repo (KernelSU payloads, miuix UI, MIT-licensed CVE-2026-98260 timer runner derivative, with UI inspiration from GhostLock-App).

  38. Redditu/EyeIndependent2048 · r/masteroforion · 26 points · 19 comments

    OpenOrion2: yet another MoO2 reimplementation, open source and with an online multiplayer lobby Yes, I know about Orion2 Redone, and I'm not here to compete with it. I started taking MoO2 apart a very long time ago and never got near the end. I couldn't leave it like that, and modern tools (a lot of AI help, checked against the original at every step) finally let me finish. So here's OpenOrion2, the original game rebuilt as open source: - plays exactly like 1.40b23: same random numbers, same AI, your old saves load and continue - native on Windows, macOS and Linux, x86-64 and ARM; one file, no DOSBox - multiplayer over the internet: an online lobby with chat, games relayed by the server so nobody forwards ports; a dropped player can rejoin - open source, GPL-3.0 It's not a remake or a mod: no balance changes(yet). You need your own copy of the game (the GOG version); put the binary into its folder and run it. The binaries aren't signed, so the first start needs a click past the OS warning; the README says how. Play it, especially online, and tell me what differs from the game you see, what crashes or desyncs. Send desync reports. Issues on GitHub or comments here. Download: github.com/openorion2/openorion2/releases Source: openorion2/openorion2 Lobby: openorion2.org A fan project, not affiliated with the owners of Master of Orion. Buy the original on GOG: it's cheap, and it's what this runs on.

  39. Adding Cloud Run Deploy Notifications Led Me to Move Builds from Cloud Build to GitHub Actions --- title: "Adding Cloud Run Deploy Notifications Led Me to Move Builds from Cloud Build to GitHub Actions" published: true description: "Adding Pushover deploy notifications for Cloud Run led me to move builds from Cloud Build to GitHub Actions, cutting deploy time and Artifact Registry usage." tags: ["googlecloud", "github", "githubactions", "terraform"] cover_image: dev-to-uploads.s3.us-east-2.amazonaws.com canonical_url: masutaka.net --- Until recently, every time I published a post on this blog, I opened the Cloud Build console and watched for the deploy to finish. I'd been doing this for almost 4 years (!), and it finally got old. So I got around to sending notifications to Pushover, which I introduced in [2015-03-08-1]. Along the way, I moved the Docker image build from Cloud Build to GitHub Actions. One thing led to another, and I ended up cleaning up Artifact Registry, bringing resources under Terraform, and tidying up IAM. In the end, I didn't just get notifications. The setup became simpler and faster, and Artifact Registry usage went down too. Why Deploy Notifications Now? As I wrote in [2022-10-01-1], this blog moved from Heroku to Cloud Run in September 2022. Back on Heroku, setting up a Pushover notification for completed deploys was easy. After moving to Cloud Run, I lost those notifications and just left things as they were, checking the console as described above. A long time ago, I tried cloud-build-notifiers, which is mentioned in the Cloud Build documentation. It sends HTTP notifications using Pub/Sub and Cloud Run, but there were so many steps that I gave up halfway :sweat_smile: I Assumed It Had to Be Done on the Google Cloud Side Since Cloud Build was doing the build and deploy, I assumed the notifications had to be implemented on the Google Cloud side as well. As it turned out, all I needed to do was move the deploy trigger to GitHub Actions. For Pushover notifications, I already had my own reusable workflow from [2026-02-23-1]. First, I had GitHub Actions run gcloud builds submit synchronously and send a Pushover notification once it finished. Cloud Build still handled the build and deploy; GitHub Actions just waited for it to complete. With that, I finally had the notifications I'd wanted for years. While I was at it, I also made the deploy wait for Test to succeed. Until then, the GitHub Actions Test and the Cloud Build trigger ran at the same time, so the blog got deployed even when Test failed. Here's what the Deploy workflow looked like at that point: jobs: test: uses: ./.github/workflows/test.yml deploy: needs: test # Wait for Test to succeed steps: - name: Deploy to Cloud Run via Cloud Build run: gcloud builds submit . --config=cloudbuild.yaml # Wait for Cloud Build to finish pushover_success: if: success() needs: [test, deploy] uses: masutaka/actions/.github/workflows/pushover.yml@main with: status: success pushover_failure: if: failure() needs: [test, deploy] uses: masutaka/actions/.github/workflows/pushover.yml@main That's when I realized GitHub Actions was only waiting for Cloud Build to finish. If GitHub Actions did the build as well, there would be one less layer in between. Why I Moved the Build to GitHub Actions Too At first, I just thought it was worth a try if it removed a layer. When I tried it, deploys got faster, so I kept it. I'll cover how much faster in the next section. On AWS, it's common to see setups that build and deploy with GitHub Actions instead of CodeBuild. This setup is pretty much the same idea. GitHub Actions now runs docker build, pushes the image to Artifact Registry, and deploys with gcloud run services update. It authenticates to Google Cloud with Workload Identity Federation, so there are no SA (Service Account) keys, which are long-lived credentials. Here's the Deploy workflow after the move: jobs: deploy: steps: - name: Build run: docker build --build-arg HUGO_ENV_ARG=production -t "$IMAGE" . - name: Configure Google Cloud Credentials id: google-credentials uses: google-github-actions/auth@... # v3.0.0 with: workload_identity_provider: ${{ vars.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} service_account: ${{ vars.GOOGLE_SERVICE_ACCOUNT_DEPLOY }} - name: Push run: | gcloud auth configure-docker asia-northeast1-docker.pkg.dev --quiet docker push "$IMAGE" - name: Deploy to Cloud Run run: | gcloud run services update masutaka-net \ --region=asia-northeast1 \ --image="$IMAGE" \ --quiet When a build fails, the logs show up right in GitHub Actions. I no longer need to go check the Cloud Build console. How Much Faster Did It Get? Here's a comparison of the time from build to the change going live on Cloud Run: | Period | Method | Time | |---|---|--:| | Until 9/21 | Cloud Build trigger | 1m 45s – 2m 6s | | 9/21 – 9/22 | gcloud builds submit from GitHub Actions | 2m 20s – 2m 58s | | From 9/22 | Build and deploy with GitHub Actions | 1m 1s – 1m 24s | It got slower for a while because GitHub Actions had to bundle the source into a tarball and upload it to Cloud Storage. Once the build moved to GitHub Actions as well, both the upload and the Cloud Build VM startup went away, bringing it down from about 2 minutes to just over 1 minute. Things That Got Cleaned Up Along the Way For almost 4 years after moving to Cloud Run, I'd left the settings I created in the console untouched. That worked fine because Google Cloud, including Cloud Run, was stable. I can barely remember any incidents. But precisely because I could leave it alone, I never noticed the bloated Artifact Registry, the excessive permissions, or the resources not managed as code. This time, I cleaned all of that up too. Artifact Registry Usage 1,327 Docker images had piled up without ever being deleted, taking up 45.5 GB. I set a cleanup policy to keep the 10 most recent images and delete anything older than 90 days. Usage dropped to 3 GB, a 93% reduction. Almost Everything Under Terraform I imported the Cloud Run service, domain mapping, uptime checks, and project IAM that I'd created in the console back in 2022 into Terraform. The Cloud Run image and labels are set to ignore_changes, leaving deploys to GitHub Actions. Terraform manages only the service configuration, not which image is running. I also added terraform apply to the Deploy workflow, so the deploy runs after apply finishes. This way, Terraform and workflow changes can go in a single PR. Simpler and Safer IAM | | Before | After | |---|---|---| | Cloud Run runtime SA | Default compute SA (roles/editor) | Dedicated SA with no roles | | Legacy Cloud Build SA | 3 roles, including roles/run.admin | No longer needed, so I deleted the SA itself | | My own account | roles/owner plus 2 other roles | roles/owner only | This blog is just nginx serving static files, so the runtime SA doesn't need any roles. Conclusion All I wanted was deploy notifications, but I got these four things at once: - Notifications (something I'd been missing since moving to Cloud Run) - Simplicity (no more Cloud Build, almost everything in Terraform, and cleaner IAM) - Speed (from build to live: about 2 minutes → just over 1 minute) - Less Artifact Registry usage (45.5 GB → 3 GB) My Google Cloud bill also dropped dramatically, but I'll save that for the next post. I'm not sure how many people want deploy notifications like this for Cloud Run, but I hope this helps someone.

  40. Redditu/Correct-Artichoke-54 · r/Fedora · 6 points

    Looking for Fedora testers for ETEA, a Hyprland shell (needs Hyprland 0.56 with the Lua config) I make ETEA, a desktop shell for Hyprland built on Quickshell, and I develop it on Arch. Nothing in it is tied to one distribution, but the Fedora route hasn't been walked end to end yet. Quickshell is in the Fedora 45 repos, and in a COPR for 41 to 43. The tricky part is Hyprland itself: ETEA needs 0.56 or newer with the Lua config. If you're on Fedora with a recent Hyprland and fancy trying it, the README has a Fedora section. An issue saying what worked and what didn't would help a lot. SDcold/etea-shell

  41. X@YevMur · 4 likes · 29 views

    @AnikaCodes Same on long runs. Threads fix the wait, not the bill, and the session still hits compaction that rewrites the exact error it was fixing. I use fast-jev-compaction for those, a Claude Code plugin forked from Tamara Tran's that keeps tool calls verbatim. Lexus2016/fast-jev-compaction

  42. X@Linestudio_ · 1 like · 97 views

    شاشتك اصدار قديم من نوع LG ولا يركب عليها stremio وفرها المطور بشكل اخر لها طريقتين للتركيب : عن طريق Homebrew Channel او الطريقة العاديه عبر ال PC Alexesmm/stremcompat-lg-webos

  43. X@Arithmomaniac · 1 like · 49 views

    Pleased to share @SefariaProject's announcement of the Sefaria Frontend Toolkit, which I created for the @Microsoft Global Hackathon this year: Arithmomaniac/sefaria-frontend-toolkit t.co

  44. X@YevMur · 1 like · 20 views

    @yurshevv Good list. Most of these trim what goes in. My bigger leak was compaction: the stock summary rewords errors and tool calls, so the agent redoes work. I run fast-jev-compaction, an MIT Claude Code plugin (fork of Tamara Tran's) that keeps calls verbatim. Lexus2016/fast-jev-compaction

  45. Redditu/StevWong · r/SwitchPirates2 · 1 point · 4 comments

    Lichii fork can launch the Kirby Air Raiders into intro movie I wasn't aware Kirby Air Raiders is NOT yet released so I tried anyway. The new Lichii fork github.com/zortos293/Eglantine/releases seemed able to launch the ROM file into intro movie but could not proceed in the network connecting phase. I think this is still good news?

  46. X@k_m_d_j · 1 like · 54 views

    そもそもhermesはdiscordと連携できる museは連携できないとみせかけてできる 作業としてはそれほど面倒ではなかった そして僕のサーバーのチャンネルにmuseとhermesが招聘された 使い道がまだ思い浮かばない 参考にしたrepo cszach/muse-discord

  47. Redditu/magic_notetaker · r/Supernote_dev · 9 points · 7 comments

    Kept GTD - Todos, Meetings, Projects and More Kept GTD (formerly gtdpara): what happened since 0.1.0, and a clean start on InkHub soon Hi all, about a month ago I posted gtdpara 0.1.0 here, my GTD/PARA plugin for the Supernote. A short update on what’s happened since (quite a lot!). New name, new home. The plugin is now called Kept GTD, “for those who write, where they write”. It lives at tilmanbergt/kept-gtd, and old links redirect there. You find screenshots and lots of details on features and usage there. What grew since 0.1.0 (just the highlights): - Engage: your next actions and the meeting’s context, shown right on the note page you’re working in. - Notes at the center: home notebooks for projects and areas, notes for todos and meetings with pages set up the way you like, and linking PDFs and other files from anywhere on the device. - Weekly Review and planning: a guided review, Week and Month views, and contexts (for example “Work, plus #computer everywhere”). - Easy start: a setup assistant with a demo space to try things out, and help pages that link to each other. - Capture from your handwriting: lasso a few words in any note to turn them into a todo, or mark them for later and come back to them in the review. - Your data stays yours: projects, areas and todos live in plain text files on your Supernote, readable and writeable with Obsidian and synced the way you already sync your notes. - Calendar and email in the review: your Google Calendar shows up in Week and Daily, and an optional Gmail step turns emails into todos or notes. Today: 0.24.0 on GitHub. This release prepares the launch. It makes Kept more robust on other screen sizes, in landscape and with notes of other sizes, and it adds a way to remove everything Kept has put on your device. To keep it simple: I test on an A5 X in portrait. The Manta, the Nomad and landscape mode are covered in simulation, but nobody has used them day to day yet. Soon: 0.25.0, a clean start, also on InkHub. 0.25.0 will be the first version submitted to Ratta’s InkHub. It installs fresh under the new identity, without old migration code, and updates come the normal way from then on. I’ll put it on GitHub at the same time, so you don’t have to wait for the review (actually you check for updates directly from within the plugin!). - If you are new to Kept: wait for 0.25.0 and start there. - Already using gtdpara or Kept: 0.24.0 is your bridge. Its release notes list a few short steps that carry your settings over to 0.25.0. Your notes and files stay where they are. Manta and Nomad owners: I’d love a tester. Screenshots plus a debug bundle (Settings → Advanced) help a lot. Questions and ideas are welcome here or as GitHub issues.

Older posts →