{"id":2261,"date":"2026-08-19T19:01:15","date_gmt":"2026-08-19T12:01:15","guid":{"rendered":"https:\/\/lazarewww.ru\/cases\/dev-platform-2\/"},"modified":"2026-08-19T19:01:15","modified_gmt":"2026-08-19T12:01:15","slug":"dev-platform","status":"publish","type":"isotope","link":"https:\/\/lazarewww.ru\/en\/cases\/dev-platform\/","title":{"rendered":"Dev Platform"},"content":{"rendered":"<div class=\"wp-bootstrap-blocks-row row\">\n\t\n\n<div class=\"col-12 col-lg-3\">\n\t\t\t\n\n<h2 class=\"wp-block-heading with_decor\" id=\"vvedenie\">Introduction:<\/h2>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-5\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">It started with an everyday annoyance. I didn&#8217;t want to carry a bulky laptop around and was looking for a way to write code from my phone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I tried Linux emulation on Android, installed code-server. Working in a browser was possible, but it wasn&#8217;t the full cycle: without plugins and half of what a real editor can do, it never got further than editing a couple of files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meanwhile development itself was changing \u2014 more and more of the work was moving into generation under my control. And then I got a server of my own. That settled the question for good: how do I work from any device without installing anything on it.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-gallery\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"860\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-mobile-terminal.jpg\" alt=\"Dev Platform full-screen terminal on a phone\" class=\"wp-image-1734\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-terminal.jpg 420w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-terminal-147x300.jpg 147w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><figcaption class=\"wp-element-caption\">A full terminal on a phone \u2014 the same session that was open on the laptop.<\/figcaption><\/figure>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"860\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-mobile-keys.jpg\" alt=\"Dev Platform terminal on a phone with an extra key bar: Ctrl, Esc, Tab\" class=\"wp-image-1733\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-keys.jpg 420w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-keys-147x300.jpg 147w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><figcaption class=\"wp-element-caption\">The keys an on-screen keyboard doesn&#8217;t have get their own bar, with sticky modifiers.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n\n<hr class=\"hr-dashed opacity-50 my-5\">\n\n\n<div class=\"wp-bootstrap-blocks-row row\">\n\t\n\n<div class=\"col-12 col-lg-3\">\n\t\t\t\n\n<h2 class=\"wp-block-heading with_decor\" id=\"hod-raboty\">How it went:<\/h2>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-5\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\"><strong>The first version was a terminal in the browser.<\/strong> I put it together on off-the-shelf libraries first, then moved to my own implementation: other people&#8217;s solutions hit a ceiling exactly where things got interesting. In May 2026 I rewrote everything on Laravel and Vue \u2014 that version ran for a week alongside the old one, on the same server, so I could compare and roll back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Then a team environment was needed.<\/strong> The tool I was building for myself turned out to be useful to more people than me. From that point on the terminal stopped being the product and became one part of the platform.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-text\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">The terminal isn&#8217;t the point in itself. All the work goes through CLI agents: we treat it as a discipline to set up a proper agent system for every project \u2014 with roles, a review procedure and a canon of its own. A system like that lives in the command line, which means there are a lot of terminals, they run long, and they have to be kept somewhere. Hence the sessions, the splits and everything else around them.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-text\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\"><strong>Sessions instead of a terminal.<\/strong> A work session lives in its own container at the operating-system level: its own file system, its own processes, its own memory and disk limits. Not a project folder but a machine in its own right. A neighbour can&#8217;t reach into it, even if they want to.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-sessions.jpg\" alt=\"Dev Platform work sessions: environment, project, owner and last activity\" class=\"wp-image-1731\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-sessions.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-sessions-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-sessions-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-sessions-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-sessions-900x563.jpg 900w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Personal and team environments: statuses, entry points, last activity.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1439\" height=\"732\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-session-single.png\" alt=\"A live Dev Platform session: the agent is working, output streams in real time\" class=\"wp-image-2093\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single.png 1439w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single-300x153.png 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single-1024x521.png 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single-768x391.png 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single-900x458.png 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-single-600x305.png 600w\" sizes=\"auto, (max-width: 1439px) 100vw, 1439px\" \/><figcaption class=\"wp-element-caption\">A live session: the agent is working, output streams in real time.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-gallery\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1439\" height=\"730\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-session-split-light.png\" alt=\"Two Dev Platform sessions side by side in one window\" class=\"wp-image-2094\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light.png 1439w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light-300x152.png 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light-1024x519.png 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light-768x390.png 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light-900x457.png 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-light-600x304.png 600w\" sizes=\"auto, (max-width: 1439px) 100vw, 1439px\" \/><figcaption class=\"wp-element-caption\">Two sessions side by side in one window.<\/figcaption><\/figure>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1438\" height=\"732\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark.png\" alt=\"The same Dev Platform session split in the dark theme\" class=\"wp-image-2095\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark.png 1438w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark-300x153.png 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark-1024x521.png 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark-768x391.png 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark-900x458.png 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-session-split-dark-600x305.png 600w\" sizes=\"auto, (max-width: 1438px) 100vw, 1438px\" \/><figcaption class=\"wp-element-caption\">The same split in the dark theme.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-text\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\"><strong>Working with files.<\/strong> Project tree, editor, search. Together with the sessions, that is what closed the original task \u2014 files and terminal together now replace an editor with plugins, and cover more ground than it did. The project didn&#8217;t grow into that at once.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs.jpg\" alt=\"Dev Platform code editor: file tree, tabs and syntax highlighting\" class=\"wp-image-2063\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-tabs-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">File tree, tabs of open files, and the editor with highlighting.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-editor-split.jpg\" alt=\"Split mode in Dev Platform: two files open side by side\" class=\"wp-image-2064\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-editor-split-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Split: two files side by side in one window.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-markdown.jpg\" alt=\"Dev Platform Markdown editor: source on the left, rendered view on the right\" class=\"wp-image-2065\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-markdown-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Markdown: source on the left, rendered view on the right \u2014 edits show up immediately.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-schema-map.jpg\" alt=\"Project relationship map in Dev Platform: a graph of database, backend and frontend nodes\" class=\"wp-image-2068\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-map-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Project relationship map: 500 of the graph&#8217;s 2123 nodes in frame.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-schema-node.jpg\" alt=\"Project schema in Dev Platform: table list and the panel of the selected node\" class=\"wp-image-2066\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-node-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Schema listing: database tables, with the migrations and the model of the selected one on the right.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-schema-search.jpg\" alt=\"Project index search in Dev Platform: migrations, models and controllers in one list\" class=\"wp-image-2067\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-schema-search-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Index search: migrations, methods and controllers in one set of results.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-split\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\"><strong>A kanban for development.<\/strong> Task boards with time tracking, team sections, access control. The things without which two or more people can&#8217;t use a tool every day.<\/p>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"860\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-mobile-tasks.jpg\" alt=\"Dev Platform task board on a phone\" class=\"wp-image-1737\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-tasks.jpg 420w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-mobile-tasks-147x300.jpg 147w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><figcaption class=\"wp-element-caption\">The board: columns scroll sideways, a card opens full screen.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards.jpg\" alt=\"Dev Platform tasks section: boards grouped into sections\" class=\"wp-image-2069\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-boards-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Task boards grouped by team section.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1439\" height=\"730\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-board-tasks.jpg\" alt=\"Dev Platform kanban board: columns by stage, cards with priority and assignee\" class=\"wp-image-2156\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks.jpg 1439w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks-300x152.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks-1024x519.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks-768x390.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks-900x457.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-tasks-600x304.jpg 600w\" sizes=\"auto, (max-width: 1439px) 100vw, 1439px\" \/><figcaption class=\"wp-element-caption\">A board in use: columns by stage, cards carry a priority and an assignee.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1439\" height=\"726\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-board-presence.jpg\" alt=\"Dev Platform kanban board: presence marker on a card, assignee avatars, per-column counters\" class=\"wp-image-2157\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence.jpg 1439w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence-300x151.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence-1024x517.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence-768x387.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence-900x454.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-board-presence-600x303.jpg 600w\" sizes=\"auto, (max-width: 1439px) 100vw, 1439px\" \/><figcaption class=\"wp-element-caption\">Presence: you can see who is in a card right now and how much time has gone into it.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"580\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics.jpg\" alt=\"Dev Platform task analytics: a chart of closed tasks by day\" class=\"wp-image-2070\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics-300x121.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics-1024x412.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics-768x309.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics-900x363.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-tasks-analytics-600x242.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Analytics: closed per day and a cumulative curve across all boards.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-text\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\"><strong>Automation.<\/strong> Since August a bot has been picking up tasks from the kanban: it takes a card from the right column, spins up a session, drops the brief into it and drives it to a result. The verdict on readiness is a separate step \u2014 &#171;done&#187; doesn&#8217;t happen by itself. A snapshot of the state is attached to the card, and a notification goes out to the messenger.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/08\/devplat-task-card.jpg\" alt=\"Dev Platform task card: column, priority, assignee, checklist and attachments\" class=\"wp-image-1744\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-task-card.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-task-card-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-task-card-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-task-card-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/08\/devplat-task-card-900x563.jpg 900w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">The card: description, checklists, attachments, discussion \u2014 and the brief for the agent.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-media case-media--full\">\n\t\n\n<div class=\"col-12\">\n\t\t\t\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"900\" src=\"\/wp-content\/uploads\/2026\/09\/devplat-devy.jpg\" alt=\"The Devy bot panel in Dev Platform: binding to a board and an environment, event log\" class=\"wp-image-2071\" srcset=\"https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy.jpg 1440w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy-300x188.jpg 300w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy-1024x640.jpg 1024w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy-768x480.jpg 768w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy-900x563.jpg 900w, https:\/\/lazarewww.ru\/wp-content\/uploads\/2026\/09\/devplat-devy-600x375.jpg 600w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">The bot panel: binding to a board and an environment, and a log of its steps on the task.<\/figcaption><\/figure>\n\n\t<\/div>\n\n<\/div>\n\n\n<div class=\"wp-bootstrap-blocks-row row case-text\">\n\t\n\n<div class=\"col-12 col-lg-6\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">A word on verification, separately, because in work like this it is the main thing. The trouble with generation isn&#8217;t broken code \u2014 broken code shows itself straight away. The trouble is a plausible result with an invented justification. So verification here isn&#8217;t the goodwill of whoever did the work, it&#8217;s a mandatory stage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Once I had to restore all of it.<\/strong> In June the server disk died. The platform came back from backups in twenty-four hours.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n\n<hr class=\"hr-dashed opacity-50 my-5\">\n\n\n<div class=\"wp-bootstrap-blocks-row row\">\n\t\n\n<div class=\"col-12 col-lg-3\">\n\t\t\t\n\n<h2 class=\"wp-block-heading with_decor\" id=\"rezultat\">Result:<\/h2>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-5\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">The platform has been in use since June 2026. There are six teams on it now \u2014 development, product and adjacent departments. Each has an environment of its own, plus personal ones that are started and shut down as needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside: sessions in isolated environments, files, an editor, task boards, automation, backups, quotas. From the outside \u2014 a single link in a browser. A phone will do.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original task it all started with was solved along the way: you can work from any device.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n\n<hr class=\"hr-dashed opacity-50 my-5\">\n\n\n<div class=\"wp-bootstrap-blocks-row row\">\n\t\n\n<div class=\"col-12 col-lg-3\">\n\t\t\t\n\n<h2 class=\"wp-block-heading with_decor\" id=\"moya-rol\">My role:<\/h2>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-5\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">The project is entirely mine \u2014 the idea, the architecture, the code. I wrote every version, from the first terminal to the platform as it is now.<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n\n\n\n<hr class=\"hr-dashed opacity-50 my-5\">\n\n\n<div class=\"wp-bootstrap-blocks-row row\">\n\t\n\n<div class=\"col-12 col-lg-3\">\n\t\t\t\n\n<h2 class=\"wp-block-heading with_decor\" id=\"stek\">Stack:<\/h2>\n\n\t<\/div>\n\n\n\n<div class=\"col-12 col-lg-5\">\n\t\t\t<div class=\"p-2\">\n\t\t\t\n\n<p class=\"wp-block-paragraph\">Laravel \u00b7 PHP 8.3 \u00b7 PostgreSQL 18 \u00b7 Redis \u00b7 Vue 3 \u00b7 TypeScript \u00b7 Incus \u00b7 WebSocket<\/p>\n\n\t\t<\/div>\n\t<\/div>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>An internal workspace for a development team: work sessions in isolated environments, task boards with time tracking, and full-scale work from any device.<\/p>\n","protected":false},"featured_media":2089,"template":"","isotope_tag":[90,89],"class_list":["post-2261","isotope","type-isotope","status-publish","has-post-thumbnail","hentry","isotope_category-web-apps-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/lazarewww.ru\/?rest_route=\/wp\/v2\/isotope\/2261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lazarewww.ru\/?rest_route=\/wp\/v2\/isotope"}],"about":[{"href":"https:\/\/lazarewww.ru\/?rest_route=\/wp\/v2\/types\/isotope"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lazarewww.ru\/?rest_route=\/wp\/v2\/media\/2089"}],"wp:attachment":[{"href":"https:\/\/lazarewww.ru\/?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2261"}],"wp:term":[{"taxonomy":"isotope_tag","embeddable":true,"href":"https:\/\/lazarewww.ru\/?rest_route=%2Fwp%2Fv2%2Fisotope_tag&post=2261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}