{"id":16031,"date":"2026-02-10T13:34:22","date_gmt":"2026-02-10T06:34:22","guid":{"rendered":"https:\/\/labamu.co.id\/career\/senior-mobile-engineer\/"},"modified":"2026-02-10T15:55:13","modified_gmt":"2026-02-10T08:55:13","slug":"senior-mobile-engineer","status":"publish","type":"career","link":"https:\/\/labamu.co.id\/en\/career\/senior-mobile-engineer\/","title":{"rendered":"Senior Mobile Engineer"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"16031\" class=\"elementor elementor-16031\" data-elementor-post-type=\"career\">\n\t\t\t\t<div class=\"elementor-element elementor-element-46f050b e-flex e-con-boxed e-con e-parent\" data-id=\"46f050b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-f989de4 e-con-full e-flex e-con e-child\" data-id=\"f989de4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3ce1d10 e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"3ce1d10\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInLeft&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd59290 elementor-widget elementor-widget-page-title\" data-id=\"bd59290\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;align&quot;:&quot;left&quot;}\" data-widget_type=\"page-title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\n\t\t<div class=\"hfe-page-title hfe-page-title-wrapper elementor-widget-heading\">\n\n\t\t\t\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\n\t\t\t\t\t\t\t\t\n\t\t\t\tSenior Mobile Engineer  \n\t\t\t<\/h2 > \n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-90f994e elementor-widget elementor-widget-html\" data-id=\"90f994e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"career-meta\"><\/div><div id=\"career-detail\" class=\"career-detail-wrapper\"><\/div><style>.career-meta {\n    display: flex;\n    align-items: center;\n    font-family: \"Inter\", sans-serif;\n    font-size: 18px;\n    color: #fff; \/* ganti sesuai tema (misal #222 utk dark text) *\/\n    flex-wrap: wrap;\n  }\n  \n  .career-meta span {\n    display: inline-block;\n    margin-right: 8px;\n  }\n  \n  .separator {\n    opacity: 0.6;\n    margin: 0 8px;\n  }\n  \n  .posted-time {\n    margin-left: auto;\n    font-size: 13px;\n    opacity: 0.8;\n  }\n  \n  .btn-apply {\n    border: 1px solid #fff;\n    color: #fff;\n    padding: 12px 24px;\n    border-radius: 8px;\n    transition: 0.3s;\n    text-decoration: none;\n  }\n\n  .btn-apply:hover {\n    background: #fff;\n    color: #fff;\n  }\n  <\/style><script>document.addEventListener(\"DOMContentLoaded\", function () {\n  const pathParts = window.location.pathname.split(\"\/\").filter(Boolean);\n  const slug = pathParts[pathParts.length - 1];\n  const apiUrl = `\/wp-json\/wp\/v2\/career?slug=${slug}&_fields=acf,date`;\n\n  fetch(apiUrl)\n    .then(res => res.json())\n    .then(data => {\n      if (!data.length || !data[0].acf) return;\n      const acf = data[0].acf;\n      const date = data[0].date;\n      const dateTime = new Date(date);\n\n\n      const buttonHtml =  `<button class=\"btn-apply\" onclick=\"window.open('${acf.link}', '_blank')\">Daftar Sekarang\n        <\/button>`\n\n      document.querySelector(\".career-meta\").innerHTML = `\n        <span>${acf.location}<\/span><span class=\"separator\">\u25aa<\/span><span>${acf.job_type.split(\": \")[1]}<\/span><span class=\"separator\">\u25aa<\/span><span>Posted Date: ${dateTime.toLocaleDateString(\"id-ID\")}<\/span>`;\n\n    })\n    .catch(err => console.error(err));\n});\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ff873e6 elementor-widget elementor-widget-heading\" data-id=\"ff873e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Experience Level: 5+ years in Mobile Engineering<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b6fb096 elementor-widget elementor-widget-button\" data-id=\"b6fb096\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-size-sm\" role=\"button\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Apply<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0cdbb48 e-flex e-con-boxed e-con e-parent\" data-id=\"0cdbb48\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0f9d60a elementor-widget elementor-widget-text-editor\" data-id=\"0f9d60a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p class=\"p1\">We are looking for a Senior Mobile Engineer to lead the development of high-quality mobile applications on Android and iOS platforms. You will play a key role in designing the architecture, building, and scaling our mobile products, as well as collaborating closely with Product Managers, Designers, and Backend Engineers. <\/p><p class=\"p3\">This role is ideal for individuals who have a passion for clean architecture, application performance and superior user experience.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b6a57dc e-flex e-con-boxed e-con e-parent\" data-id=\"b6a57dc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b038f6f elementor-widget elementor-widget-text-editor\" data-id=\"b038f6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3><b>Key Responsibilities:<\/b><\/h3><ul><li>Design, develop and maintain cross-platform mobile applications using Flutter<\/li><li>Architecting mobile solutions that are scalable, easy to maintain, and easy to test<\/li><li>Translate product requirements and UI\/UX design into high-quality code<\/li><li>Integrate mobile applications with third-party backend services, APIs and SDKs<\/li><li>Ensure application performance, security and responsiveness<\/li><li>Write clean, well-documented, and testable code<\/li><li>Conduct code reviews and mentor junior engineers<\/li><li>Collaborate with cross-functional teams to define, design, and release new features<\/li><li>Performs troubleshooting, debugging, and improvements to existing applications<\/li><li>Always follow the latest developments in Flutter, Dart, and mobile development best practices<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1a04dfc elementor-widget elementor-widget-text-editor\" data-id=\"1a04dfc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3><b>Required Qualifications:<\/b><\/h3><ul><li>5+ years of experience in mobile application development<\/li><li>3+ years hands-on experience using Flutter and Dart<\/li><li>Strong understanding of mobile application architecture (MVC, MVVM, Clean Architecture)<\/li><li>Experience with state management solutions (Bloc, Provider, Riverpod, etc.)<\/li><li>Solid understanding of RESTful APIs and asynchronous programming<\/li><li>Integration experience with backend services, authentication and payment systems<\/li><li>Familiar with the Android build process &amp; iOS, CI\/CD, and deployment to the App Store &amp; Play Store<\/li><li>Have good problem solving skills and high attention to detail<\/li><li>Able to work independently and have a sense of ownership of features<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-660bf40 elementor-widget elementor-widget-text-editor\" data-id=\"660bf40\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3><b>Added Value (Nice to Have):<\/b><\/h3><ul><li>Experience in fintech, e-commerce, or large-scale consumer applications<\/li><li>Knowledge of native Android (Kotlin) or iOS (Swift) development<\/li><li>Experience using Firebase, analytics tools, and crash reporting<\/li><li>Familiar with automated testing (unit tests, widget tests, integration tests)<\/li><li>Experience working in an agile \/ scrum environment<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9ae530c e-flex e-con-boxed e-con e-parent\" data-id=\"9ae530c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8005387 elementor-widget elementor-widget-html\" data-id=\"8005387\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"event-register\" class=\"register-wrapper\"><\/div>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  \/\/ Ambil slug dari URL\n  const pathParts = window.location.pathname.split(\"\/\").filter(Boolean);\n  const slug = pathParts[pathParts.length - 1]; \n\n  \/\/ API endpoint\n  const apiUrl = `\/wp-json\/wp\/v2\/career?slug=${slug}&_fields=acf`;\n\n  fetch(apiUrl)\n    .then(res => res.json())\n    .then(data => {\n      if (!data.length || !data[0].acf) {\n        document.getElementById(\"event-register\").innerHTML = \"\";\n        return;\n      }\n\n      const acf = data[0].acf;\n        const dateTime = new Date(acf.date_time);\n        const now = new Date();\n\n\n      \/\/ cek apakah sudah lewat\n      const isExpired = dateTime < now;\n      const buttonHtml =  `<a href=\"${acf.link}\" target=\"_blank\" class=\"btn-register\">Apply<\/a>`\n\n      document.getElementById(\"event-register\").innerHTML = `\n        ${buttonHtml}\n      `;\n    })\n    .catch(err => {\n      console.error(err);\n      document.getElementById(\"event-register\").innerHTML = \"\";\n    });\n});\n<\/script>\n\n<style>\n.register-wrapper {\n  display: flex;  \/* vertical center (kalau tinggi diberi) *\/\n  margin: 20px 20px;\n}\n\n.btn-register {\n  display: inline-block;\n  background: #007bff;\n  color: #fff !important;\n  padding: 12px 28px;\n  border-radius: 8px;\n  font-weight: bold;\n  font-size: 16px;\n  text-decoration: none;\n  transition: background 0.3s;\n}\n\n.btn-register:hover {\n  background: #0056b3;\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3df216e e-flex e-con-boxed e-con e-parent\" data-id=\"3df216e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-3d9ae91 e-con-full e-flex e-con e-child\" data-id=\"3d9ae91\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97a333c elementor-widget elementor-widget-heading\" data-id=\"97a333c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Career Recommendations For You<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a8667b4 e-flex e-con-boxed e-con e-parent\" data-id=\"a8667b4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f803364 elementor-widget elementor-widget-html\" data-id=\"f803364\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\/* Wrapper *\/\n    .post-grid-wrapper {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 20px;\n      font-family: sans-serif;\n    }\n    \n    \/* Dropdown + search *\/\n    .post-filter {\n     margin-bottom: 20px;\n     display: flex;\n     justify-content: space-between; \/* kiri - kanan *\/\n     align-items: center;\n     flex-wrap: wrap; \/* biar turun ke bawah di layar kecil *\/\n     gap: 20px;\n    }\n\n    \/* Kiri *\/\n.filter-left {\n  display: flex;\n  align-items: center;\n  gap: 15px;\n}\n\n\/* Kanan *\/\n.filter-right {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n\n    .post-filter label {\n     font-size: 0.95rem;\n     margin: 0;\n     color: #333;\n     white-space: nowrap;\n    }\n\n    \/* Dropdown *\/\n.post-filter select {\n  padding: 8px 12px;\n  border-radius: 6px;\n  border: 1px solid #ccc;\n  font-size: 0.95rem;\n  background: #fff;\n}\n.search-wrapper input {\n  padding: 8px 12px;\n  padding-right: 30px;\n  border-radius: 6px;\n  border: 1px solid #ccc;\n  font-size: 0.95rem;\n}\n\n\/* Search box *\/\n.search-wrapper {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n}\n    .search-wrapper input {\n     padding-right: 30px;\n    }\n    .search-wrapper .search-icon {\n  position: absolute;\n  right: 8px;\n  top: 50%;\n  transform: translateY(-50%);\n  color: #666;\n  font-size: 0.9rem;\n}\n    \n    \/* Grid layout *\/\n    .post-grid {\n      --gap: 20px;\n      display: grid;\n      gap: var(--gap);\n      grid-template-columns: repeat(1, 1fr);\n    }\n    @media (min-width: 600px) {\n      .post-grid { grid-template-columns: repeat(2, 1fr); }\n    }\n    @media (min-width: 960px) {\n      .post-grid { grid-template-columns: repeat(3, 1fr); }\n    }\n    \n    \/* Card style *\/\n    .post-card {\n      background: #fff;\n      border-radius: 12px;\n      overflow: hidden;\n      box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n      display: flex;\n      flex-direction: column;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n    .post-card:hover {\n      transform: translateY(-4px);\n      box-shadow: 0 6px 20px rgba(0,0,0,0.15);\n    }\n    .post-card img {\n      width: 100%;\n      aspect-ratio: 16\/9;\n      object-fit: cover;\n      display: block;\n    }\n    .post-card .card-body {\n      padding: 18px;\n      text-align: center;\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n    .post-card h3 {\n        margin: 0;\n        font-size: 1.2rem;\n        font-weight: 600;\n        color: #111;\n\n        display: -webkit-box;\n        -webkit-line-clamp: 2;   \/* maksimal 2 baris *\/\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n    .post-card .excerpt {\n      font-size: 0.95rem;\n      color: #444;\n      flex-grow: 1;\n    }\n    .post-card .readmore a {\n      display: inline-block;\n      padding: 10px 20px;\n      border: 1px solid #ccc;\n      border-radius: 6px;\n      text-decoration: none;\n      color: #111;\n      background: #fff;\n      font-size: 0.9rem;\n      transition: background 0.2s, color 0.2s;\n    }\n    .post-card .readmore a:first-child {\n      background: #fff;\n      color: #111;\n    }\n    .post-card .readmore a:first-child:hover {\n      background: #006bff;\n      color: #fff;\n      border-color: #006bff;\n    }\n    .post-card .readmore .btn-register {\n      background: #006bff;\n      color: #fff;\n      border-color: #006bff;\n    }\n\n    .post-card .readmore .btn-register.disabled {\n      background: #ccc;\n      color: #fff;\n      border-color: #ccc;\n      cursor: not-allowed;\n    }\n    \n    .loading, .error {\n      text-align: center;\n      padding: 20px;\n      color: #666;\n    }\n\/* Status buttons *\/\n.filter-status {\n  display: flex;\n  gap: 10px;\n}\n.filter-status button {\n  padding: 8px 18px;\n  border: 1px solid #ccc;\n  background: #fff;\n  border-radius: 6px;\n  cursor: pointer;\n  font-size: 0.95rem;\n  transition: all 0.2s;\n  color: #111;\n}\n.filter-status button:hover {\n  background: #006bff;\n  color: #fff;\n  border-color: #006bff;\n}\n.filter-status button.active {\n  background: #006bff;\n  color: #fff;\n  border-color: #006bff;\n}\n    <\/style><div class=\"post-grid-wrapper\"><!-- Grid --><div id=\"postGrid\"><div class=\"loading\">Loading posts...<\/div><\/div><\/div><script>(function(){\n          const gridContainer = document.getElementById(\"postGrid\");\n        \n          const baseUrl = \"\/wp-json\/wp\/v2\";\n          const postsPerPage = 6;\n        \n          \/\/ helper: strip HTML\n          function stripHtml(html){\n            const tmp = document.createElement(\"div\");\n            tmp.innerHTML = html;\n            return tmp.textContent || tmp.innerText || \"\";\n          }\n          function truncate(str, n){\n            return str.length > n ? str.slice(0, n).trim() + \"\u2026\" : str;\n          }\n        \n          \/\/ Fetch posts\n          async function loadPosts(catId = \"\", searchTerm = \"\") {\n            gridContainer.innerHTML = '<div class=\"loading\">Loading posts...<\/div>';\n        \n            let url = `${baseUrl}\/career?per_page=${postsPerPage}&_embed`;\n        \n            try {\n              const res = await fetch(url);\n              if (!res.ok) throw new Error(\"Gagal ambil data post\");\n              const posts = await res.json();\n              console.log(posts);\n                \n        \n              const grid = document.createElement(\"div\");\n              grid.className = \"post-grid\";\n        \n              posts.forEach(post => {\n                let thumb = \"\";\n                try {\n                  const fm = post._embedded[\"wp:featuredmedia\"][0];\n                  thumb = fm?.source_url || \"\";\n                } catch (e) {}\n        \n                const acf = post.acf || {};\n                \n\n                const readMoreHtml = `<a href=\"${post.link}\">Read More<\/a>`\n\n                \n        \n                const card = document.createElement(\"div\");\n                card.className = \"post-card\";\n                card.innerHTML = `\n                  ${thumb ? `<img decoding=\"async\" src=\"${thumb}\" alt=\"${post.title.rendered}\">` : \"\"}\n                  <div class=\"card-body\"><h3>${post.title.rendered}<\/h3><div class=\"readmore\">${readMoreHtml}\n                    <\/div><\/div>`;\n                grid.appendChild(card);\n              });\n        \n              gridContainer.innerHTML = \"\";\n              gridContainer.appendChild(grid);\n            } catch (err) {\n              gridContainer.innerHTML = `<div class=\"error\">Error: ${err.message}<\/div>`;\n            }\n          }\n        \n          \/\/ Init\n          loadPosts();\n        })();\n        <\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"featured_media":13220,"template":"","meta":{"_acf_changed":false,"content-type":"","om_disable_all_campaigns":false},"categories":[362,363],"class_list":["post-16031","career","type-career","status-publish","has-post-thumbnail","hentry","category-career","category-software-engineering"],"acf":{"description":"We are looking for a Senior Mobile Engineer to lead the development of high-quality mobile applications on Android and iOS platforms. You will play a key role in designing the architecture, building, and scaling our mobile products, as well as collaborating closely with Product Managers, Designers, and Backend Engineers. \n\nPeran ini ideal bagi individu yang memiliki passion terhadap arsitektur yang bersih (clean architecture), performa aplikasi, dan pengalaman pengguna (user experience) yang unggul.","job_type":"fulltime: Full time","link":"https:\/\/labamu.co.id\/apply-career\/?position=senior-mobile-engineer","location":"Indonesia - BSD City"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/career\/16031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/career"}],"about":[{"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/types\/career"}],"version-history":[{"count":3,"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/career\/16031\/revisions"}],"predecessor-version":[{"id":16035,"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/career\/16031\/revisions\/16035"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/media\/13220"}],"wp:attachment":[{"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/media?parent=16031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labamu.co.id\/en\/wp-json\/wp\/v2\/categories?post=16031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}