emilk

Stars and mentions

Last 30 days, Oct 5 – Nov 3

GitHub stars769
mentions12
021426384Oct 5Oct 19Nov 3
UTC days · repositories emilk owns3 repositories

Package downloads

Cumulative recorded downloads

crates.io—
01234Oct 5Oct 19Nov 3No observations in this range
Oct 5crates.io: 0/25 packages observed

Across 25 known packages in repositories emilk owns. Cumulative totals include recorded downloads before the selected range. Missing observations leave gaps; totals may be incomplete.

Top repositories

emilk’s repositories ranked by new stars, as on trending.

Loading

Contributes to

Repositories outside emilk’s account where emilk opened or reviewed pull requests in the past 365 days.

Who noticed emilk

Everyone who starred or forked emilk’s repositories since the archive began in 2011.

Notable accounts

Ordered by the stars their own repositories have received.

Biggest fans

Accounts that starred the most of these repositories.

Breakout weeks

Each repository’s best week of new stars, with the release published around it.

Mentions

12posts
Nov 40 posts
  1. Reddit · · r/git · u/Krzycho_666 · emilk/egui

    GitKwaken - new, fast, lightweight, SourceTree-style git client, written in Rust. maxpowerart/GitKwaken GitKwaken gives you the familiar SourceTree workflow (commit graph, staging, branches, stashes, remotes, tabs) but starts instantly and stays smooth on huge repositories. The UI is egui; all git work happens on background threads, so the UI never blocks on the repository.

    4 comments
  2. Четыре протокола и одна кнопка «Разрешить»: как я подключил Claude Code, Codex, Qwen и Hermes к Telegram Claude Code и Codex умеют работать долго и без присмотра, но только пока ты сидишь рядом. Агент то спрашивает разрешение на команду, то задаёт уточняющий вопрос и ждёт ответа. Отошёл от компьютера - и всё встало. Как-то мне пришлось срочно уехать по делам, а задач на день было много. Хотелось ставить их агентам с телефона и подтверждать команды кнопкой, а не держать открытыми шесть терминалов. Так появился agent-hub: десктопное приложение на Rust, в котором каждая тема Telegram-группы - отдельная сессия агента на моём компьютере. За 3-4 часа в дороге я провёл через него больше шести задач. Похожие решения есть, но мне не подошли. Мне важно, чтобы у каждой задачи была своя история переписки и не приходилось помнить ID сессий, а темы в группе для этого подходят идеально. В статье расскажу не столько про сам инструмент, сколько про то, как он устроен внутри: как четыре агента с разными протоколами сведены к одному интерфейсу, как запрос разрешения превращается в кнопку Telegram и обратно и какие ограничения Telegram пришлось обходить. Что должен уметь хаб Если посмотреть на работу с агентом со стороны пользователя, взаимодействий немного: - агент пишет текст; - агент вызывает инструмент (команду, правку файла, поиск); - агент просит разрешение на вызов; - агент задаёт вопрос с вариантами ответа; - агент присылает файл; - ход закончился или упал с ошибкой. В обратную сторону идут сообщения пользователя, ответы на разрешения и вопросы, файлы и команда остановки. Всё это нужно уметь показать в теме Telegram и вернуть агенту. Проблема в том, что каждый агент говорит об этом на своём языке. Четыре протокола Все четыре агента запускаются как дочерние процессы и общаются через stdin и stdout, но на этом сходство заканчивается. Агент Запуск Протокол Claude Code claude -p --input-format stream-json --output-format stream-json JSON-строки плюс управляющие запросы control_request Codex codex app-server JSON-RPC: треды, ходы, элементы Qwen Code qwen --acp Agent Client Protocol Hermes hermes acp тоже ACP Лучше всего разницу видно на одном и том же событии - запросе разрешения. Claude Code присылает управляющий запрос и ждёт ответа с тем же request_id: {"type": "control_request", "request_id": "c76cce43-…",  "request": {"subtype": "can_use_tool", "tool_name": "Write",              "input": {"file_path": "/work/note.txt", "content": "hi"}}}sourcecraft.dev Ответ хаба: "type": "control_response",  "response": {"subtype": "success", "request_id": "c76cce43-…",               "response": {"behavior": "allow",                            "updatedInput": {"file_path": "/work/note.txt", "content": "hi"}}}}sourcecraft.dev При отказе вместо allow уходит {"behavior": "deny", "message": "…"}, и текст причины агент видит как результат инструмента. Codex - это JSON-RPC, и для команд и правок файлов у него разные методы: item/commandExecution/requestApproval и item/fileChange/requestApproval. Из параметров хаб берёт command или reason, а отвечает коротко: {"decision": "accept"}sourcecraft.dev или {"decision": "decline"}sourcecraft.dev Qwen работает по ACP. Запрос session/request_permission приходит со списком вариантов, и клиент должен выбрать один из них: {"sessionId": "s-1",  "toolCall": {"title": "rm -rf build", "kind": "execute",               "rawInput": {"command": "rm -rf build"}},  "options": [    {"optionId": "proceed_always_project", "kind": "allow_always"},    {"optionId": "proceed_once", "kind": "allow_once"},    {"optionId": "cancel", "kind": "reject_once"}]}sourcecraft.dev {"outcome": {"outcome": "selected", "optionId": "proceed_once"}}sourcecraft.dev Здесь я сознательно никогда не выбираю allow_always: с телефона легко нажать не туда, поэтому каждый вызов снова идёт к человеку. У Qwen есть и неочевидная особенность: свои уточняющие вопросы он присылает тем же session/request_permission, только с пометкой в _meta. Хабу приходится смотреть внутрь, чтобы понять, разрешение это или вопрос. Общий слой Чтобы Telegram не знал про протоколы, а агенты не знали про Telegram, между ними стоит небольшой трейт. Это «человек на той стороне»: /// Boxed futures keep the trait object-safe, so the backend does not depend on the messenger. pub trait UserChannel: Send + Sync {     fn request(&self, tool: ToolRequest) -> BoxFuture<'_, Decision>;     fn ask(&self, questions: Vec<Question>) -> BoxFuture<'_, QuestionsOutcome>;     fn send_file(&self, file: OutgoingFile) -> BoxFuture<'_, FileDelivery>; }sourcecraft.dev Каждый агент переводит свой запрос в ToolRequest, спрашивает канал и переводит Decision обратно в формат своего протокола. Для Codex это выглядит так: match method {     "item/commandExecution/requestApproval" => {         Ok(approve(channel, request(SHELL, &command_summary(&params))).await)     }     "item/fileChange/requestApproval" => {         Ok(approve(channel, request(PATCH, &file_change_summary(&params))).await)     }     "item/tool/call" => Ok(tool_response(call_tool(channel, &params).await?)),     "item/tool/requestUserInput" => user_input(channel, &params).await,     other => Err(RequestError::Unsupported(other.to_owned())), }sourcecraft.dev Всё остальное, что агент сообщает сам, без ответа, сводится к одному перечислению: pub enum AgentEvent {     SessionStarted(SessionId),     AssistantText(String),     ToolCall(ToolUse),     Finished(Finished),     Failed(String),     BackgroundAbandoned(Vec<String>),     Quota(QuotaUpdate), }sourcecraft.dev Код разбит на крейты: hub-core без ввода-вывода (команды, пути, отрисовка), hub-agent с общими типами и JSON-RPC, по крейту на каждого агента, hub-telegram на teloxide и hub-app с окном на egui. Telegram-крейт ничего не знает про control_request или ACP, а крейт агента - про кнопки. Чтобы добавить нового агента, нужен только новый крейт, который реализует перевод. Как запрос превращается в кнопку и обратно Агент ждёт ответа внутри своего протокола, а пользователь нажмёт кнопку когда-нибудь потом, в другом обработчике. Связать их помогает реестр ожидающих запросов и oneshot-канал: async fn approval(&self, tool: ToolRequest) -> Decision {     let id = ApprovalId::from_random(random_id());     let (responder, decision) = oneshot::channel();     lock(&self.registries).approvals.open(id.clone(), responder);     // ... отправляем сообщение с кнопками     match tokio::time::timeout(self.timeout, decision).await {         Ok(Ok(decision)) => decision,         Ok(Err(_)) => Decision::Denied(/* канал закрыт /),         Err(_) => {             // правим сообщение: «⌛ Нет ответа - запрещено»             Decision::Denied(/ тайм-аут */)         }     } }sourcecraft.dev У кнопок Telegram в callback_data помещается не больше 64 байт, поэтому туда кладётся только короткая строка вида ap:allow:<id> со случайным идентификатором. Обработчик нажатия разбирает её, находит в реестре нужный oneshot и отправляет в него решение. Агент в это время просто ждёт свой Decision. Если никто не ответил за отведённое время (по умолчанию 10 минут), вызов запрещается, а сообщение с кнопками правится, чтобы было видно, что ответа не было. Агент получает отказ и продолжает работу с его учётом, а не висит бесконечно. Ограничения Telegram Агенты пишут Markdown, а Telegram понимает только небольшое подмножество HTML: жирный, курсив, код, ссылки, <pre> и <blockquote>. Заголовков, списков и таблиц нет. Поэтому ответ агента разбирается через pulldown-cmark и пересобирается: заголовки становятся жирным текстом, пункты списков - строками с маркерами, а таблицы - строками «ключ: значение». Широкие таблицы на телефоне читаются плохо, их строки превращаются в карточки: первая ячейка - заголовок, остальные - подписанные поля. Сообщение в Telegram ограничено 4096 символами. Длинный ответ режется на части по границам строк, причём уже после экранирования: нельзя разрезать &amp; пополам, иначе Telegram отклонит всё сообщение. Даже после этого Telegram иногда отказывается разбирать разметку. Терять ответ агента из-за ошибки форматирования нельзя, поэтому в таком случае сообщение отправляется ещё раз обычным текстом. На ограничение частоты (RetryAfter) хаб делает одну повторную попытку, но ждёт не больше минуты, чтобы агент не простаивал из-за Telegram. Перенос сессий Отдельная история - команды /save и /restore, которые сохраняют сессию и продолжают её в другой теме. Казалось бы, достаточно запомнить ID сессии, но историю каждый агент хранит по-своему: у Claude это projects/<проект>/<id>.jsonl, у Codex - файлы rollout-…-<id> в sessions/, у Qwen и Hermes свои форматы. Поэтому у каждого агента своя реализация экспорта и импорта за общим трейтом SessionArchive. В снимок попадает только история самого агента, без файлов проекта и без данных входа. Безопасность Хаб запускает агентов на моём компьютере от моего пользователя, поэтому о безопасности пришлось думать с самого начала. - Стороннего сервера нет: приложение само ходит в Bot API и запускает CLI локально. - Бот принимает сообщения только из одной группы и только от пользователей из списка, остальное отклоняется и пишется в лог. - Что спрашивать, а что нет, решают режим разрешений и настройки самого агента. «Разрешить всегда» хаб не выбирает. - Рабочую директорию нельзя увести за пределы заданного корня, в том числе через симлинки. Файлы агент может прислать только из своей директории. - API-ключи хранятся в системном хранилище ключей, а не в файле настроек. Токены входа агентов хаб не читает. Главный риск остаётся: доступ к Telegram-аккаунту означает доступ к агентам. Так что без двухфакторной защиты в Telegram таким инструментом лучше не пользоваться. Почему Rust Один бинарник без рантайма для Windows, macOS и Linux, предсказуемое поведение процесса, который работает сутками, и строгие проверки компилятора и clippy. Сейчас в проекте около 33 тысяч строк, сборки для всех платформ собираются в GitHub Actions. Итого Самым полезным решением оказался узкий трейт между агентами и мессенджером. Протоколы у агентов разные и меняются, но всё, что нужно от человека, укладывается в три вопроса: можно ли выполнить, что ответить и куда отправить файл. Код открыт под MIT: aprazdnikov/agent-hub-rs. В планах английская версия и поддержка других агентов. А как вы работаете с агентами, когда отходите от компьютера?

  3. Trying to find the cause of a segfault in egui EDIT 2: Turns out the issue was specifically down to wgpu trying to use Dx12 which won't work for some reason. For anyone else having a similar issue, try following u/zettui 's suggestion of setting the WGPU_BACKEND environment variable to vulkan EDIT: after some digging, it looks like wgpu might not be compatible with my machine, which might be the source of my problems, as it can run in some cases but not consistently. I've been learning rust of a couple of months now, and have mainly done basic command-line toy programs, and wanted to try making a gui app with EGUI since it has support for a natively running GUI. I'm using the template that egui's lead developer provided (\github.com/emilk/eframe_template/tree/main) and can compile the included example, but attempting to run it causes a segmentation fault (this is using a up to date w11 machine) So far I've tried: - Completely reinstalling the rust toolchain - Increasing the stack size to 8mb via RUST_MIN_STACK (windows default is apparently 1mb?) - Attempting to build other egui applications from source that are known to work, which gets the same error I'm kind of at a loss for what to do, as I've tried using iced as well with similar issues, so as far as I can tell it's something that I've done, and not an issue with the libraries. If anyone else has had to solve issues like this, I'd really appreciate some advice

    12 points · 14 comments
  4. Reddit · · r/linuxaudio · u/M0Rf30 · emilk/egui

    Aulos: a native Rust music player with local, MPD and Subsonic sources, bit-exact DSD and a built-in MilkDrop 2/3 visualizer () Aulos is a music player for Linux, Windows and macOS. It's GPL-3.0 and uses egui on wgpu. The UI is pure Rust egui drawn on the GPU, not Tauri or Electron, so there's no webview and no JavaScript. The same code is compiled to WebAssembly for the browser version. What makes it different: - One app for three sources: your local library, MPD (as a remote control) and Subsonic/OpenSubsonic, all in the same UI. - A MilkDrop visualizer written in pure Rust. lactea runs MilkDrop 2 .milk presets and MilkDrop 3 .milk2 double presets on the GPU, with no projectM and no C++. On Linux it can also visualize MPD's output, captured through PipeWire. Curated presets: projectm-presets. - Bit-exact DSD: DSF/DFF files are sent as DoP to DACs that support it. Gapless, crossfade, ReplayGain, and a 10-band EQ with AutoEq profiles. - A tag editor in the style of Picard, with MusicBrainz and AcoustID lookups. It writes MP3, FLAC, Ogg, MP4, DSF, APE, WavPack and Musepack. - Runs in the browser: the same app compiled to WebAssembly, entirely on your machine: m0rf30.github.io Rust audio: decoding uses my forks of Symphonia (DSD, APE, WavPack hybrid, Musepack…) and cpal. The goal is to upstream these changes so the whole Rust audio ecosystem gets them, not just Aulos. Repo: M0Rf30/aulos

    2 comments
  5. egui 0.37 is out, with support for any colored emoji and glyph that your system supports (Korean, Chinese, etc)! It also has improved accessibility, an (experimental) theme plugin system, and much more! Full release notes here: github.com/emilk/egui/releases/tag/0.37.0

    17 likes · 1 repost
  6. YouTube · · YouTube description · Insight AI · emilk/egui

    Awesome Mac:  This project is dedicated, Transformers, Egui | GitHub Curated Picks | 2026-10-13 GitHub Curated Picks reviews 7 source-verified repositories selected for developer usefulness, not popularity position. Each pick is checked against its GitHub repository, README, release evidence, and recent commit; pick numbers are editorial order. The compact card keeps rank, signal, why it matters, and next check together while the ledger preserves direct URLs and release evidence. Treat the list as an educational review surface, not software endorsement, and verify license and maintenance before adoption. Chapters: 00:00 2026-10-13 | GitHub Curated Picks 00:05 Pick #1 Awesome Mac 00:22 Pick #2 Transformers 00:42 Pick #3 Egui 00:53 Pick #4 KernelSU 01:08 Pick #5 Flutter Server Box 01:22 Pick #6 Nautilus Trader 01:34 Pick #7 Evcc Source ledger: github.com/trending api.github.com github.com/jaywcjlove/awesome-mac/blob/master/REA… github.com/jaywcjlove/awesome-mac/commit/43ae31e8… api.github.com github.com/huggingface/transformers/blob/main/REA… github.com/huggingface/transformers/commit/78633e… api.github.com github.com/emilk/egui/blob/main/README.md github.com/emilk/egui/commit/dfe33185e4934adc7791… api.github.com github.com/tiann/KernelSU/blob/main/docs/README.md github.com/tiann/KernelSU/releases/tag/v3.3.1 api.github.com github.com/lollipopkit/flutter_server_box/blob/ma… github.com/lollipopkit/flutter_server_box/commit/… api.github.com github.com/nautechsystems/nautilus_trader/blob/de… github.com/nautechsystems/nautilus_trader/commit/… api.github.com github.com/evcc-io/evcc/blob/master/README.md github.com/evcc-io/evcc/commit/9783020cb2202a8c6e… jaywcjlove/awesome-mac huggingface/transformers emilk/egui tiann/KernelSU lollipopkit/flutter_server_box nautechsystems/nautilus_trader evcc-io/evcc Informational and educational purposes only. Not investment advice, product endorsement, or professional guidance.

    9 views
  7. RustのGUIを、web・desktop・Androidへ広げるimmediate-mode library。 eguiはpure Rustのportable GUI libraryです。公式eframe frameworkはWeb、Linux、macOS、Windows、Android向けappをサポートし、game engineへの組み込みもできます。 emilk/egui

    32 views
  8. egui 是 Emil Ernerfeldt 用 Rust 写的即时模式 GUI 库,作者也是 Rerun 的创始人。它不负责收集输入和渲染,这两件事交给后端集成,所以同一份 UI 代码能跑在 Web(Wasm + WebGL)、Linux、macOS、Windows 和 Android 上,也能嵌进 Bevy 这类游戏引擎。 emilk/egui t.co

    352 views
  9. Reddit · · r/BestGitHubRepos · u/company_url_finder · emilk/egui

    egui: an easy-to-use GUI in pure Rust (31.2k stars) What it does All text below is quoted directly from the project README. >egui (pronounced "e-gooey") is a simple, fast, and highly portable immediate mode GUI library for Rust. egui runs on the web, natively, and in your favorite game engine. >egui aims to be the easiest-to-use Rust GUI library, and the simplest way to make a web app in Rust. Goals: - The easiest to use GUI library - Responsive: target 60 Hz in debug build - Friendly: difficult to make mistakes, and shouldn't panic - Portable: the same code works on the web and as a native app - Easy to integrate into any environment - Pure immediate mode: no callbacks - Safe: there is no unsafe code in egui - Minimal dependencies Features: - Widgets: label, text button, hyperlink, checkbox, radio button, slider, draggable value, text editing, color picker, spinner - Layouts: horizontal, vertical, columns, automatic wrapping - Text editing: multiline, copy/paste, undo, emoji supports - Windows: move, resize, name, minimize and close. Automatically sized and positioned. >eframe is the official egui framework, which supports writing apps for Web, Linux, Mac, Windows, and Android. Repository emilk/egui Repository stats |Metric|Value| |:-|:-| |Stars|31,182| |Forks|2,186| |Last release|0.36.2 (2026-09-08)| |Languages|Rust 98.8%| |Contributors|629| |AI contributor accounts (Claude / Codex / Cursor / Copilot)|claude (115 commits), Copilot (7)| |AI co-authored commits|Claude: 115, Copilot: 7| Main contributor |Field|Value| |:-|:-| |Name|Emil Ernerfeldt| |GitHub|@emilk| |Commits to this repo|3,392 (top contributor)| |Bio|Rust coder, creator of egui, CTO of rerun.io| |Company / Location|Rerun.io, egui / Stockholm, Sweden| |Website|ilikebigbits.com| |Followers|8,177| |Public repos|91| |On GitHub since|2011-10-24| --------------------------------------------------------------------------------------------- Discover the best GitHub repos without the endless scrolling. Get top repos organized by category (AI, DevOps, Databases & more), plus key takeaways from developers' most useful comments - all in one free, twice-weekly newsletter. 👉 Get the best repos & community insights - Free

    62 points · 3 comments
  10. Wait is this not giga? This guy literally created the term "Carlos" in a metaphorical sense, inntertwiining with the metaphysical realm in turn, this integer is represented in a way that is superphysiological fees to the dev github.com/emilk x.com

    2 likes · 63 views

Achievements

Awards earned by the repositories emilk owns. Select an award to embed its badge.

No awards yet

Repositories earn awards by reaching the top three in a completed trending day or week.

A repository earns an award for finishing first, second or third in a completed trending day or week, ranked by new stars, new forks or pull request authors. Awards follow a repository through renames and transfers and count toward its current owner. Weeks run Monday to Sunday, UTC.