{"version":"https://jsonfeed.org/version/1","title":"Micro.blog - Adin Ćebić","home_page_url":"https://micro.blog","feed_url":"https://micro.blog/posts/adincebic","_microblog":{"about":"https://micro.blog/about/api","id":"92727","username":"adincebic","bio":"Hi, I’m Adin — an iOS platform engineer and tech lead specializing in build systems, scalability, and developer experience.\n\nI’m a **core maintainer of the official Bazel rules for Apple platforms** — including [rules_apple](https://github.com/bazelbuild/rules_apple), [rules_swift](https://github.com/bazelbuild/rules_swift), [apple_support](https://github.com/bazelbuild/apple_support) and [rules_xcodeproj](https://github.com/MobileNativeFoundation/rules_xcodeproj). I actively contribute to the Bazel ecosystem and help shape how Apple platform projects are built at scale.\n\nMy work focuses on transforming large iOS codebases into fast, modular, and maintainable systems. I lead Bazel migrations, design monorepo architectures, optimize CI/CD pipelines, and build platform infrastructure that enables teams to ship confidently and efficiently.\n\nThroughout my career, I’ve owned production SDKs processing millions of receipts, built fintech apps used by hundreds of thousands of users, and worked across iOS, watchOS, macOS, IoT, and Bluetooth systems.\n\nI regularly share what I learn through writing and international conference talks, including iOSDevUK and trySwift New York.\n\nI believe great developer experience is a competitive advantage — and platform engineering is how you build it.\n\n## Get in touch\n\nGithub: [adincebic](https://github.com/adincebic)\nLinkedin: https://www.linkedin.com/in/adincebic","pronouns":"","is_following":false,"is_you":false,"following_count":1,"discover_count":0},"author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://avatars.micro.blog/avatars/2021/92727.jpg"},"items":[{"id":"88103212","content_html":"<p>Reconfiguring bazel downloader: <a href=\"https://adincebic.com/2026/04/12/reconfiguring-bazel-downloader.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/04/12/reconfiguring-bazel-downloader.html","date_published":"2026-04-12T14:00:36+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-04-12 14:00","date_timestamp":1776002436,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"87656850","content_html":"<p>Bazel Output Groups: Producing Outputs on Demand: <a href=\"https://adincebic.com/2026/04/05/bazel-output-groups-producing-outputs.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/04/05/bazel-output-groups-producing-outputs.html","date_published":"2026-04-05T18:39:47+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-04-05 18:39","date_timestamp":1775414387,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"87201266","content_html":"<p>What Bazel Really Runs (and How to See It): <a href=\"https://adincebic.com/2026/03/29/what-bazel-really-runs-and.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/03/29/what-bazel-really-runs-and.html","date_published":"2026-03-29T16:16:03+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-03-29 16:16","date_timestamp":1774800963,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"86716035","content_html":"<p>Bazel split transitions: <a href=\"https://adincebic.com/2026/03/22/bazel-split-transitions.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/03/22/bazel-split-transitions.html","date_published":"2026-03-22T09:48:39+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-03-22 09:48","date_timestamp":1774172919,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"86262192","content_html":"<p>How to Fix Xcode Source Editor Extensions That Don’t Appear in the Editor Menu: <a href=\"https://adincebic.com/2026/03/15/how-to-fix-xcode-source.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/03/15/how-to-fix-xcode-source.html","date_published":"2026-03-15T18:35:16+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-03-15 18:35","date_timestamp":1773599716,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"85763480","content_html":"<p>Managing Bazel Flags in Monorepos with Flagsets (PROJECT.scl): <a href=\"https://adincebic.com/2026/03/08/managing-bazel-flags-in-monorepos.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/03/08/managing-bazel-flags-in-monorepos.html","date_published":"2026-03-08T13:10:15+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-03-08 13:10","date_timestamp":1772975415,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"85269575","content_html":"<p>Composing Bazel rules with subrules: <a href=\"https://adincebic.com/2026/03/01/composing-bazel-rules-with-subrules.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/03/01/composing-bazel-rules-with-subrules.html","date_published":"2026-03-01T11:59:58+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-03-01 11:59","date_timestamp":1772366398,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"84787174","content_html":"<p>Applying Bazel Transitions to Third-Party Rules the Right Way: <a href=\"https://adincebic.com/2026/02/22/applying-bazel-transitions-to-thirdparty.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/02/22/applying-bazel-transitions-to-thirdparty.html","date_published":"2026-02-22T13:37:56+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-02-22 13:37","date_timestamp":1771767476,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"84724276","content_html":"<p>Creating Custom Command-Line Flags in Bazel: <a href=\"https://adincebic.com/2026/02/21/creating-custom-commandline-flags-in.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/02/21/creating-custom-commandline-flags-in.html","date_published":"2026-02-21T11:40:54+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-02-21 11:40","date_timestamp":1771674054,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"83829698","content_html":"<p>Using features in bazel rules: <a href=\"https://adincebic.com/2026/02/08/using-features-in-bazel-rules.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/02/08/using-features-in-bazel-rules.html","date_published":"2026-02-08T10:02:02+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-02-08 10:02","date_timestamp":1770544922,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"83333929","content_html":"<p>Executing actions from Bazel aspects: <a href=\"https://adincebic.com/2026/02/01/executing-actions-from-bazel-aspects.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/02/01/executing-actions-from-bazel-aspects.html","date_published":"2026-02-01T08:56:10+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-02-01 08:56","date_timestamp":1769936170,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"82822845","content_html":"<p>Utilizing Bazel aspect_hints rule attribute: <a href=\"https://adincebic.com/2026/01/25/utilizing-bazel-aspecthints-rule-attribute.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/01/25/utilizing-bazel-aspecthints-rule-attribute.html","date_published":"2026-01-25T11:37:47+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-01-25 11:37","date_timestamp":1769341067,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"82309615","content_html":"<p>Introduction to aspects in Bazel: <a href=\"https://adincebic.com/2026/01/18/introduction-to-aspects-in-bazel.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/01/18/introduction-to-aspects-in-bazel.html","date_published":"2026-01-18T09:09:10+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-01-18 09:09","date_timestamp":1768727350,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"81819522","content_html":"<p>Bazel toolchains, repository rules and module extensions: <a href=\"https://adincebic.com/2026/01/11/bazel-toolchains-repository-rules-and.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/01/11/bazel-toolchains-repository-rules-and.html","date_published":"2026-01-11T13:23:41+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-01-11 13:23","date_timestamp":1768137821,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"81340278","content_html":"<p>Writing a simple bazel rule: <a href=\"https://adincebic.com/2026/01/04/writing-a-simple-bazel-rule.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2026/01/04/writing-a-simple-bazel-rule.html","date_published":"2026-01-04T18:51:46+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2026-01-04 18:51","date_timestamp":1767552706,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"71503790","content_html":"<p>Reverse Engineering Apple's on-demand resource Asset Packs: How to Recreate .assetpack Files with Standard Unix Tools: <a href=\"https://adincebic.com/2025/08/18/reverse-engineering-apples-ondemand-resource.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2025/08/18/reverse-engineering-apples-ondemand-resource.html","date_published":"2025-08-18T13:36:33+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2025-08-18 13:36","date_timestamp":1755524193,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"28285762","content_html":"<p>A case for exact versioning and ignoring Package.resolved file: <a href=\"https://adincebic.com/2023/12/24/a-case-for.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2023/12/24/a-case-for.html","date_published":"2023-12-24T09:06:43+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2023-12-24 09:06","date_timestamp":1703408803,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"23929124","content_html":"<p>Integrating Conan with Xcode to manage C/C++ libraries: <a href=\"https://adincebic.com/2023/09/23/integrating-conan-with.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2023/09/23/integrating-conan-with.html","date_published":"2023-09-23T07:11:59+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2023-09-23 07:11","date_timestamp":1695453119,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"23044872","content_html":"<p>Linking C++ static library in iOS project: <a href=\"https://adincebic.com/2023/09/03/linking-c-static.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2023/09/03/linking-c-static.html","date_published":"2023-09-03T13:17:05+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2023-09-03 13:17","date_timestamp":1693747025,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"21528101","content_html":"<p>Introducing the existentialannotator: A Swift Command Line Tool that automatically marks all existential types with : <a href=\"https://adincebic.com/2023/07/30/automatically-mark-all.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2023/07/30/automatically-mark-all.html","date_published":"2023-07-30T17:14:23+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2023-07-30 17:14","date_timestamp":1690737263,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"13243479","content_html":"<p>Using Swift withCheckedThrowingContinuation in methods without return value: <a href=\"https://adincebic.com/2022/08/08/using-swift-withcheckedthrowingcontinuation.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2022/08/08/using-swift-withcheckedthrowingcontinuation.html","date_published":"2022-08-08T16:05:00+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2022-08-08 16:05","date_timestamp":1659974700,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"12637912","content_html":"<p>How to check if Xcode is building for previews: <a href=\"https://adincebic.com/2022/03/28/how-to-check.html\">adincebic.com</a></p>","summary":"","url":"https://adincebic.com/2022/03/28/how-to-check.html","date_published":"2022-03-28T10:11:28+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2022-03-28 10:11","date_timestamp":1648462288,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":true,"is_mention":false,"note":"","syndication":[]}},{"id":"12608986","content_html":"I have spent some time playing with Apple’s Multi Peer connectivity framework on iOS. It is incredible what kind of apps it enables. Here is my unfinished sample app that allows for voice calls in cases where there is no internet access or even infrastructure Wi-Fi. I have to say that m... <a href=\"https://adincebic.com/2022/03/22/i-have-spent.html\">adincebic.com</a>","summary":"","url":"https://adincebic.com/2022/03/22/i-have-spent.html","date_published":"2022-03-22T05:23:38+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2022-03-22 05:23","date_timestamp":1647926618,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":false,"is_mention":false,"note":"","syndication":[]}},{"id":"20960366","content_html":"<p>I recently tried new 14-inch macBook Pro. Don’t know why, but aluminum doesn’t feel as good as on previous generations. Feels kinda cheap.</p>\n","summary":"","url":"https://adincebic.com/2021/11/01/i-recently-tried.html","date_published":"2021-11-01T21:05:54+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2021-11-01 21:05","date_timestamp":1635800754,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":false,"is_mention":false,"note":"","syndication":[]}},{"id":"20960371","content_html":"<p>I have been iOS developer for about four years and never got to build iPad only app. This is going to be exciting.</p>\n","summary":"","url":"https://adincebic.com/2021/10/20/i-have-been.html","date_published":"2021-10-20T17:55:47+00:00","author":{"name":"Adin Ćebić","url":"http://Https://adincebic.com","avatar":"https://cdn.micro.blog/photos/96/https%3A%2F%2Favatars.micro.blog%2Favatars%2F2021%2F92727.jpg","_microblog":{"username":"adincebic"}},"_microblog":{"date_relative":"2021-10-20 17:55","date_timestamp":1634752547,"is_favorite":false,"is_bookmark":false,"is_deletable":false,"is_conversation":false,"is_linkpost":false,"is_mention":false,"note":"","syndication":[]}}]}