<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Startappz Blog]]></title><description><![CDATA[Tech, UX/UI, Announcement ]]></description><link>https://blog.startappz.com/</link><image><url>https://blog.startappz.com/favicon.png</url><title>Startappz Blog</title><link>https://blog.startappz.com/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Thu, 23 Apr 2026 11:02:34 GMT</lastBuildDate><atom:link href="https://blog.startappz.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Claude Code + Figma: A Designer-Developer Workflow That Actually Works!]]></title><description><![CDATA[<p>I didn&#x2019;t intend to write this post. But after using Claude Code alongside Figma on real projects and seeing how dramatically it reshaped the way my team works, I knew it was worth sharing.</p><p>This isn&#x2019;t a product review. It&#x2019;s a practical breakdown of</p>]]></description><link>https://blog.startappz.com/claude-code-figma-a-designer-developer-workflow-that-actually-works/</link><guid isPermaLink="false">69ca1ee76f62af5b595f3b7a</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 30 Mar 2026 07:06:08 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2026/03/blog-post-artwork-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2026/03/blog-post-artwork-1.png" alt="Claude Code + Figma: A Designer-Developer Workflow That Actually Works!"><p>I didn&#x2019;t intend to write this post. But after using Claude Code alongside Figma on real projects and seeing how dramatically it reshaped the way my team works, I knew it was worth sharing.</p><p>This isn&#x2019;t a product review. It&#x2019;s a practical breakdown of a workflow I rely on every day. Whether you&#x2019;re a designer, a developer, or somewhere in between, you&#x2019;ll find something valuable here.</p><h1 id="1-the-problem-worth-solving"><strong>1. The Problem Worth Solving</strong></h1><p>Think about the last project you delivered. How much of your time went into actual design thinking and how much was spent copying specs between tools, re-explaining decisions, or chasing the latest version of a file? For most teams, the second outweighs the first.</p><p>You&#x2019;re not designing. You&#x2019;re managing chaos.</p><p>The real cost is context switching. Every time you jump between tools, you lose momentum. Decisions get duplicated. Inconsistencies creep in. And the work that actually matters is the thinking &amp; the design that gets squeezed into whatever time is left.</p><p>This is the problem the workflow solves. Not by adding more tools, but by connecting the ones you already use into a single, cohesive system.</p><h1 id="2-getting-claude-code-running"><strong>2. Getting Claude Code Running</strong></h1><p>Claude Code lives in your terminal, the black window most designers avoid. But don&#x2019;t worry: you only need to set it up once. After that, it quietly does its job, and you can almost forget it exists.</p><p>My team runs Claude Code on a shared studio server, so every designer and developer connects to the same environment. You can also run it locally on your Mac.The setup is the same either way.</p><h2 id="install-it"><strong>Install it</strong></h2><p>Open your terminal on Mac, press Cmd + Space and type Terminal and run this:</p><p>npm install -g @anthropic-ai/claude-code</p><p>If you type claude afterward and see a &#x201C;command not found&#x201D; error, don&#x2019;t panic. This is very common. It just means your terminal doesn&#x2019;t yet know where the tool was installed.</p><h2 id="fix-the-path"><strong>Fix the PATH</strong></h2><p>Think of <strong>PATH</strong> as your terminal&#x2019;s address book. If an app isn&#x2019;t listed, the terminal can&#x2019;t find it. You fix this by editing a file called <strong>.zshrc</strong>.</p><p>What is <strong>.zshrc</strong>? It&#x2019;s a hidden configuration file your Mac reads every time you open a terminal, like a startup checklist. The name breaks down like this: <strong>zsh</strong> is the shell program running inside your terminal, and <strong>rc</strong> stands for &#x201C;Run Commands.&#x201D; In short, <strong>.zshrc</strong> is just a set of instructions that load automatically whenever your terminal starts.</p><p>Run this to open it: nano ~/.zshrc</p><p>Scroll to the bottom and add this line: </p><p>export PATH=&quot;$HOME/.npm-global/bin:$PATH&quot;</p><p>Press Ctrl + X, then Y to save. </p><p>Then run: source ~/.zshrc</p><p>Type Claude. You should see the Claude Code prompt. </p><p>That is it! You are in.</p><p><strong>Quick note: </strong><em>If you are on an older Mac using bash instead of zsh, edit ~/.bash_profile instead. Everything else works the same way.</em></p><h1 id="3-connecting-claude-code-to-figma"><strong>3. Connecting Claude Code to Figma</strong></h1><p>This is where the workflow changes completely.</p><p>On its own, Claude Code is powerful. But when you connect it to Figma through the official MCP server, it stops being just an AI you talk to. It becomes an AI that <strong>works inside your design file</strong>.</p><p>What does that mean in practice? Claude Code can read your Figma file, create components, set variable values, and organize layers all from the terminal without you ever touching Figma manually.</p><h2 id="how-to-connect-them"><strong>How to connect them?</strong></h2><p>Find or create this file on your Mac:</p><p>~/Library/Application Support/Claude/claude_desktop_config.json</p><p>Add the Figma MCP server entry under mcpServers. Anthropic&apos;s documentation has the exact snippet to paste. Save the file, restart Claude Desktop, and make sure your Figma file is open in the desktop app, not the browser.</p><p>When it works, Figma appears as an available tool inside your Claude Code session. From that moment, Claude is not advising you from the outside. It is working inside the same file you and your team are using.</p><p><strong>Important: </strong><em>Always authenticate through the Figma desktop app. Browser sessions can cause token errors that are frustrating to debug. Desktop app first, every time.</em></p><h1 id="4-building-a-design-language-system-with-claude-code"><strong>4. Building a Design Language System with Claude Code</strong></h1><p>Setting up a design system from scratch takes time. Defining every color shade, working out a type scale, building the spacing grid, documenting it all. It is important work, but it is also slow and easy to get inconsistent.</p><p>Claude Code can do this in minutes and write the results directly into your Figma variables panel.</p><p>Here is a real example. This is the prompt I used when building the DLS for Chat&apos;n Shop, an AI-powered Arabic grocery assistant app for the MENA market:</p><p>&quot;Create a design language system for Chat&apos;n Shop &#x2014; a native iOS grocery shopping app for the MENA market with an AI chat interface. Primary brand color is #FFBB00 (golden yellow). Secondary is #1C2B4A (deep navy). Accent is #E8403C (logo red). Use SF Pro Text as the typeface. Base spacing unit is 4px, scaling up to 32px. Border radius ranges from 4px to full pill shapes for chat bubbles and tags. Semantic colors: success #34C759, warning #FF9500, danger #FF3B30. The tone should feel warm, conversational and trustworthy. Write all tokens into the open Figma file.&quot;</p><p>&#xA0;What came back was a complete system:</p><ul><li>Color tokens: primary, secondary, accent, semantic states, neutral grays, and surface colors for chat bubbles</li><li>Typography scale: from 34px hero display down to 11px captions, with weights and line heights</li><li>Spacing tokens: a consistent 4px grid from 4px through to 32px</li><li>Border radius tokens: from subtle 4px corners to full pill shapes</li><li>Component specs: button, input, chat bubble, product card, and navigation bar</li></ul><p>&#xA0;All written directly into Figma. No manual copy-paste. No spreadsheet of values. One prompt, one coherent system.</p><p>And if something does not feel right? You ask Claude Code to read the file back and adjust. It is a conversation, not a one-shot output.</p><h1 id="5-how-does-claude-code-and-figma-complete-each-other"><strong>5. How does Claude Code and Figma Complete Each Other?</strong></h1><p>This is the part worth getting right: Claude Code and Figma aren&#x2019;t just compatible! They <strong>complement each other</strong>, filling the gaps the other leaves behind.</p><h2 id="claude-code-reads-figma"><strong>Claude Code reads Figma</strong></h2><p>Before generating anything, Claude Code can inspect your Figma file. Component names, existing styles, layer naming, frame structure. It is never working from assumptions. It is working from what is actually in your file.</p><h2 id="claude-code-writes-to-figma"><strong>Claude Code writes to Figma</strong></h2><p>Instead of writing a spec that a designer then manually interprets, Claude Code can create components directly in the file. Your role shifts from building the foundation to refining and art-directing, where your judgment matters most.</p><h2 id="figma-feeds-claude-code"><strong>Figma feeds Claude Code</strong></h2><p>This direction is the one most people miss. Once you have a designed screen in Figma, Claude Code can read it and write the frontend spec automatically, generate developer handoff notes, or catch inconsistencies before the build starts. The design file becomes an input, not just an output.</p><h2 id="the-dls-as-a-shared-language"><strong>The DLS as a shared language</strong></h2><p>Claude Code generates the tokens. They live in Figma as variables. Developers consume those same tokens in code. One source of truth is maintained intelligently, visible to everyone, consistent across the entire product.</p><p><strong>The mental model: </strong><em>Claude Code is the architect and the builder. Figma is the blueprint room. Figma Make is the construction crew. None of them does the full job alone. Together, they cover everything from brief to production.</em></p><h1 id="6-the-full-pipeline-from-brief-to-production"><strong>6. The Full Pipeline: From Brief to Production</strong></h1><p>Once the setup is in place, a real project flow looks like this:</p><ul><li>A brief arrives from a client</li><li>Claude Code generates the information architecture, user flows, and component specs</li><li>Claude Code writes the DLS tokens directly into the Figma file via MCP</li><li>You design the screens using those components and tokens as the foundation</li><li>Claude Code reads the Figma output, validates consistency, and flags anything off</li><li>Figma Make takes the clean, token-driven design and generates production-ready frontend code</li></ul><p>&#xA0;</p><p>The feedback loop between Claude Code and Figma is what makes this different from other AI workflows. You are not running two parallel processes. You are running one connected system where each step informs the next.</p><p>&#xA0;</p><h1 id="7-figma-make-what-it-can-do-and-my-honest-take"><strong>7. Figma Make: What It Can Do and My Honest Take</strong></h1><p>Figma Make takes your Figma design and generates frontend code: HTML and CSS, or React components, depending on your setup.</p><p>For clean, token-driven designs, it works well. Simple screens, standard components, consistent layouts. These come out in good shape.</p><p>My honest take: it is a strong first draft, not a finished commit. Complex interactive states, custom animations, and edge-case breakpoints still need a developer pass. Build that review step into your process from the start.</p><p>But here is the thing. The quality of what Figma Make produces depends entirely on the quality of the Figma file it reads. When Claude Code has set up the DLS properly, and the components are clean, the output improves significantly. The work you put in earlier pays off here.</p><p>If the blueprints are clear and the materials are well-specified, the building goes up cleanly. If not, no amount of skill downstream saves it.</p><p>&#xA0;</p><h1 id="8-what-works-and-what-to-watch-out-for"><strong>8. What Works and What to Watch Out For</strong></h1><h2 id="what-works"><strong>What works</strong></h2><ul><li><strong>Start with Claude Code before you open Figma. </strong>Think through the IA and component requirements first. The Figma work will be faster and much more focused.</li><li><strong>Keep your prompts specific. </strong>Vague prompts produce vague tokens. The more brand context you give, the more useful the output.</li><li><strong>Version your DLS tokens in git. </strong>Treat them like code. Track changes, review updates, and roll back when needed.</li><li><strong>Use a shared server for teams. </strong>Everyone in the same environment means consistent outputs and no local config headaches.</li><li><strong>Ask Claude Code to review before Figma Make. </strong>It can read the file and flag issues. Use that step, it saves pain later.</li></ul><h2 id="what-to-watch-out-for"><strong>What to watch out for</strong></h2><ul><li><strong>Do not skip the PATH setup. </strong>It trips up almost everyone the first time. Five minutes now saves frustration later.</li><li><strong>Authenticate through the desktop app. </strong>Browser tokens expire unpredictably. The desktop connection is stable.</li><li><strong>Share your brand guidelines before generating the DLS. </strong>Without them, Claude makes reasonable defaults. With them, it makes the right choices.</li><li><strong>Built-in iteration time. </strong>This workflow reduces the loops, it does not eliminate them. Plan for at least one round of refinement.</li></ul><h1 id="where-to-start"><strong>Where to Start?</strong></h1><p>Do not try to implement the whole pipeline on your first attempt. Start with one thing.</p><p>Install Claude Code, connect it to a Figma file, and ask it to generate a color palette for a project you are working on. Watch it write the variables directly into Figma.</p><p>That moment seeing Claude actually working inside your design file, is when it clicks. Everything else follows naturally from there.</p><p>The tools are ready. The workflow is proven. The only thing left is to open your terminal and try it.</p>]]></content:encoded></item><item><title><![CDATA[AI Chatbots for Ramadan: The Ultimate Customer Support & Sales Strategy]]></title><description><![CDATA[<p>Ramadan is one of the most powerful seasons for <strong>digital growth, e-commerce sales, and online customer engagement</strong> across the Middle East.</p><p>With increased night browsing, rising <strong>Eid shopping online</strong>, and higher social media activity after Iftar, businesses experience a major spike in traffic.</p><p>The real question is:</p><p>Is your customer</p>]]></description><link>https://blog.startappz.com/ai-chatbots-for-ramadan-the-ultimate-customer-support-sales-strategy/</link><guid isPermaLink="false">699c1dd06f62af5b595f3b69</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 23 Feb 2026 09:35:30 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2026/02/Ai-Ramadan2.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2026/02/Ai-Ramadan2.png" alt="AI Chatbots for Ramadan: The Ultimate Customer Support &amp; Sales Strategy"><p>Ramadan is one of the most powerful seasons for <strong>digital growth, e-commerce sales, and online customer engagement</strong> across the Middle East.</p><p>With increased night browsing, rising <strong>Eid shopping online</strong>, and higher social media activity after Iftar, businesses experience a major spike in traffic.</p><p>The real question is:</p><p>Is your customer support ready for the Ramadan surge?</p><p>This is where <strong>AI chatbots for business</strong> become a game-changer.</p><h2 id="ramadan-digital-trends-why-ai-matters-more-than-ever">Ramadan Digital Trends: Why AI Matters More Than Ever?</h2><p>During Ramadan:</p><ul><li>Online shopping increases significantly before Eid</li><li>Website traffic peaks after Iftar</li><li>Customers expect instant replies</li><li>Social media DMs multiply</li><li>WhatsApp inquiries surge</li></ul><p>If your response time is slow, customers move to competitors instantly.</p><p>AI-powered customer support automation ensures you never miss a lead, especially during high-conversion night hours.</p><h2 id="%F0%9F%9A%80-ai-chatbots-247-customer-support-during-ramadan">&#x1F680; AI Chatbots: 24/7 Customer Support During Ramadan</h2><p>An <strong>AI chatbot for business</strong> allows you to:</p><ul><li>Respond instantly to customer inquiries</li><li>Automate order tracking</li><li>Share Ramadan offers</li><li>Guide users through checkout</li><li>Collect qualified leads</li><li>Provide multilingual support</li></ul><p>With AI customer support automation, your business remains active even outside working hours &amp; maximizing sales during peak Ramadan traffic.</p><hr><h2 id="%F0%9F%9B%92-increase-sales-during-ramadan-with-smart-ai-personalization">&#x1F6D2; Increase Sales During Ramadan With Smart AI Personalization</h2><p>AI doesn&#x2019;t just respond. It learns.</p><p>Modern AI systems analyze:</p><ul><li>Customer behavior</li><li>Purchase history</li><li>Peak browsing times</li><li>Cart abandonment patterns</li></ul><p>This enables:</p><p>&#x2714; Personalized product recommendations</p><p>&#x2714; Targeted Ramadan promotions</p><p>&#x2714; Automated Eid campaign reminders</p><p>&#x2714; Smart upselling strategies</p><p>The result? Higher conversions and increased revenue during the most important shopping season of the year.</p><h2 id="whatsapp-chatbot-for-ramadan-campaigns">WhatsApp Chatbot for Ramadan Campaigns</h2><p>In the Middle East, <strong>WhatsApp Business automation</strong> plays a critical role in Ramadan marketing strategy.</p><p>A WhatsApp chatbot can:</p><ul><li>Handle bulk inquiries during offers</li><li>Send automated Eid promotions</li><li>Provide instant responses</li><li>Capture leads from social media ads</li></ul><p>This is especially powerful for retail, food delivery, fintech, and e-commerce platforms.</p><h2 id="ai-analytics-for-ramadan-marketing-optimization">AI Analytics for Ramadan Marketing Optimization</h2><p>Successful Ramadan campaigns are data-driven.</p><p>AI analytics tools help you:</p><ul><li>Identify peak engagement hours</li><li>Optimize ad timing</li><li>Improve customer retention</li><li>Predict demand before Eid</li><li>Reduce cart abandonment</li></ul><p>Instead of guessing, you make strategic decisions based on real-time insights.</p><p>This is a true <strong>Ramadan digital transformation</strong>.</p><h2 id="reduce-support-costs-increase-efficiency">Reduce Support Costs &amp; Increase Efficiency</h2><p>Fasting hours often mean reduced operational capacity. AI automation helps by:</p><ul><li>Handling repetitive questions</li><li>Filtering high-value leads</li><li>Escalating complex cases to human agents</li><li>Reducing customer service workload</li></ul><p>Your team focuses on growth, while AI manages routine tasks.</p><h1 id="why-businesses-using-ai-win-during-ramadan">Why Businesses Using AI Win During Ramadan?</h1><p>Companies that adopt AI for e-commerce and customer engagement during Ramadan benefit from:</p><p>&#x2714; Faster response times</p><p>&#x2714; Higher conversion rates</p><p>&#x2714; Improved customer satisfaction</p><p>&#x2714; Lower operational costs</p><p>&#x2714; Increased Eid sales</p><p>Ramadan is not just a holy month; it is a high-impact revenue opportunity.</p><p>Businesses that leverage AI tools and chatbot automation gain a competitive edge in a highly active digital market.</p><h1 id="upgrade-your-ramadan-strategy-with-startappz">Upgrade Your Ramadan Strategy With Startappz!</h1><p>At Startappz, we specialize in:</p><ul><li>AI chatbot development</li><li>WhatsApp Business automation</li><li>E-commerce AI integration</li><li>Customer support automation systems</li><li>Ramadan-ready digital platforms</li></ul><p>If you&apos;re looking to <strong>increase sales during Ramadan</strong> and optimize customer engagement, our AI-driven solutions are designed to scale your business efficiently.</p><p>&#x1F449; Book your free Ramadan AI consultation today and prepare your business for the Eid surge. Please contact us: info@startappz.com</p><p>#AIChatbot #RamadanMarketing #DigitalTransformation #CustomerEngagement #Ecommerce #BusinessAutomation #Startappz #Ramadan2026</p>]]></content:encoded></item><item><title><![CDATA[What is the real difference between UX/UI and product design today?]]></title><description><![CDATA[<p>Over the last decade, the design industry has changed dramatically. What used to be called &#x201C;UX/UI design&#x201D;, once centered around flows, screens, and usability, has evolved into a strategic discipline that shapes entire digital products.</p><p>Today, user experience is not only about guiding the user from point</p>]]></description><link>https://blog.startappz.com/what-is-the-real-difference-between-ux-ui-and-product-design-today/</link><guid isPermaLink="false">692ede116f62af5b595f3aef</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Wed, 03 Dec 2025 12:23:54 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/12/1104x736-linkedin--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/12/1104x736-linkedin--1-.png" alt="What is the real difference between UX/UI and product design today?"><p>Over the last decade, the design industry has changed dramatically. What used to be called &#x201C;UX/UI design&#x201D;, once centered around flows, screens, and usability, has evolved into a strategic discipline that shapes entire digital products.</p><p>Today, user experience is not only about guiding the user from point A to point X. It has become a core part of how products are built, how features are prioritized, and how businesses grow. This shift has resulted in new responsibilities, new expectations, and new terminologies like <strong>Agile UX</strong>, <strong>Lean UX</strong>, <strong>DesignOps</strong>, and <strong>Product Discovery</strong>.</p><p>And this raises an important question:</p><p><strong>What is the real difference between UX/UI and product design today?</strong></p><p>Let&#x2019;s break it down.</p><h2 id="1-uxui-used-to-be-about-improving-the-experience-now-it-drives-the-business"><strong>1. UX/UI Used to Be About Improving the Experience: Now It Drives the Business</strong></h2><p>Traditionally, UX/UI designers focused on:</p><ul><li>Making interfaces intuitive</li><li>Fixing friction points</li><li>Organizing information</li><li>Improving usability</li><li>Designing user-friendly flows</li></ul><p>These are still essential.</p><p>But modern businesses now see UX/UI as a <strong>strategic asset</strong>, not just a delivery function.</p><p>Today, UX/UI influences:</p><ul><li>Product Direction</li><li>Feature Prioritization</li><li>Conversion Rates</li><li>Retention</li><li>Customer lifetime value</li><li>Growth Metrics</li><li>Brand Perception</li></ul><p>Companies know that <strong>good UX is good business</strong>.</p><h2 id="2-agile-ux-changed-the-role-design-is-continuous-not-one-phase"><strong>2. Agile UX Changed the Role: Design is Continuous, Not One Phase</strong></h2><p>Agile UX emerged because the old waterfall approach to design failed to keep up with product realities.</p><p>Instead of delivering a full design package and &#x201C;throwing it over the wall,&#x201D; designers now work in <strong>continuous cycles</strong>:</p><ul><li>Define</li><li>Test</li><li>Build</li><li>Measure</li><li>Iterate</li></ul><p>This requires designers to deeply understand:</p><ul><li>Business goals</li><li>Product strategy</li><li>Market needs</li><li>Technical constraints</li><li>KPIs and metrics</li></ul><p>UX/UI is no longer about making a flow &#x201C;nice.&#x201D;</p><p>It&#x2019;s about making the product <strong>viable</strong>, <strong>valuable</strong>, and <strong>measurable</strong>.</p><h2 id="3-uxui-shapes-the-product-not-just-the-interface"><strong>3. UX/UI Shapes the Product &amp; Not Just the Interface!</strong></h2><p>Modern UX/UI responsibilities now include:</p><ul><li>Defining the core value proposition</li><li>Identifying the MVP and feature set</li><li>Writing hypotheses</li><li>Creating success metrics</li><li>Mapping user journeys across the entire ecosystem</li><li>Performing research that influences business decisions</li><li>Testing ideas before engineering invests</li><li>Creating early prototypes for validation</li><li>Refining the roadmap with product managers</li></ul><p>In other words:</p><p><strong>UX/UI is involved in building the product foundation &amp; not just the screens.</strong></p><p>This is why many UX leads today function like product managers.</p><h2 id="4-product-design-goes-even-further-ownership-strategy-and-outcomes"><strong>4. Product Design Goes Even Further: Ownership, Strategy, and Outcomes</strong></h2><p>So what makes product design different? </p><p>A <strong>product designer</strong>:</p><ul><li>Owns the product end-to-end</li><li>Balances business, tech, and user needs</li><li>Contributes to the roadmap</li><li>Uses data analytics to inform decisions</li><li>Participates in sprint planning</li><li>Aligns stakeholders and teams</li><li>Makes trade-offs between desirability, feasibility, and viability</li><li>Helps the business define &#x201C;What is next?&#x201D;</li><li>Ensures what we build <em>makes sense</em> for the company, not just for the user</li></ul><p>Where UX/UI is often focused on <em>experience</em>, product design is focused on <em>outcomes</em>.</p><h3 id="uxui-answers"><strong>UX/UI answers:</strong></h3><p><strong>&#x201C;Is this usable, intuitive, and meaningful?&#x201D;</strong></p><h3 id="product-design-answers"><strong>Product design answers:</strong></h3><p><strong>&#x201C;Is this the right thing to build, and will it help the business grow?&#x201D;</strong></p><h2 id="5-the-real-challenge-design-teams-are-expected-to-do-both"><strong>5. The Real Challenge: Design Teams Are Expected to Do Both</strong></h2><p>This evolution has created new pressures inside companies.</p><p>Designers today must:</p><ul><li>Think strategically</li><li>Move fast in agile environments</li><li>Constantly iterate and adapt</li><li>Justify decisions with data</li><li>Collaborate with product, tech, and business</li><li>Deliver scalable systems, not one-off screens</li><li>Understand user psychology &amp; market dynamics</li><li>Prepare product roadmaps and MVP definitions</li><li>Measure the impact of their work</li></ul><p>The challenge? </p><p>Not every company understands this transformation.</p><p>Designers are often hired for UI but expected to deliver product strategy.</p><p>They are expected to &#x201C;make it pretty&#x201D; while also defining KPIs, features, and product direction.</p><p>This mismatch is one of the biggest industry challenges today.</p><p><strong>Conclusion: UX/UI and Product Design Are Converging,  Yet Not the Same</strong></p><p>UX/UI has evolved from a visual discipline to a strategic driver of business success.And product design emerged as the natural next step, combining UX thinking with business ownership, product strategy, and measurable outcomes.</p><h3 id="in-simple-terms"><strong>In simple terms:</strong></h3><ul><li><strong>UX/UI</strong> = designing the experience</li><li><strong>Product design</strong> = designing the product, the value, and the business impact</li></ul><p>Both are essential.</p><p>But as products grow more complex and user expectations rise, the industry is becoming more aligned around one core truth:</p><p><strong>Design is not just about screens, it&#x2019;s about building the right product.</strong></p>]]></content:encoded></item><item><title><![CDATA[11 Years of Startappz]]></title><description><![CDATA[<p><em>August 19, 2025</em></p><p>Today marks Startappz&apos;s 11th birthday. While each individual year doesn&apos;t carry the same weight as the big milestones behind us, the fact that we&apos;re still here, still building, still bringing ideas to life digitally all these years later means a great</p>]]></description><link>https://blog.startappz.com/11-years-of-startappz/</link><guid isPermaLink="false">68a465ef6f62af5b595f3acd</guid><category><![CDATA[anniversary]]></category><category><![CDATA[Startappz]]></category><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Tue, 19 Aug 2025 15:19:07 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/08/11-years---Startappz.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/08/11-years---Startappz.jpg" alt="11 Years of Startappz"><p><em>August 19, 2025</em></p><p>Today marks Startappz&apos;s 11th birthday. While each individual year doesn&apos;t carry the same weight as the big milestones behind us, the fact that we&apos;re still here, still building, still bringing ideas to life digitally all these years later means a great deal to me.</p><p>In recent years, there&apos;s been endless chatter about the &quot;death of agencies&quot; and how AI will replace developers, how no-code platforms will make custom development obsolete. I often smile when I hear these predictions &#x2014; I&apos;ve seen the app development industry declared revolutionized or disrupted countless times over the course of our journey, and this is simply the latest chapter.</p><p>What many people fail to recognize is that this industry thrives when solutions are built by people who truly care &#x2014; people who are passionate about solving real problems and started developing not just for profit, but because they genuinely love creating digital experiences that matter. The kinds of projects we work on &#x2014; custom apps for businesses with unique challenges, telecom solutions that connect millions of users, digital transformations that actually transform &#x2014; continue to succeed long after the flashy, cookie-cutter platforms fade away.</p><p>Why? Because we have clients who trust us, grow with us, and evolve with us.</p><p>When we started on August 19, 2014, the app landscape looked completely different. The App Store was still relatively young, Android was finding its footing, and most businesses were just beginning to understand they needed a mobile presence. We&apos;ve watched entire platforms rise and fall, seen design trends come and go, and witnessed technology evolve at breakneck speed.</p><p>But through it all, one thing has remained constant: businesses need partners who understand their vision and can bring it to life with precision, innovation, and care.</p><p>Our clients trust us &#x2014; they trust us with their digital futures, their user experiences, and their business transformations. From Virgin Mobile&apos;s groundbreaking self-care platforms to Q-Commerce, from facial recognition eSIM activation for tourists to comprehensive IoT solutions &#x2014; each project has been a testament to what&apos;s possible when you combine cutting-edge technology with genuine understanding of business needs.</p><p>That&apos;s the true joy of what we do, and it&apos;s why our team keeps showing up every day &#x2014; more than 4,000 days later.</p><p>Looking back at these 11 years, we&apos;ve built solutions across multiple countries, worked with industry giants, pioneered first-of-their-kind innovations, and most importantly, helped countless businesses connect with their customers in meaningful ways. We&apos;ve survived market crashes, platform changes, global pandemics, and industry disruptions. Each challenge made us stronger, more adaptable, more focused on what truly matters: delivering solutions that work.</p><p>Thank you for continuing to trust us with your digital transformations. Looking ahead, I know there will be new challenges to reach Startappz 15 or even Startappz 20 &#x2014; new technologies to master, new platforms to conquer, new problems to solve. But looking back at the past decade, we&apos;ve faced plenty of challenges before and overcome them &#x2014; and I&apos;m confident we&apos;ll do it again.</p><p>The future of digital experiences isn&apos;t about replacing human creativity and expertise with automation &#x2014; it&apos;s about augmenting it, enhancing it, and using it to build solutions that truly matter.</p><p>Of course, none of this would be possible without our incredible team, who continue to show up project after project to craft the solutions our clients love. Thank you to every developer, designer, project manager, and strategist who has been part of this journey.</p><p>And thank you to our clients, past and present, for believing in us and allowing us to bring your ideas to life, digitally.</p><p>From all of us at Startappz, this is a birthday celebration &#x2665;&#xFE0F;</p><hr><p><em>Ready to bring your next idea to life? Let&apos;s build something amazing together.</em></p><p></p><p>Moski - CEO/CTO</p>]]></content:encoded></item><item><title><![CDATA[We're Hiring! Android Developer]]></title><description><![CDATA[<p><br>&#x1F6A8; We&#x2019;re Hiring: Android Developer &#x1F6A8;</p><p>&#x1F4CD; Location: Dubai &#x2013; Remote</p><p> &#x1F552; Type: Full-time &#xB7; Mid-to-Senior Level</p><p>About the Role:</p><p>Are you passionate about building high-performance Android apps that impact millions of users? We&#x2019;re looking for a&#xA0;Senior Android Developer&#xA0;to join our mobile</p>]]></description><link>https://blog.startappz.com/were-hiring-android-developer/</link><guid isPermaLink="false">6874b6b86f62af5b595f3abc</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 14 Jul 2025 07:52:26 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/07/shutterstock_2449856561--1-.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/07/shutterstock_2449856561--1-.jpg" alt="We&apos;re Hiring! Android Developer"><p><br>&#x1F6A8; We&#x2019;re Hiring: Android Developer &#x1F6A8;</p><p>&#x1F4CD; Location: Dubai &#x2013; Remote</p><p> &#x1F552; Type: Full-time &#xB7; Mid-to-Senior Level</p><p>About the Role:</p><p>Are you passionate about building high-performance Android apps that impact millions of users? We&#x2019;re looking for a&#xA0;Senior Android Developer&#xA0;to join our mobile team and help shape the future of our flagship apps.</p><p>This is a high-impact role where you&#x2019;ll work on complex challenges and you&#x2019;ll play a leading role in architecture decisions, mentor developers, and collaborate cross-functionally to deliver elegant mobile experiences at scale.</p><p>What You&#x2019;ll Do:</p><p>&#xA0;&#x1F680; Lead the development of major Android features and architectural  enhancements</p><p>&#x1F9E0; Design clean, scalable, and testable Kotlin code using MVVM, MVI, and Jetpack libraries</p><p>&#x1F50D; Collaborate with product, design, QA, and backend teams to plan and execute new features</p><p>&#x1F6E0;&#xFE0F; Review code, enforce best practices, and provide mentorship to Android teammates</p><p>&#x1F4C8; Monitor app performance and stability using Firebase, Crashlytics, and analytics tools</p><p>&#x1F510; Champion mobile security, especially for customer identity, billing, and telco data</p><p>&#x2699;&#xFE0F; Contribute to CI/CD processes and improve release automation</p><p>What We&#x2019;re Looking For:</p><p>&#x2705; 5+ years of professional Android development (Kotlin-focused)</p><p>&#x2705; Strong experience with Android Jetpack, Coroutines, and app architecture (MVVM, MVI)</p><p>&#x2705; Proven ability to work on large, modular codebases and complex app ecosystems</p><p>&#x2705; Strong grasp of mobile app performance, security, and REST API integration</p><p>&#x2705; Experience with Agile/Scrum workflows and collaborative product teams</p><p>&#x2705; Solid debugging, testing, and problem-solving skills.</p><p>&#x2705; Strong understanding of mobile UI/UX best practices and responsive design.</p><p>&#x1F31F;Bonus Points: </p><p>&#x2728;Experience with telco systems</p><p>&#xA0;&#x2728;Jetpack Compose, GraphQL, or modular Android app architecture</p><p>&#xA0;&#x2728;Working knowledge of Flutter or cross-platform tools (optional)</p><p>&#xA0;&#x2728;Experience deploying and managing apps with 1M+ active users</p><p>&#xA0;&#x2728;Experience with A/B testing, deep links, and analytics</p><p></p><p>&#x1F680;Why Join Us?</p><p>&#xA0;&#x1F4A1; Work on an app that directly serves&#xA0;millions of users</p><p>&#xA0;&#x1F3E0; Hybrid or remote&#xA0;work flexibility</p><p>&#xA0;&#x1F4DA; Access to training, certifications, and career growth opportunities</p><p>&#xA0;&#x1F4AC; Collaborative, diverse, and fast-paced engineering culture</p><p></p><p>&#x1F4E9; Interested? Send your CV to: hiring@startappz.com</p><p>Or tag someone who might be a great fit!</p><p>We can&#x2019;t wait to meet you!</p><p><strong>#JoinUs</strong> <strong>#AndroidDeveloper</strong> <strong>#SeniorAndroidDeveloper</strong> <strong>#TechJobs</strong> <strong>#RemoteCareers</strong> <strong>#Startappz</strong> <strong>#WeAreHiring</strong></p>]]></content:encoded></item><item><title><![CDATA[We're Hiring! Business Development Manager in KSA]]></title><description><![CDATA[<p></p><p><strong>Job Title</strong>: Business Development Manager (Saudi Arabia)</p><p><strong>Location</strong>: Riyadh, Saudi Arabia</p><p><strong>Type</strong>: Full-time, Basic Salary &amp; Commission-Based</p><p><strong>About Us</strong>:</p><p>We are a leading service provider specializing in Telco solutions, delivering innovative, secure, and efficient systems tailored to the needs of telecom operators, banks, and enterprises. Our mission is to empower</p>]]></description><link>https://blog.startappz.com/were-hiring-business-development-manager-in-ksa/</link><guid isPermaLink="false">67b590fe6f62af5b595f3aaa</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Wed, 19 Feb 2025 08:40:38 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/02/shutterstock_2449856561.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/02/shutterstock_2449856561.jpg" alt="We&apos;re Hiring! Business Development Manager in KSA"><p></p><p><strong>Job Title</strong>: Business Development Manager (Saudi Arabia)</p><p><strong>Location</strong>: Riyadh, Saudi Arabia</p><p><strong>Type</strong>: Full-time, Basic Salary &amp; Commission-Based</p><p><strong>About Us</strong>:</p><p>We are a leading service provider specializing in Telco solutions, delivering innovative, secure, and efficient systems tailored to the needs of telecom operators, banks, and enterprises. Our mission is to empower our clients with cutting-edge technology and exceptional service.</p><p>We are seeking a dynamic <strong>Business Development Manager</strong> to join our team and drive growth by expanding our presence in Saudi Arabia. This role will focus on identifying new opportunities, building strategic partnerships, and achieving sales targets in alignment with our expertise in Telco services.</p><p></p><p><strong>Key Responsibilities:</strong></p><p>	1.	<strong>Strategic Development &amp; Planning</strong>:</p><p>	&#x2022;	Develop and execute a clear vision and strategy to position our Telco  services as market leaders.</p><p>	&#x2022;	Create monthly, quarterly, and yearly plans and targets in alignment with company goals, presenting them to the executive team.</p><p>	2.	<strong>Lead Generation &amp; Sales</strong>:</p><p>	&#x2022;	Leverage industry knowledge to identify potential opportunities in the Telco, banking, and enterprise sectors.</p><p>	&#x2022;	Initiate, nurture, and follow up on leads to ensure consistent pipeline development.</p><p>	&#x2022;	Collaborate with cross-functional teams to create tailored proposals and presentations to secure high-value deals.</p><p>	&#x2022;	Achieve and exceed sales targets through a commission-based structure.</p><p>	3.	<strong>Market &amp; Client Insights</strong>:</p><p>	&#x2022;	Analyze and understand customer pain points, market trends, and competitor offerings to shape business strategy.</p><p>	&#x2022;	Gather feedback from potential and existing clients, relaying insights to management for product and service improvement.</p><p>	4.	<strong>Pricing &amp; Cost Analysis</strong>:</p><p>	&#x2022;	Understand the company&#x2019;s cost structure and pricing mechanisms to create competitive yet profitable proposals.</p><p>	5.	<strong>Client Engagement</strong>:</p><p>	&#x2022;	Develop and maintain strong relationships with key stakeholders, decision-makers, and clients to drive repeat business.</p><p>	&#x2022;	Represent the company at industry events, conferences, and client meetings across Saudi Arabia and the GCC.</p><p>	6.	<strong>Long-Term Growth</strong>:</p><p>	&#x2022;	Collaborate with the management team to shape the company&#x2019;s mid-to-long-term growth strategy.</p><p>	&#x2022;	Work with the internal team to develop &#x201C;hit lists&#x201D; and targeted sales strategies, utilizing a variety of sales kits and marketing tools.</p><p><strong>Key Qualifications:</strong></p><p>	&#x2022;	<strong>Proven Track Record</strong>: Demonstrated experience in business development, sales, or account management within the Telco, banking, or technology sectors.</p><p>	&#x2022;	<strong>Industry Knowledge</strong>: Deep understanding of Telco solutions, digital transformation, and enterprise technologies.</p><p>	&#x2022;	<strong>Networking Ability</strong>: Established network of contacts in Saudi Arabia&#x2019;s telecom, banking, or enterprise sectors is highly preferred.</p><p>	&#x2022;	<strong>Sales-Driven</strong>: Results-oriented mindset with a focus on meeting and exceeding sales targets.</p><p>	&#x2022;	<strong>Communication Skills</strong>: Exceptional verbal and written communication skills in both English and Arabic.</p><p>	&#x2022;	<strong>Flexibility</strong>: Willingness to travel frequently within Saudi Arabia and the GCC.</p><p>	&#x2022;	<strong>Cultural Understanding</strong>: Knowledge of the Saudi business environment and culture is essential.</p><p><strong>Compensation:</strong></p><p>	&#x2022;	This position is commission-driven with uncapped earning potential, offering significant rewards for high performance.</p><p>	&#x2022;	Additional incentives for achieving long-term growth targets or securing high-value contracts.</p><p><strong>Why Join Us?</strong></p><p>	&#x2022;	<strong>Innovative Solutions</strong>: Be part of a company that drives cutting-edge Telco innovation.</p><p>	&#x2022;	<strong>High Growth Potential</strong>: Unlock significant earnings through a performance-driven structure.</p><p>	&#x2022;	<strong>Regional Impact</strong>: Play a pivotal role in shaping the Telco landscape in Saudi Arabia and beyond.</p><p>Does this job description align with your expectations? Let me know if there are any specific points or aspects you&#x2019;d like to add or modify!</p><p>Join us and be part of an innovative team shaping the future!</p><p>If interested please send your resume to&#xA0;<a href="mailto:hiring@startappz.com" rel="noopener noreferrer">hiring@startappz.com</a>&#xA0;!</p>]]></content:encoded></item><item><title><![CDATA[Up and running with Prismic]]></title><description><![CDATA[Looking for a powerful yet flexible headless CMS? In our latest blog, we dive into Prismic, how to set it up with Next.js, and leverage Slice Machine for dynamic, reusable content components. 🌐

From creating pages to managing multilingual content, we cover it all with a step-by-step guide! ]]></description><link>https://blog.startappz.com/prismic/</link><guid isPermaLink="false">67a19eb26f62af5b595f38a7</guid><dc:creator><![CDATA[Divyanshu Dhruw]]></dc:creator><pubDate>Wed, 05 Feb 2025 06:30:05 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/12/blog1.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/12/blog1.png" alt="Up and running with Prismic"><p><a href="https://prismic.io/?ref=blog.startappz.com" rel="noreferrer">Prismic</a> is a cloud-based <a href="https://en.wikipedia.org/wiki/Headless_content_management_system?ref=blog.startappz.com" rel="noreferrer">headless Content Management System (CMS)</a> that allows businesses to efficiently manage their online content. It is designed to be user-friendly, making it accessible to both developers and content creators.</p><p><strong>Slice Machine:</strong>  Prismic uses a unique tool that allows you to create reusable components, called <strong>slices</strong>, for your website. This makes it faster to build and update pages with minimal coding. Similar to a storybook, a slice can be developed and previewed in isolation with mock data before being used as a building block in pages.</p><p>In this tutorial, we will make a simple Flower catalogue in two languages. The basic features of this site:</p><ul><li>Header</li><li>Footer</li><li>Menu</li><li><a href="https://nextjs.org/?ref=blog.startappz.com" rel="noreferrer">NextJS</a></li><li><a href="https://tailwindcss.com/?ref=blog.startappz.com" rel="noreferrer">Tailwind CSS</a></li></ul><p>Pages:</p><ul><li>Homepage with hero</li><li>Flower Details page</li><li>About Page</li></ul><p>Slices:</p><ul><li>Homepage Hero</li><li>Flower Card</li><li>Flower Details</li><li>Flower Post</li></ul><p>By the end of this tutorial, you&apos;ll see how powerful and easy it is to develop and maintain a website built with Prismic.</p><p></p><h1 id="understanding-the-different-entities-involved">Understanding the different entities involved</h1><p></p><p>The learning curve of Prismic development is pretty steep. It&#x2019;s important to understand the different components involved in the development process otherwise nothing will make sense.</p><ol><li>Github Account</li><li>Prismic Dashboard</li><li>Prismic Repository</li><li>Prismic CMS Dashboard</li><li>Local Development Environment<ol><li>Frontend&#xA0;</li><li>Slice Machine&#xA0;</li><li>Slice Machine Simulator</li></ol></li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfx-XwYLzp6H1yCWFX7-4pwSwsgIuzIBRReGVzZBvpkaAJSKzaGkisbXaAAm6mX2Hl4i-6AtqL0-T2ityiURvVNeVG-oTj8YhAJ8o8FVwT5yYierPjzkddsQElW8JiV1BOejy_nVw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1119"></figure><p></p><ol><li>Github Account</li></ol><p>Why?</p><ul><li>All the following components are connected to each other via github login only.</li><li>The Frontend code (in our case NextJS) will be stored in Github.</li></ul><p></p><ol start="2"><li>Prismic Dashboard</li></ol><p>This is the dashboard provided by Prismic for managing <strong>Prismic Repository</strong> and <strong>Prismic CMS:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf65Fc61W-owswzX33WqPP-lFrwD4OO65R2mtlCISpaXOOvnNDoMxlZOtWQETBF2Z4w9nR-6bxInYoZGJFPA_xwG9SZvr1s0FaeEfRvZ0pSTJuG3KETgCxYY3EroQBLwBZDpVjDQQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="708"></figure><p></p><ol start="3"><li>Prismic Repository</li></ol><p>Prismic Repository will be created inside the Prismic Dashboard. Prismic repository will contain all the slices and pages which we will develop in our Slice Machine. The only thing we need to do here is create a repository, delete a repository and push changes.</p><p></p><ol start="4"><li>Prismic CMS Dashboard</li></ol><p>By clicking on the name of the Prismic Repository in Prismic Dashboard, the user will land in Prismic CMS. From this CMS dashboard the user can create pages, use the slices created in the slice machine, put up content and publish them.</p><p></p><ol start="5"><li>Local Development Environment<ol><li>Frontend Code : The place where the entire frontend code will reside, in our case NextJS. Here we will style individual slices.</li><li>Slice Machine: Using slice machine, we will create slices, model and page structure (Data Structure). We will create slices here and push to the Prismic repository via GUI itself.</li><li>Slice Machine Simulator: The slices we will create, we can preview them here with mock data. The Simulator will also reflect the UI changes we will do in the local frontend code.<br></li></ol></li></ol><h1 id="initialize-the-project">Initialize the Project</h1><p></p><p>This step will set up the basic Next.js project, integrate Slice Machine (a tool provided by Prismic) into the Next.js project, and connect the project to the remote Prismic repository using your Git account.</p><h1 id="at-the-prismic-end">At the Prismic End</h1><p></p><p>1. Create an account in github.com</p><p>2. Create account in<a href="http://prismic.io/?ref=blog.startappz.com"> <u>prismic.io</u></a> with GitHub</p><p>3. Login into GitHub via cli</p><p>4. In Prismic Dashboard, create a new repository with your preferred Framework - Next / Nuxt or Sveltekit</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXem5j0FK3_ybv4BzMBDxPbFRcKFUzZy1NUCBWCG5J_qdDkv3VYJpzRmeVq2_9S4TjaJQGuOowUVUgc42bTS_hC6rEYf9SU9Xu5hXg0TVh25G83ZdL679OcFkO1yUDIyw8YnXpwZpQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="328"></figure><p></p><p>5. Select Next.js , Prismic will give you three options: Minimal Starter, Full Website Demo, Connect your own Web App&#x2028;. Choose Connect your own Web App.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdc8U7kkO_ZNp0BPMDFqOfE_nqpsHRYRlY3p56iet9oQEXBTsuiV9RRLtk8Sb17hQeGCnaSYvg8LskyR7Ghu9h-GDMbjmoB1-H-W-b6ZjzjKYWrk0ZpeA6wBtNjYqtFFrprBd1yfg?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="727"></figure><p></p><p>6. Fill up the details of your new Repository and select the pricing plan.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdQNtBiujE3xeCPPm9WazdGOd2g1S34IfhHRFGWsyXEef3wQMWwS19kBGTS1dmwhvMnZqfm7IJOnh2P5ZRhoCr1y8bPJma2kTYdYCV6eyfUShQLDCcJG6vMnvbQ5BO_FKr2GB9GWQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="934"></figure><p></p><p>7. Clicking on Create Repository will create a Prismic repository for you, and then redirect to the Prismic CMS Dashboard connected to this repository. You will get a new URL to manage this dashboard.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcO8t7gBiDMIoSm9VAZTuRypMl8Fx_AL9damc1XIT96zMrpmzwsqWo-Z5iqgqi0touXvXsE5Ioz81TFovioBsGA_PRxZGbFiErsoXSd6a7pf76Xbb49RFlbng8iM403QfrbNW0Jig?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><p>8. Click on Get started, it will ask for Language preference:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfnbToEZVd_sWH-mkWkrVVpkr4KOOismTc4JbPbEo2m39MrCuI2wrNcpkA6p3Nhr8P0eHQcw-vCMziF5XVnbA9OdHn9rblASs-ror78mVmwpKiett16xXA_UlK21BwQmVDeTeWP?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><p>9. Since this is a newly built dashboard without any Slices, Pages and Custom Types, it will look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcnjw_uQtcWP_J4DA5KMgFUqFpwa-ddD6g3tTgimNI2kBe1rA6QtxMX4qQu-Vo_efzCPBDhg9JS69IJnkR2-NRcBQc83y-07p3eq9aQFjJxQMDBqbtxkbmxmnyapNc8IohfloBS?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><h1 id="in-local-machine">In Local Machine</h1><p></p><p>Go to your development folder and execute the following command. This will create a NextJS project of latest version (While writing the latest NextJS version is 15)</p><pre><code>npx create-next-app@latest prismic-flower-catalogue
</code></pre>
<p>It will prompt you with a series of questions. We&#x2019;ll go with the default options, as the best practices are already preselected.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXepCnXc5OcOda_pPWAxL-ZSD-o1-SHFZ7tUq4QdPXXB1iyAUL_gsMCO2Ti7p70oaDpILe0umJT0b1yQaAXl5_4R3JX244wbedcpTZeR9aALMk971T2ELhtB2HjDcwExwWkXUdrq?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="403"></figure><p></p><p>Open prismic-flower-catalogue in your favorite code editor (We will use <a href="https://code.visualstudio.com/?ref=blog.startappz.com" rel="noreferrer">VSCode</a>).</p><p>Our next task is to connect this stock NextJS project to the Prismic Repository we created in previous section. Execute following command to install slice machine and configure it:</p><pre><code>npx @slicemachine/init@latest
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc8qdCaHyCwh5CkiwXC4Lv0J6rVcFHvDWjm-aU8-lpOZQBUESDX47jh0K57HLvL9fnUd7nhanIZM-dA2ZOidLOXICxiMZDSkm6PRQNUo9vDQ_fhNJIavRMdNpiiLp35G-H3EwqiVg?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="581"></figure><p>You can select an existing repository or create a new one from here also.</p><p>Post selection of repository, it will initialize everything to connect to the selected Prismic repository.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXckaBH7Af0tXIyL1zCT_QwOjLupmaZUf5DOfRkpFyCPDaLFFUHub3kaKC1o07FDWtS-O9wXE9NlIEC9vEsv8KCORx1NgrD8CR7emRw8Obu2T6PAShHMTOP5lJQfjVtbnwvnJ-nO2w?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1404" height="846"></figure><p></p><p>The command will automatically run the slice machine. If it does not start automatically, you can start it by command <code>npm run slice machine</code> &#x2028;The slice machine will start running in<a href="http://localhost:9999/?ref=blog.startappz.com"> <u>http://localhost:9999/</u></a>&#x2028;It looks like this:&#x2028;&#x2028;</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdCFe4ZARsi4LUMXlrBd9kM1WVHRt-pnQp_RmxonKxIriPS-b6cC_Y8_S1wEz3S-hXluW8B1C0Kf6e4OpZ8uJHjDSu9-Bqj-3hOejaHAlDuTFpnweh2kckyJz0tFHrX5aFK2eZI?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1291"></figure><p>By executing all the steps above, <code>package.json</code> and <code>package.lock.json</code> will get modified, and following new files and folders will be created:</p><ol><li><code>prismicio-types.d.ts</code> : Do not edit this file. It contains types of core slice machine code.</li><li><code>slicemachine.config.json</code> : This file contains the repository and simulator URL.</li><li> <code>src/app/api/</code> This is standard NextJS folder, but all the APIs files related to slice machine simulator will be added here. Do not change any of the autogenerated files here.</li><li><code>src/app/slice-simulator</code> : <code>/src/app</code> is standard NextJS folder, in this slicemachine-simulator will contain all the code for running slice machine. Do not make any changes in these files.</li><li><code>src/prismicio.ts</code> : This file has a lot of code to run the Prismic system. The only thing we need to care of in this file is Prismic Routes. As we add new pages to our project, this file will need to be updated accordingly.</li><li><code>src/slices/</code> : All the slices we create in future will be stored here.</li></ol><p>In this section, we have created a basic Next.js project with Slice Machine connected to our Prismic repository. In the next section, we will create slices, which are the building blocks of the Prismic ecosystem.</p><p></p><h1 id="slice-creation">Slice Creation</h1><p><br></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfFTcvC0hAjr6HzMVHTwm3wmrZ9RqMyTc_OVZuMvp9DD47-KEPV9m1O-kEtszqok_kqf1O3C55kmXc8Lb7HJQ3hh7oczSPVnKSgsbhTPzV4V7Gp-dOwcTiO4xaM4XgtdNNYoQz4jA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1552" height="1032"></figure><p></p><ul><li>Page Type (Single or Reusable) results in a rendered website page</li><li>A page can be created using Slices and Custom types</li><li>The end user is free to use any slice which the developer has created, everything will be automatically rendered by Slice Machine</li></ul><p>For our project, we will create following slices:</p><ul><li>Homepage Hero Slice</li><li>Flower Card</li><li>Flower Details</li><li>Flower Post</li></ul><p>We will go in detailed steps for the first slice only. Rest all the slices can be created by following same steps. We will provide the schema screenshots for guidance.</p><h1 id="create-slices">Create Slices</h1><p></p><p>Visit the slice machine interface<a href="http://localhost:9999/slices?ref=blog.startappz.com"> <u>http://localhost:9999/slices</u></a> and Click on <strong>&#x2018;Create One&#x2019;</strong></p><p><strong>Note:</strong> Both Node dev environment and slicemahcine need to be running in the local machine.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfkNoKNVx_g9ii-b0ar6ZYWcmB8yy5wrF2bKol6Ilu-My5AY3Cqhn_E0X08ICkdor0NuQ57UIYTsmSuA6068BGKkIQoxnm20S3cCrlvP_euAqeQpaLr_1S_9amxdExEo1be3ulwdg?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>We will create a slice for the <strong>Hero Section</strong>, which will include a title, tagline, and an image. Click on <strong>Add a field</strong> to see all the elements that can be added to this slice according to the requirements. For this slice, we need to add a Text, Rich Text, and Image field. After adding these three fields, it should look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdoTJ6Iz5_NpkGEIG7RptF8T1kZKQFX5i0xhSWgwi431fMGy-Rtrq5jVFRUDBVXp0SarZXqDk_PPqs9WtbIkmABVUnx7uBpbPVgCwBFx8bpx4JGc1bzBPzOX_38Q6nuYtJv7Sghlw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>Clicking the &quot;Simulate&quot; button at the top right will open the Slice Machine simulator. This allows you to preview how the slice looks in isolation. You can use the simulator to develop the UI of individual slices. This action will also automatically generate the following files in the Next.js project:</p><ol><li><code>src/slices/HomepageHero/index.tsx</code> : This is the main HTML &amp; CSS part of this slice. <strong>All the styling and UI change we need to do for this slice, we need to do it in this</strong></li><li><code>src/slices/HomepageHero/mocks.json</code> : This will contain mock data to help Slice Simulator</li><li><code>src/slices/HomepageHero/model.json</code> : This is the data structure of this slice. Do not touch this file. This file will keep changing as we add or change fields in slices.</li></ol><p>And it will modify following files:</p><ol><li><code>prismicio-types.d.ts</code> : Automatic addition of types of new Slice</li><li><code>src/slices/index.ts</code> : Newly created slice will be registered in this file</li></ol><p></p><h2 id="push-changes-of-slice-machine-to-prismic-repository">Push changes of Slice Machine to Prismic Repository</h2><p></p><p>All the push to the Prismic repository will be done via Slice Machine GUI interface only. No command line push. You can click on Review Changes , then click on Push button to push all the changes to Prismic Repository. Unless all the changes are not pushed in the Prismic Repo, they will not be available in the Prismic CMS Dashboard for content management.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXepCwLXMWDZ32OX8EGFZzKLAdvRQ7iDCPDwZVH0tT9FarejXpRtNsXtElizSHTPL6iC28CsWIVamzfTWfcwCDrC3jnDCYniYWEJox3MrbxHX0ZGzW5dir8lglfbdXfa3rCha2bMjA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><h2 id="styling-the-slice-and-adding-using-data">Styling the slice and adding using data</h2><p></p><p>We need to make changes in <code><strong>src/slices/HeroSection/index.tsx</strong></code> autogenerated file for adding styling. Before that, just a one time task to add the <code>src/slices</code> folder in <code>tailwind.config.ts</code> so that we can use tailwind styling in all our slices.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdKLM11GB_aTPUuzRnwTM9sMU7HyV9nYJfGqhoC0xPr84u1NeN3P-tApmR58ETtbwqIZorL7Iy0G0EZgb4wvkS2g-d612FlwkjrMK6jzmnj_76D9_XXbe3JTrxJV9elO54ir8Mjuw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="960" height="376"></figure><p><br>Default JSX of <code>src/slices/HomepageHero/index.tsx</code> file:</p><pre><code>const HomepageHero: FC&lt;HomepageHeroProps&gt; = ({ slice }) =&gt; {
 return (
   &lt;section
     data-slice-type={slice.slice_type}
     data-slice-variation={slice.variation}
   &gt;
     Placeholder component for homepage_hero (variation: {slice.variation})
     Slices
   &lt;/section&gt;
 );
};
</code></pre><p>In order to use the Data fields, Prismic provide code snippets. Go to slice machine, click on the slice, then toggle the code Show code Snippets</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdVAcBWSuMZ3T3X8omrOPCFJ0jvHTLQw_OTpTdG_MIof8EDLmS03ffY-Uvkj-8CYjSOVFsrMEetFkt-I_reI8aKDxE4hpJOwzoIshbsMXWsVP4YaqoMRRSkvMNOcbeJPAf2A63J?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>Toggling code snippets will give the fields as well as the Prismic recommended component to use in the frontend code. Code of <strong><code>src/slices/HomepageHero/index.tsx</code></strong> after adding simple styling and data fields:</p><pre><code class="language-JSX">const HomepageHero: FC&lt;HomepageHeroProps&gt; = ({ slice }) =&gt; {
&#xA0;return (
&#xA0;&#xA0;&#xA0;&lt;section
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;data-slice-type={slice.slice_type}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;data-slice-variation={slice.variation}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;className=&quot;w-full text-slate-700 flex space&quot;
&#xA0;&#xA0;&#xA0;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;div className=&quot;mx-auto w-full max-w-6xl&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;div className=&quot;grid grid-cols-2 place-items-center text-center&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;div className=&quot;grid grid-rows-[1fr,auto,auto] gap-8 h-fit&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;div&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;h1 className=&quot;text-6xl&quot;&gt;{slice.primary.hero_title}&lt;/h1&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;PrismicRichText field={slice.primary.hero_description} /&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;/div&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;/div&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;PrismicNextImage
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;field={slice.primary.hero_image}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;className=&quot;rounded drop-shadow-xl max-w-4xl w-full&quot;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;/div&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&lt;/div&gt;
&#xA0;&#xA0;&#xA0;&lt;/section&gt;
&#xA0;);
};</code></pre><p></p><h1 id="custom-type-creation-single">Custom Type Creation (Single)</h1><p>Some data may not fit into any specific category. For such cases, we can create a custom type. In our case, we can store the logo, company name, and navigation as a custom type. This allows us to use them in both the header and footer. Since these items are singular, we will create a <strong>Single Type</strong>. To do this, go to <strong>Custom Types</strong> in the left sidebar and create a new one:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd1xAhnorx8ouKTtNbWDczDDMdbcMBqV3881IQEZ5xO1_X5QT85lTQpIccDJf9jaAUnHe3JSBm1ypmDZItF-4gKF8xb6lSFTxveyYRtg96F76mgvwnBq9atxfBKwdDjYd14iXH4?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1112" height="1228"></figure><p></p><p>The empty custom type will look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdPF4NUtp65O1ZRYZYt2yfjpM2tCxWV0GXnLggzyuRvipHYRLgGBu1mIX-BqX078p1zLsNMkhXaZeej3NeI_-xa7H_KYkZBV0yMXvnGbcQ5YSKd1FgGWf3ikuZBocmqruV1KA37?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="384"></figure><p>We can use both static data and slices here. We will use Repeatable Group to create navigation</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc3u5J_dc6lBtzLz_7N7gJzVsHeZFuAD5AaJEVxCtZPF_oySMJgb3QA6El46_DtHJcQvQkFxGPr8csjHEd4FNVnx77UU4vkWyJH_IebBQuV6xQEh-Mye_0ETMd5Xa2zG0XeHq5FzA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1158"></figure><p>Finally it will look like this after adding all the fields:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcXKyrDBgpUzLGeYJeGNL6fzW8USsXSicGCFcvwCFoI3WsEppzxsCWRiV5i3atXAhHP58fKkK3wT3dAEsObGLsBmrrLwm7WEdvkXB6sLGDRMaNLljksekupxbqRXo50Rle2gEg9ew?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1052"></figure><p>Review the changes and push via GUI.<br></p><h1 id="populating-data-in-prismic-cms1">Populating Data in Prismic CMS - 1</h1><p></p><p>Once our pages and slices are set up and pushed to the Prismic repository, we need to populate the data via Prismic CMS. You can access the Prismic CMS from the link provided in Slicemachine:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdGSYVFHcJYjdPoSdt0gL7Bf8ZtEioj2WMMfTTNH3_7o3fcGceEGel021syARBs6Xf5lgghZ292HPLne6P0rN9p1ac7x284b37EbLWM6W-4Il9c60alQcQoUQ8C6w2xboiIuKZ97w?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>Click on <strong>Create a new page</strong> , it will show all the <strong>Page types and Custom Types</strong> which have been pushed in the Prismic Repository.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfcRIRN8457tmpiX81fR_QgcRKVlByWFZECFYKczISKMDIlI27oyA1ZiFujstsWHT3NtlaSwZy6ZLHnCVdeXGt5QV8leqa6E_4-K87VxzHOUCAEsu6Dwt8atmEK0mBHCpG2bMYB?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1225"></figure><p></p><p>Click on <code>CommonData</code>, the empty common data will look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfmHo2dAJ8sMfJulGd8vpTkjpSwrqENTZbi-tyZ4mNVrSqKRzUEcMhYCORj8HbPTaT_ocMVFsmeStliCWtNC_weNnyh2IaRNb4Lqm4U3CKYKd8QY3tIErJtY07PNAaYI_IhkFlnqQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1104"></figure><p></p><p>Here, We used Gemini to create a beautiful logo, and I think it has done a great job!</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcT8zUySkckYC_ajIA1rwWpJCzTqGOhm3O5r3gcTpkA44FzEPWLDSQ_a1_6ViSph3rIsG_T-3aQyffx7yZLxMJaSezQ9bllodLC2iX37X3LKYNjS3xsNYn_i-R9_zqCKib1pyOkQQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1137" height="1600"></figure><p></p><p>After populating the content:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfMXbygCg0xPh0DafQO3fi4FzWsOVtraOB-Qjo1YPB9LlhvQ9oEwoEc6WGLGE5lIugWM4TFVie041YUtEbyWvcXgEq_kqJpTCS1VjNoJN6bqBTKJH3YEb2lHRoSicIgb_DcSMjxxQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><p>Once you are done populating the data, you can save and publish to production via GUI.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcOZszJ9oCvJG0ByvvEIYnTPSIbjDv21tbi2y32VmPOMYR2I41YDIIRUZPJ3CG1ezYvWehJDOuyRufFYpf4-wedhk0uM_iwZ7Vz53qnfAmn0u1mPHTKXpmyINECd3N20KwYxbOmEA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="267"></figure><p></p><h1 id="styling-the-layout">Styling the Layout</h1><p></p><p>Usually a website is divided into different sections. We can create a common wrapper for sections and use them in all the slices. So create a file <code>src/components/Container.tsx</code> and paste following code in this file:</p><pre><code class="language-JSX">type ContainerProps = {
 htmlTag?: React.ElementType;
 className?: string;
 children: React.ReactNode;
};
function Container({
 children,
 htmlTag: Tag = &apos;section&apos;,
 className,
 ...restProps
}: ContainerProps) {
 return (
   &lt;Tag
     className={`px-4 py-10 md:py-14 xl:px-6 lg:py-16 ${className}`}
     {...restProps}
   &gt;
     &lt;div className=&quot;mx-auto w-full max-w-6xl&quot;&gt;{children}&lt;/div&gt;
   &lt;/Tag&gt;
 );
}
export default Container;
</code></pre><p></p><p>We will need to add the header and footer first before coding the page. So create files under <code>src/components/Header.tsx</code> and <code>src/components/Footer.tsx</code>&#xA0;</p><p>We will use the data populated in <code>CommonData</code> here. Head back to your local Slicemachine and open <code>CommonData</code>. On the top right, you&apos;ll see a <strong>Show Code</strong> <strong>Snippets</strong> toggle. Enabling this will display all the necessary code snippets for individual fields, using Prismic&apos;s recommended components.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXclB-rLFdlL8o2_EPe40-u_GORB_5KXqCLRQhMZq21wrMF2q1S1Cclciw1A7dba3apg4pSoYrNBmXm6YPMa2oJOqHcIfXI7xiNiTfY0tD5Fvc6LohO-to9wmjh4A_QbjMJWo7ARkQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1493"></figure><p></p><p>We will use above code snippets in our header and footer:</p><p><strong>Header.tsx</strong></p><pre><code class="language-JSX">import React from &apos;react&apos;;
import { createClient } from &apos;@/prismicio&apos;;
import { PrismicNextImage, PrismicNextLink } from &apos;@prismicio/next&apos;;
import Container from &apos;./Container&apos;;
import Link from &apos;next/link&apos;;
async function Header() {
 const client = createClient();
 const { data } = await client.getSingle(&apos;commondata&apos;);
 return (
   &lt;Container htmlTag=&quot;header&quot; className=&quot;py-2 md:pb-6 lg:py-4 bg-white&quot;&gt;
     &lt;div className=&quot;flex gap-4 items-center justify-between sm:flex-row flex-col&quot;&gt;
       &lt;div className=&quot;flex place-items-center gap-2&quot;&gt;
         &lt;Link href=&quot;/&quot;&gt;
           &lt;PrismicNextImage field={data.logo} height={50} /&gt;
           {data.site_name}
         &lt;/Link&gt;
       &lt;/div&gt;
       &lt;nav&gt;
         &lt;ul className=&quot;flex&quot;&gt;
           {data.navigation.map((item) =&gt; (
             &lt;li key={item.name}&gt;
               &lt;PrismicNextLink field={item.link} className=&quot;p-3&quot;&gt;
                 {item.name}
               &lt;/PrismicNextLink&gt;
             &lt;/li&gt;
           ))}
         &lt;/ul&gt;
       &lt;/nav&gt;
     &lt;/div&gt;
   &lt;/Container&gt;
 );
}
export default Header;
</code></pre><p></p><p><strong>Footer.tsx</strong></p><pre><code class="language-JSX">import React from &apos;react&apos;;
import { createClient } from &apos;@/prismicio&apos;;
import { PrismicNextImage, PrismicNextLink } from &apos;@prismicio/next&apos;;
import Link from &apos;next/link&apos;;
import Container from &apos;./Container&apos;;
async function Footer() {
 const client = createClient();
 const { data } = await client.getSingle(&apos;commondata&apos;);
 return (
   &lt;Container htmlTag=&quot;footer&quot;&gt;
     &lt;div className=&quot;flex sm:flex-row flex-col justify-between items-center gap-6&quot;&gt;
       &lt;Link href=&quot;/&quot;&gt;
         &lt;PrismicNextImage field={data.logo} height={50} /&gt;
       &lt;/Link&gt;
       &lt;p className=&quot;text-sm&quot;&gt;
         &amp;copy; {new Date().getFullYear()} {data.site_name}
       &lt;/p&gt;
       &lt;ul className=&quot;flex&quot;&gt;
         {data.navigation.map(({ name, link }) =&gt; (
           &lt;li key={name} className=&quot;p-2&quot;&gt;
             &lt;PrismicNextLink field={link} /&gt;
           &lt;/li&gt;
         ))}
       &lt;/ul&gt;
     &lt;/div&gt;
   &lt;/Container&gt;
 );
}
export default Footer;
</code></pre><p><strong>NOTE:</strong>&#xA0; <code>createClient</code> is a function provided by Prismic themselves. We need to use <code>createClient</code> to fetch data from the Prismic Backend.</p><p>Add header and footer in the <code>layout.tsx</code> file (Completely NextJS thing, nothing to do with Prismic)</p><pre><code class="language-JSX">export default function RootLayout({
 children,
}: Readonly&lt;{
 children: React.ReactNode;
}&gt;) {
 return (
   &lt;html lang=&quot;en&quot;&gt;
     &lt;body
       className={`${geistSans.variable} ${geistMono.variable} antialiased`}
     &gt;
       &lt;Header /&gt;
       {children}
       &lt;Footer /&gt;
     &lt;/body&gt;
   &lt;/html&gt;
 );
}
</code></pre><p>Replace the code in <code>global.css</code> file with following css code:</p><pre><code class="language-JSX">@tailwind base;
@tailwind components;
@tailwind utilities;
body {
 @apply text-slate-600;
}
</code></pre><p>Once done, the website should look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeYb1-ZtcQ_bHobrjJ2jWFpgs9CLnUQrpwxXg4NcpDVGdqsiFZyqQEOQZIlXV8J6p7_oBDTByGjS2nBdbOH10EOeyCKhbZ2M4LyRjAegoPTHaBwrYYneDhltnGWXxTt7we7Ek2gpQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p></p><h1 id="creating-a-page-type">Creating a Page Type</h1><p></p><p>We need to create page types that will use slices to generate actual web page content. To do this, go to <strong>Page Types</strong> and create a new page.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc2ZWs1aDYBM3ju-l-g0g7rGz0D2m4CkyXy-jJlbFyzKRh2ZGBwaXE2E5nriH-SLWoHO4R8FR6ow_ow_iknZHbmrDsBXGbOGGmaD2gSz-uYw4E7SyS6p8oQ0nOqNqMnAsXhpEP89Q?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>Page can be of reusable type (For example say Blog post / Plan details) or it can be of single type. Since there will be only one home page, we will go with Single Type. It will look like this when new:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcW7MKF5E9weXCIamVJoTMPGirCuV_cc-Qvb3hg2jbXh37-6tVfbFk26ZWfhKZ0i5R9FMI0jQIdII1SJF6p1_2YJV-g6O_ifKdtl5gO9CNUCnJKngsW0NsIuo06q4oM3LysQaNZOQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1244"></figure><p><br>In the above UI, there are two fields, Static Zone - it is the data specific to this page only, and slice zone, we can use the slices we create above here.</p><p></p><h2 id="adding-single-slices">Adding Single Slices</h2><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeVqVRZn4zn37ApcD9tjoGloJL7Ik88ADqPRfvVSyaf1OOaBu250CXOWwUNZe-_DZEYerVNun5kG9sVcf98eXZviiimDQmLVT3t4qi5rs2E07HX1jwDXFH1yiEAAgGHg40Zcs_Bmw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p>We will add the hero section to our homepage. Follow the same process: review the changes and push them to the Prismic repository via the UI. By default, Prismic provides fields for SEO and meta in the second tab. However, if we need additional fields for the meta, we can add them.</p><p></p><h1 id="populating-data-in-prismic-cms2">Populating Data in Prismic CMS -2&#xA0;</h1><p></p><p>We will add content in the Home Page. Head to the Prismic CMS dashboard via the link in the slice machine. Click on Create a new page. This time it will show option of <strong>homepage</strong> also:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc8xUKN3kMAVd4ht6HOYLQFgrM88-3LXpnXQ_iD_gX55dbHcyUKyR9u_Q-PgXqJk5EUUNueeIGQdehwLhxnEPf7xjT7x5GmUkevnX-ksjtOdDCxujSWwOtbxwxcwqkMbBYEeIGU5A?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1268" height="476"></figure><p><br></p><p>The page is empty right now. You can add slice from left:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeyACeT8YLEsiOhHLLiBnitxzpcQGDMYeLmhfVBzmfLY5r6ia5XxwXbynOWu1OVHBIlAetk21pJdz2M57G0x80d_HfKH5XLb2tv2mJIx9PPyJyDEA7EJ4nKMOq1h18unjBJOa1MwQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="330"></figure><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe3auWEGY1NWypKIiSqTLZFElrmQG5PXSE2eoSzDSgP7lnX3UdHsKVAhQDHgTPMcDxVYKPwBPT1DKq93sXR1ipFb4fkUu_q2VXsqpKeIuQBia3RZVJ0NhQJVPbnFZ2AxOWE987jxA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1302"></figure><p><br>After adding HeroSection and its content</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd6Ug3Stx-3yb4Wu_dpwAfJRvw5RA5Q_a_yahrxz6pfyYQW5jqU1Tv2b40yUGDbmBMWBk2UykL-9Df64ZUXUS1XC-qlU7dopqvoSEmkWjctPanjrfKp3-eCSy6C3Bk-Z99aChTpiA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1275"></figure><p>Once done, click on save and then publish it.<br></p><h1 id="styling-page-and-using-cms-data">Styling Page and Using CMS Data</h1><p></p><p>Once all the data is Populated in the Prismic CMS, head back to slice machine in localhost. Go to Page types and click the page. There is a button on top which will show Page snippet:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe5wTDlWtaX5C3Vt23lQ9lvCdpd8y4BCl0o8pgnEZRdJCS1ZF0DriE1zFKH8Fh_XkQ6aBRf6sOZF3kF6YvXDT5LVLjWcue2abZYGTsIbFP6dN76UDFGjPaff7c4KzslOF4_7t_rZg?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1275"></figure><p></p><p>You can choose to follow the instructions given for file creation, or decide by yourself which page you want to render. Since we are creating homepage, we will not follow instructions and make change in the default homepage of NextJS <code>src/app/page.tsx</code></p><p>The page will look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd27DQQ6cncrvC5T4lvT-ylsd8R_v5OiaHdj9CYZR2wQLIYs5pMK1kkdHBg3woAtR6z1xclzZh7gX7QMwFw2Cw0-baSfo9GQWI1KvlM5NfitfWyQXBcyaOv_juKJDmQhGoAdE52?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1275"></figure><p></p><p>We now have the Header and Footer, which are using data from the Prismic CMS, along with the homepage that incorporates the Hero Section slice.</p><p>By this stage, the fundamentals of our website are in place. Now, we need to develop the remaining slices and integrate them into the site.</p><h1 id="creating-flower-card-slice">Creating Flower Card Slice</h1><p></p><p>Here are the fields added for the Flower Card slice. You can refer to the previous sections for a detailed step-by-step guide on creating a slice.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfMj544SdsctVGnQkEO8e_y1Niuc0neu_hxtKFjdtGXgFeqniX26Z7F2C4-b7IGSFQiVu3eBb9iVnNAzIpH9C7LnrV7DXRyJ_-xmwToH6Hvhh0uwQfZLP91D0ovaaK83D9j_KXy6g?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1255"></figure><p><br>Paste below code in <code>src/slices/FlowerCard/index.tsx</code> :</p><pre><code class="language-JSX">import { FC } from &apos;react&apos;;
import { Content } from &apos;@prismicio/client&apos;;
import { PrismicRichText, SliceComponentProps } from &apos;@prismicio/react&apos;;
import { PrismicNextImage, PrismicNextLink } from &apos;@prismicio/next&apos;;
import Container from &apos;@/components/Container&apos;;
/**
* Props for `FlowerCard`.
*/
export type FlowerCardProps = SliceComponentProps&lt;Content.FlowerCardSlice&gt;;
/**
* Component for &quot;FlowerCard&quot; Slices.
*/
const FlowerCard: FC&lt;FlowerCardProps&gt; = ({ slice }) =&gt; {
 return (
   &lt;Container
     data-slice-type={slice.slice_type}
     data-slice-variation={slice.variation}
   &gt;
     &lt;div className=&quot;grid grid-cols-3 max-w-screen-lg m-auto gap-10 my-10 place-items-center&quot;&gt;
       &lt;PrismicNextImage
         field={slice.primary.flowerimage}
         className=&quot;w-fit rounded shadow-2xl&quot;
       /&gt;
       &lt;div className=&quot;grid grid-cols-1 gap-5 col-span-2&quot;&gt;
         &lt;h2 className=&quot;text-2xl&quot;&gt;{slice.primary.heading}&lt;/h2&gt;
         &lt;PrismicRichText field={slice.primary.short_description} /&gt;
         &lt;PrismicNextLink
           field={slice.primary.detailslink}
           className=&quot; w-fit bg-red-300 hover:bg-red-400 transition-colors duration-200 ease-in-out py-3 px-8 rounded-full text-white font-bold&quot;
         &gt;
           {slice.primary.link_label}
         &lt;/PrismicNextLink&gt;
       &lt;/div&gt;
     &lt;/div&gt;
   &lt;/Container&gt;
 );
};
export default FlowerCard;
</code></pre><p></p><h1 id="creating-flower-details-slice">Creating Flower Details Slice</h1><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXczTzVXvfhICvTl36yjK7dEtkRlV7Vgj7NB3Mh7UDJxswm4LJT2U0k2K8g1VYaD5YThp3KzrPBspJ277i5xEFBMGewu_j4-bE-eKG3YubX6dtMcWchfAPTZy64pS6nIKtvIeAVEkA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1486"></figure><p>Paste following code in <code>src/slices/FlowerDetails/index.tsx</code> :</p><pre><code class="language-JSX">import { FC } from &apos;react&apos;;
import { Content } from &apos;@prismicio/client&apos;;
import { PrismicRichText, SliceComponentProps } from &apos;@prismicio/react&apos;;
import { PrismicNextImage } from &apos;@prismicio/next&apos;;
import Container from &apos;@/components/Container&apos;;
/**
* Props for `FlowerDetails`.
*/
export type FlowerDetailsProps =
 SliceComponentProps&lt;Content.FlowerDetailsSlice&gt;;
/**
* Component for &quot;FlowerDetails&quot; Slices.
*/
const FlowerDetails: FC&lt;FlowerDetailsProps&gt; = ({ slice }) =&gt; {
 return (
   &lt;Container
     data-slice-type={slice.slice_type}
     data-slice-variation={slice.variation}
   &gt;
     &lt;h2 className=&quot;text-4xl font-bold py-6&quot;&gt;{slice.primary.name}&lt;/h2&gt;
     &lt;PrismicNextImage
       field={slice.primary.flower_image}
       className=&quot;max-w-xs rounded shadow-xl&quot;
     /&gt;
     &lt;div className=&quot;py-4 grid grid-cols-1 gap-4&quot;&gt;
       &lt;div&gt;
         &lt;b&gt; Scientific Name:&lt;/b&gt; {slice.primary.scientific_name}
       &lt;/div&gt;
       &lt;div&gt;
         &lt;b&gt; Climate:&lt;/b&gt; {slice.primary.climate}
       &lt;/div&gt;
       &lt;div&gt;
         &lt;b&gt; Countries:&lt;/b&gt;
         &lt;PrismicRichText field={slice.primary.countries} /&gt;{&apos; &apos;}
       &lt;/div&gt;
       &lt;div&gt;
         &lt;PrismicRichText field={slice.primary.description} /&gt;
       &lt;/div&gt;
     &lt;/div&gt;
   &lt;/Container&gt;
 );
};
export default FlowerDetails;
</code></pre><p></p><h1 id="adding-flower-card-slice-in-homepage">Adding Flower Card Slice in Homepage</h1><p></p><p>In the slice machine (<a href="http://localhost:9999/page-types/homepage?ref=blog.startappz.com"><u>http://localhost:9999/page-types/homepage</u></a> ) then add <strong>FlowerCard</strong> slice.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfCtv0KpocUiYUfJ_55jwvJ17N1l9KwUtGWMvzjjQeAfNQeUWnD9HoxPCtac5sboKkpwgIelUDskLpaZ43JRSMgJsAe9GoN80KNIfHRXU8Ca8ZySWy15fomdsw9UJhAVGEIBOn20Q?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1255"></figure><p></p><h1 id="creating-new-dynamic-page">Creating New Dynamic Page</h1><p></p><p>Our homepage is a single type, but to display the details of individual flowers, we&#x2019;ll need a dynamic page. This will include the Flower Details Slice. In Slice Machine, go to <strong>Page Types</strong>, click on <strong>Create</strong>, and then select <strong>Reusable Types</strong>.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd6hGcsfbjb8PxRyKUYA8R5R8Gyv8Ko6NXOF4nZMzI64C-VTQWbbAnKh18W4brSkkHRx5zvEZWzQrlLmw7Kqs1Nx8aoI6CgfH7PlAB5VE66Yx8UzIR2HV1zBL1E9ULiC_9zDJxnFA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1255"></figure><p></p><h1 id="adding-flower-details-slice-in-dynamic-page">Adding Flower Details Slice in Dynamic page</h1><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdc1rf9sleNBdi4iHHTy6bwhkL4ZQ906cAn1aJXF2WF-Plftt3Bn9fjyoBosFMagIODCNISMi96Ctb3jNYr5opFbEu5MLXLK0x4EElXSTSr13ODIZ23nLL4SYF7v_ppBzAhUCmS5A?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1255"></figure><p>Push all the changes via GUI.<br></p><h1 id="frontend-changes-to-handle-dynamic-page">Frontend Changes to Handle Dynamic Page</h1><p></p><p>Create a file <code>src/app/[uid]/page.tsx</code> and paste following code (Hint: this is also autogenerated by slice machine &#x1F609; ) :</p><pre><code class="language-JSX">import { Metadata } from &quot;next&quot;;
import { notFound } from &quot;next/navigation&quot;;
import { isFilled, asImageSrc } from &quot;@prismicio/client&quot;;
import { SliceZone } from &quot;@prismicio/react&quot;;
import { createClient } from &quot;@/prismicio&quot;;
import { components } from &quot;@/slices&quot;;
type Params = { uid: string };
export default async function Page({ params }: { params: Promise&lt;Params&gt; }) {
 const { uid } = await params;
 const client = createClient();
 const page = await client.getByUID(&quot;page&quot;, uid).catch(() =&gt; notFound());
 return &lt;SliceZone slices={page.data.slices} components={components} /&gt;;
}
export async function generateMetadata({
 params,
}: {
 params: Promise&lt;Params&gt;;
}): Promise&lt;Metadata&gt; {
 const { uid } = await params;
 const client = createClient();
 const page = await client.getByUID(&quot;page&quot;, uid).catch(() =&gt; notFound());
 return {
   title: page.data.meta_title,
   description: page.data.meta_description,
   openGraph: {
     title: isFilled.keyText(page.data.meta_title)
       ? page.data.meta_title
       : undefined,
     description: isFilled.keyText(page.data.meta_description)
       ? page.data.meta_description
       : undefined,
     images: isFilled.image(page.data.meta_image)
       ? [asImageSrc(page.data.meta_image)]
       : undefined,
   },
 };
}
export async function generateStaticParams() {
 const client = createClient();
 const pages = await client.getAllByType(&quot;page&quot;);
 return pages.map((page) =&gt; {
   return { uid: page.uid };
 });
}
</code></pre><p></p><p>Now, in order to handle the dynamic routes, we need to make changes in <code>src/prismicio.ts</code> also. Open this file and uncomment following code block related to routes:</p><pre><code class="language-JSX">const routes: prismic.ClientConfig[&quot;routes&quot;] = [
 // Examples:
 {
   type: &quot;homepage&quot;,
   path: &quot;/&quot;,
 },
 {
   type: &quot;page&quot;,
   path: &quot;/:uid&quot;,
 },
];
</code></pre><p><br>Login to the Prismic CMS Dashboard and add all the content. The final website should look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcCpKlLTpsLkEdZAP9nyk4J0WGPD0lsO8dXdR3sy9TgUgFw8pJon3whr0KaaPJF54-0nBLiIKbz6r8K6vWEFltMPGdBMWXZXbANOdLqXw2yYGcnEDos6Mt6i1zmO5dAJNsQcRx-Ug?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p>By clicking on any more information button, you&#x2019;ll get redirected to dynamic page with Flower Details Slice:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdVYioxbVQ83oQ47MyAf0VQJ42fyyIcBj7yAw6WZfyJ5_Wc3iiowy4WhimE5b5Q572lS2TS6D3jIZwE-rbD6AoS9KeikhSvovwEOgX8Wr6bDxJe1IWqzDMdLQGP7F-TcjNJ7IKf?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p></p><h1 id="adding-internationalization">Adding Internationalization</h1><h1 id="prismic-cms-updates">Prismic CMS Updates</h1><p></p><p>This could be the trickiest part of this section. Prismic supports multiple languages. In your Prismic Dashboard, go to <strong>Settings</strong> then <strong>Translations &amp; Locales</strong>.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXda4RRny6T0djdZEEXdYJdVXep_a6qVapmJBAZBBHC1iveH2XxNsSpfqCuHju6fz7iAVQ69YkFi8Dxbqek-Ic5YWtuID6ILRaefsJQh09JM0uKtjEPWCRdK8Ltr7O02i2DayknYiw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p>You will see all the locales supported here. You can add language of your preference here. In our case we will select Arabic (UAE):</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdIlxH9_w3VJw5697rtOcv6SyePjSST4_DgUmDyCmod484fYSjSy5rXR9u1qY9lr3VOB681O4pwI9ps_i5vluFW8Mf8nriwfKV2NyzHfQuPK3cGSmeSG3DQ8Ks8BQv3bpVpgsQKgQ?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p>The content manager can switch between languages from the dropdown in the left:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeeReHEgVNQDeOubehZhXrF99WW-I6ApBg5B0cCOzKf_aWUUiCBtuRTcyMnS-qm_-YpCVIkWtnRfSI3HiFRN3XRRimmHr5PIyT7gTVNQ0_xULq5P-2JOWcYqUMWyJyIFS7z3ECQtA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p></p><h1 id="code-changes-for-i18n">Code Changes for i18n</h1><p></p><p><strong>Step 1:</strong> We need to add middleware that will detect the selected language and modify subsequent network requests based on the chosen locale:<br>File: <code>src/middleware.ts</code></p><pre><code class="language-JSX">// ./src/middleware.ts
import { NextRequest, NextResponse } from &apos;next/server&apos;;
import { createClient } from &apos;@/prismicio&apos;;
export async function middleware(request: NextRequest) {
 const client = createClient();
 const repository = await client.getRepository();
 const locales = repository.languages.map((lang) =&gt; lang.id);
 const defaultLocale = locales[0];
 // Check if there is any supported locale in the pathname
 const { pathname } = request.nextUrl;
 const pathnameIsMissingLocale = locales.every(
   (locale) =&gt; !pathname.startsWith(`/${locale}/`) &amp;&amp; pathname !== `/${locale}`
 );
 // Redirect to default locale if there is no supported locale prefix
 if (pathnameIsMissingLocale) {
   return NextResponse.rewrite(
     new URL(`/${defaultLocale}${pathname}`, request.url)
   );
 }
}
export const config = {
 // Don&#x2019;t change the URL of Next.js assets starting with _next
 matcher: [&apos;/((?!_next).*)&apos;],
};
</code></pre><p></p><p><strong>Step 2: </strong>Next step, we need to update our routes in <code>prismicio.ts</code> to handle the language parameter in the URL:</p><pre><code class="language-JSX">const routes: prismic.ClientConfig[&apos;routes&apos;] = [
 {
   type: &apos;page&apos;,
   uid: &apos;home&apos;,
   path: &apos;/:lang?&apos;,
 },
 {
   type: &apos;page&apos;,
   path: &apos;/:lang?/:uid&apos;,
 },
];</code></pre><p></p><p><strong>Step 3: </strong>Update folder structure of <code>src/app</code> to handle the dynamic <code>lang</code>. The new folder structure under <code>src/app</code> should look like this:</p><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdmvfWimR7zjkXrzfUhZNrblwfPn7FaNNyEZYHtB3g2ToJZoWgA3V0LUh5j5PhQ5TMDNrafvpuPqkZeMLGDxaht8AkQsK0sGqoNTYGe7ssIHnW6v2Bc4vvIMVmMTR5q0Rz11ZAeyw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="442" height="538"></figure><p><br><strong>Step 4:</strong> Update <code>src/app/[lang]/[uid]/page.tsx</code> , add query of <code>lang</code> in request functions. Almost all the fetch functions provided by Prismic <code>createClient</code> provide a feature to pass language as a parameter. So the difference will look like this:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeoW_8nbVaMTARNuQzuyyd-8ZFDeNOfW9-VD59vWoRVQX8MVdS-a50ng1JwkV65StwAn2C2SauVmgVvoMFflrQQJeT6pFLChxk-7tZTNOz_JZLYkdBd3YVJAECBxu_qrqCrQvhNtw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p>Final code:</p><pre><code class="language-JSX">import { Metadata } from &quot;next&quot;;
import { notFound } from &quot;next/navigation&quot;;
import { isFilled, asImageSrc } from &quot;@prismicio/client&quot;;
import { SliceZone } from &quot;@prismicio/react&quot;;
import { createClient } from &quot;@/prismicio&quot;;
import { components } from &quot;@/slices&quot;;
type Params = { uid: string, lang: string };
export default async function Page({ params }: { params: Promise&lt;Params&gt; }) {
 const { uid } = await params;
 const client = createClient();
 //@ts-expect-error types not updated
 const page = await client.getByUID(&quot;page&quot;, uid, { lang: params.lang }).catch(() =&gt; notFound());
 return &lt;SliceZone slices={page.data.slices} components={components} /&gt;;
}
export async function generateMetadata({
 params,
}: {
 params: Promise&lt;Params&gt;;
}): Promise&lt;Metadata&gt; {
 const { uid } = await params;
 const client = createClient();
 //@ts-expect-error types not updated
 const page = await client.getByUID(&quot;page&quot;, uid, { lang: params.lang }).catch(() =&gt; notFound());
 return {
   title: page.data.meta_title,
   description: page.data.meta_description,
   openGraph: {
     title: isFilled.keyText(page.data.meta_title)
       ? page.data.meta_title
       : undefined,
     description: isFilled.keyText(page.data.meta_description)
       ? page.data.meta_description
       : undefined,
     images: isFilled.image(page.data.meta_image)
       ? [asImageSrc(page.data.meta_image)]
       : undefined,
   },
 };
}
export async function generateStaticParams() {
 const client = createClient();
 const pages = await client.getAllByType(&quot;page&quot;);
 return pages.map((page) =&gt; {
   return { uid: page.uid };
 });
}
</code></pre><p></p><p><strong>Step 5:</strong> Same thing we need to do for <code>src/app/[lang]/page.tsx</code> to handle locale. Final code:</p><pre><code class="language-JSX">import { Metadata } from &apos;next&apos;;
import { isFilled, asImageSrc } from &apos;@prismicio/client&apos;;
import { SliceZone } from &apos;@prismicio/react&apos;;
import { createClient } from &apos;@/prismicio&apos;;
import { components } from &apos;@/slices&apos;;
type Params = { lang: string };
export default async function Page({ params }: { params: Promise&lt;Params&gt; }) {
 const client = createClient();
 const { lang } = await params;
 const page = await client.getSingle(&apos;homepage&apos;, { lang });
 return &lt;SliceZone slices={page.data.slices} components={components} /&gt;;
}
export async function generateMetadata({
 params,
}: {
 params: Promise&lt;Params&gt;;
}): Promise&lt;Metadata&gt; {
 const client = createClient();
 const { lang } = await params;
 const page = await client.getSingle(&apos;homepage&apos;, { lang });
 return {
   title: page.data.meta_title,
   description: page.data.meta_description,
   openGraph: {
     title: isFilled.keyText(page.data.meta_title)
       ? page.data.meta_title
       : undefined,
     description: isFilled.keyText(page.data.meta_description)
       ? page.data.meta_description
       : undefined,
     images: isFilled.image(page.data.meta_image)
       ? [asImageSrc(page.data.meta_image)]
       : undefined,
   },
 };
}
</code></pre><p></p><h1 id="right-to-left">Right to Left</h1><p>Since we have added Arabic and English languages, we need to support both Left to Right and Right to Left. English is taken care of by default, but for Arabic we need to make some code changes. We need to take care of two attributes <code>lang</code> and <code>dir</code> in the <code>html</code> tag. How to do this?</p><p>We need to access <code>[lang]</code> dynamic parameters and decide on the above two values. At this point we can move our <code>src/app/layout.tsx</code> to <code>src/app/[lang]/layout.tsx</code> location. Reason - we need to access <code>[lang]</code> variable. Then paste following code in <code>layout.tsx</code> :&#xA0;</p><pre><code class="language-JSX">import type { Metadata } from &apos;next&apos;;
import { Geist, Geist_Mono } from &apos;next/font/google&apos;;
import &apos;../globals.css&apos;;
import Header from &apos;@/components/Header&apos;;
import Footer from &apos;@/components/Footer&apos;;
const geistSans = Geist({
 variable: &apos;--font-geist-sans&apos;,
 subsets: [&apos;latin&apos;],
});
const geistMono = Geist_Mono({
 variable: &apos;--font-geist-mono&apos;,
 subsets: [&apos;latin&apos;],
});
export const metadata: Metadata = {
 title: &apos;Create Next App&apos;,
 description: &apos;Generated by create next app&apos;,
};
type Params = { lang: string };
export default async function RootLayout({
 children,
 params,
}: Readonly&lt;{
 children: React.ReactNode;
 params: Promise&lt;Params&gt;;
}&gt;) {
 const { lang } = await params;
 return (
   &lt;html lang={lang} dir={lang.startsWith(&apos;ar-&apos;) ? &apos;rtl&apos; : &apos;ltr&apos;}&gt;
     &lt;body
       className={`${geistSans.variable} ${geistMono.variable} antialiased`}
     &gt;
       &lt;Header /&gt;
       {children}
       &lt;Footer /&gt;
     &lt;/body&gt;
   &lt;/html&gt;
 );
}
</code></pre><p></p><p>If everything has been done correctly, then you shall be able to see the website in both English and Arabic (after populating the content in both languages of course):</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXer7YWJj75203O-fBuM4Ol3srwKOI2vrX7VOJjvG2tUNGwwtULbcEgDxxkX9g7iBQXjshtw9R1YDpDGiJIS-NrUgwxdZta9O4BCajnYfx6mS3D_ysUeNZThqLEunUk2IgvDxO3wmA?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeI_chnXuaaZWHpW8Zyxtc1la0mpTn0HBXleNqB_BfdplXPEY8CH8mFdqqO2oxVujjhaPQh3rT0B2JiU-GH8gmzeEx0Cz7GL8twrStO83ydffkd9MvMBdi87uDWYBhklRihwZb6og?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1036"></figure><p></p><h1 id="add-language-switcher">Add Language Switcher</h1><p></p><p>Now that we have added two languages, we can give a simple language switcher. Create a file <code>src/utils/getLocales.ts</code> , this will get all the locales added in the Prismic CMS:</p><pre><code class="language-JSX">// ./src/utils/getLocales.ts
import { Client, Content } from &apos;@prismicio/client&apos;;
export async function getLocales(client: Client&lt;Content.AllDocumentTypes&gt;) {
 const [repository] = await Promise.all([client.getRepository()]);
 return repository.languages;
}
</code></pre><p></p><p>And then add a new component <code>src/components/LanguageSwitcher.tsx</code> :&#xA0;</p><pre><code class="language-JSX">&apos;use client&apos;;
import { PrismicNextLink } from &apos;@prismicio/next&apos;;
interface LanguageSwitcherProps {
 locales: {
   id: string;
   name: string;
   is_master: boolean;
 }[];
}
const localeLabels = {
 &apos;en-us&apos;: &apos;EN&apos;,
 &apos;ar-ae&apos;: &apos;AR&apos;,
};
export const LanguageSwitcher = ({ locales }: LanguageSwitcherProps) =&gt; {
 return (
   &lt;div className=&quot;flex flex-wrap gap-3&quot;&gt;
     &lt;span aria-hidden&gt;&#x1F310;&lt;/span&gt;
     &lt;ul className=&quot;flex flex-wrap gap-3&quot;&gt;
       {locales.map((locale) =&gt; (
         &lt;li key={locale.id} className=&quot;first:font-semibold&quot;&gt;
           &lt;PrismicNextLink
             href={locale.is_master ? &apos;/&apos; : `/${locale.id}`}
             locale={locale.id}
             aria-label={`Change language to ${locale.name}`}
           &gt;
             {localeLabels[locale.id as keyof typeof localeLabels] ||
               locale.id}
           &lt;/PrismicNextLink&gt;
         &lt;/li&gt;
       ))}
     &lt;/ul&gt;
   &lt;/div&gt;
 );
};
</code></pre><p>Add this new component in the Header.tsx :&#xA0;</p><pre><code class="language-JSX">       &lt;nav&gt;
         &lt;ul className=&quot;flex&quot;&gt;
           {data.navigation.map((item) =&gt; (
             &lt;li key={item.name}&gt;
               &lt;PrismicNextLink field={item.link} className=&quot;p-3&quot;&gt;
                 {item.name}
               &lt;/PrismicNextLink&gt;
             &lt;/li&gt;
           ))}
           &lt;li&gt;
             &lt;LanguageSwitcher  locales={locales} /&gt;
           &lt;/li&gt;
         &lt;/ul&gt;
       &lt;/nav&gt;</code></pre><p>Now we have a functional language switcher.</p><h1 id="creating-about-page">Creating About Page</h1><p>The last page remaining is the About page. We&#x2019;ll keep it simple, with a title, an image, a paragraph, and a few team members. The <code>AboutSlice</code> looks like this: (Please refer to the first slice creation section if you have any questions or confusion regarding slicecreation).</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcMqi7hvr9mBKR56e2IA9GRSXIZJ8v9zmTxaEKE1Jibu2H6GjZoXFl8yF0xbAr961_U1zG4aYwnLeDjko12_K8JD9LwKm2SQZ9wxFdxr9UK0qs3wacOMYJGgHPhm9NcxInWMNrt?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1083"></figure><p></p><p>As usual, it will create a <code>src/slices/AboutSlice/index.tsx</code> file for Slice styling. Paste following code in this file:</p><pre><code class="language-JSX">import { FC } from &apos;react&apos;;
import { Content } from &apos;@prismicio/client&apos;;
import { PrismicRichText, SliceComponentProps } from &apos;@prismicio/react&apos;;
import Container from &apos;@/components/Container&apos;;
import { PrismicNextImage } from &apos;@prismicio/next&apos;;
/**
* Props for `AboutSlice`.
*/
export type AboutSliceProps = SliceComponentProps&lt;Content.AboutSliceSlice&gt;;
/**
* Component for &quot;AboutSlice&quot; Slices.
*/
const AboutSlice: FC&lt;AboutSliceProps&gt; = ({ slice }) =&gt; {
 return (
   &lt;Container
     data-slice-type={slice.slice_type}
     data-slice-variation={slice.variation}
   &gt;
     &lt;div className=&quot;grid grid-cols-1 gap-4 max-w-screen-lg m-auto&quot;&gt;
       &lt;h2 className=&quot;text-3xl&quot;&gt; {slice.primary.title}&lt;/h2&gt;
       &lt;PrismicNextImage
         field={slice.primary.about_image}
         className=&quot;w-fit rounded shadow-2xl&quot;
         width={400}
       /&gt;
       &lt;div className=&quot;my-10&quot;&gt;
         &lt;PrismicRichText field={slice.primary.about_description} /&gt;
       &lt;/div&gt;
       &lt;div className=&quot;grid grid-cols-1 md:grid-cols-4&quot;&gt;
         {slice.primary.team_members.map((item) =&gt; (
           &lt;div key={item.team_member_name}&gt;
             &lt;PrismicNextImage
               field={item.team_member_image}
               className=&quot;w-fit rounded shadow-2xl&quot;
               width={100}
             /&gt;
             &lt;div&gt;
               &lt;b&gt;{item.team_member_name}&lt;/b&gt;
             &lt;/div&gt;
             &lt;div&gt;{item.team_member_designation}&lt;/div&gt;
           &lt;/div&gt;
         ))}
       &lt;/div&gt;
     &lt;/div&gt;
   &lt;/Container&gt;
 );
};
export default AboutSlice;
</code></pre><p>Now add this slice in the Page type and push via GUI.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfU_zPTEMswfQal770YvE0d88f0F_YJ_G-14PA88zdBvWOlJarhXiKe9N2-Ton69Ilfusank4MPG-05Ly4kswU6Jeio0BMt5T4-LqXa0BTRaYBg7grM-YDfg8kUGhJ875a5TP5lCw?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1083"></figure><p>This is where the power of slices comes in. You don&#x2019;t need to do anything extra. Simply create a new page for the About section and use the new <code>AboutSlice</code>. No additional coding is required. The page will be created automatically, and the slice will appear as expected.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeuNWz48LwgmSUhb35PfspfQyVVUTp1nsLG0inOYWsOKMRbuJDAWOZC_p4UiJoBlR6PMChIDlSWCDRsc7nv5JZpk_NCQm1OC7IFZTZJidh3GVztdcy9objocmq2XyDE-qO5MyhE3A?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1083"></figure><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf40XtTjljCrfFKl-ETuMLPlX5NAypfIHkds0MHVmWXkdGP9hHWJHnbMNyA2FMwporCb_M80Lnec23fpOVDrP-R6QCDFHiHw-Yj0qNmOn1LbDgaUBDbszErsm_AEYQOR9X43gqmug?key=ocFzrFxdaUgHn6rB71HJld6l" class="kg-image" alt="Up and running with Prismic" loading="lazy" width="1600" height="1230"></figure><p><br>So this was a  simple website we created using NextJS, Prismic, and Tailwind. The project has been deployed in Vercel, you can access it via<a href="https://prismic-flower-catalog.vercel.app/?ref=blog.startappz.com"> <u>https://prismic-flower-catalog.vercel.app/</u></a></p><p>If you get stuck at any point, you can refer to the source code of the completed project source code:<a href="https://github.com/Dhruw/prismic-flower-catalog?ref=blog.startappz.com"> <u>https://github.com/Dhruw/prismic-flower-catalog</u></a></p><p>Give it a try and feel free to share your thoughts in the comments below!</p>]]></content:encoded></item><item><title><![CDATA[Two big wins where telecom operators gain with a partner like Startappz]]></title><description><![CDATA[Throughout my journey at Startappz, we worked with telecom operators to solve complex business and technical challenges. One thing I’ve learned is that partnering with a specialized company like Startappz offers telecoms a "distinct advantage" over working with typical software development houses.]]></description><link>https://blog.startappz.com/two-big-wins-where-telecom-operators-gain-with-a-partner-like-startappz/</link><guid isPermaLink="false">679216f46f62af5b595f384b</guid><category><![CDATA[telecom]]></category><category><![CDATA[service]]></category><category><![CDATA[apps]]></category><category><![CDATA[Digitalization]]></category><category><![CDATA[innovation]]></category><category><![CDATA[esim]]></category><category><![CDATA[IoT]]></category><category><![CDATA[solutions]]></category><category><![CDATA[growth]]></category><category><![CDATA[software]]></category><category><![CDATA[platforms]]></category><dc:creator><![CDATA[Ahmad Hajeer]]></dc:creator><pubDate>Thu, 23 Jan 2025 11:17:46 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/award.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/award.png" alt="Two big wins where telecom operators gain with a partner like Startappz"><p><br><em>Throughout my journey at Startappz, we worked with telecom operators to solve complex business and technical challenges. One thing I&#x2019;ve learned is that partnering with a specialized company like Startappz offers telecoms a &quot;distinct advantage&quot; over working with typical software development houses.&#xA0;&#xA0;</em></p><p>The telecom digital industry is complex, its success needs a deep understanding of: OSS/BSS systems, CRM systems, Network Management Platforms, VAS platforms, eSIM and Entitlement Management, Billing and Charging Systems, IoT and Connected Device Integrations, and more.</p><h2 id="with-this-expertise-two-big-wins-where-telecom-operators-gain-with-a-partner-like-startappz"><strong>With this expertise,&#xA0; two big wins where telecom operators gain with a partner like Startappz:&#xA0;&#xA0;</strong></h2><p></p><p><strong>&#x1F4CC; Seamless Integrations</strong></p><p>Telecom systems are intricate and interdependent. At Startappz, we ensure that every solution we develop integrates seamlessly. This minimizes disruption, optimizes efficiency, and accelerates ROI.&#xA0;&#xA0;</p><p><strong>&#x1F4CC; Accelerated Time-to-Market</strong></p><p>Speed is the game&apos;s name, especially in the highly competitive world of the telecom industry. With telecom processes, systems, and best practices already understood by Startappz, we can deliver solutions quickly and safely. Be it launching a new service or upgrading existing platforms, our speed allows operators to stay ahead of the game.&#xA0;</p><hr><h2 id="here-are-some-examples-of-how-our-expertise-translates-into-real-results-faster-than-what-i-have-ever-seen"><strong>Here are some examples of how our expertise translates into real results faster than what I have ever seen:&#xA0;&#xA0;</strong></h2><p></p><p><strong>&#x1F4CC; eSIM Entitlement for Wearable Devices</strong></p><p>We developed an entitlement server for frictionless eSIM activation on wearables, establishing the operator as the leader in the field of connected devices.&#xA0;&#xA0;</p><p><strong>&#x1F4CC;&#xA0; Building a new telecom digital Service from Scratch&#xA0;</strong></p><p>not once and from the ground, Startappz collaborated with a new telecom in launching their service. We designed future-proof platforms considering seamless integration and scalability based on their requirements.&#xA0;&#xA0;&#xA0;</p><p><strong>&#x1F4CC; Auction System for Vanity Numbers</strong></p><p>We developed a dedicated auction system for premium vanity numbers, helping operators earn additional revenue streams by creating interest among the customer base.</p><p><strong>&#x1F4CC; IoT Connectivity Solutions</strong></p><p>With growing market demand for IoT services, we assisted telecom operators in implementing scalable solutions for smart homes, automotive systems, and IoT in enterprises, creating new growth avenues for rapidly expanding sectors.</p><p><strong>&#x1F4CC; Multi-Device Bundling</strong></p><p>Through new revenue models, including shared plans across devices and premium VAS, we help operators boost ARPU while extending more value to customers.&#xA0;&#xA0;&#xA0;</p><hr><p><em>These examples illustrate that working with a company like Startappz is much more than software development, it is about the empowerment of telecom operators toward innovation, optimization, and strategic growth. When your partner knows your business back to front and their solutions come together in an optimized way to speed up results, that&apos;s when you open up possibilities way beyond technology.&#xA0;</em></p><p>To all telecom operators out there: If you require a partner to transform and thrive, we would be happy to get in touch and tell you more about what we can achieve together.</p>]]></content:encoded></item><item><title><![CDATA[تقليل الاجتماعات لتطوير المنتجات وزيادة الإنتاجية]]></title><description><![CDATA[أهمية تقليل الاجتماعات وتخصيص أيام خالية من الاجتماعات لتعزيز الإنتاجية والإبداع، مع تشجيع التواصل الفعّال عن بُعد وتحقيق توازن بين الجودة والإنتاجية.]]></description><link>https://blog.startappz.com/reducing-meetings-to-enhance-productivity/</link><guid isPermaLink="false">678e2a746f62af5b595f381f</guid><category><![CDATA[Productivity]]></category><category><![CDATA[Remote]]></category><category><![CDATA[meeting]]></category><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 20 Jan 2025 11:28:33 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/virtual-meeting-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/virtual-meeting-2.jpg" alt="&#x62A;&#x642;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x627;&#x62A; &#x644;&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x62C;&#x627;&#x62A; &#x648;&#x632;&#x64A;&#x627;&#x62F;&#x629; &#x627;&#x644;&#x625;&#x646;&#x62A;&#x627;&#x62C;&#x64A;&#x629;"><p>&#x641;&#x64A; &#x623;&#x62D;&#x62F; &#x627;&#x644;&#x645;&#x624;&#x62A;&#x645;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x64A; &#x62D;&#x636;&#x631;&#x62A;&#x647;&#x627; &#x645;&#x624;&#x62E;&#x631;&#x627;&#x64B; &#x62D;&#x648;&#x644; &#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x62C;&#x627;&#x62A; &#x60C; &#x62A;&#x645; &#x627;&#x644;&#x62A;&#x623;&#x643;&#x64A;&#x62F; &#x641;&#x64A; &#x627;&#x644;&#x639;&#x62F;&#x64A;&#x62F; &#x645;&#x646; &#x627;&#x644;&#x645;&#x62D;&#x627;&#x636;&#x631;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x623;&#x647;&#x645;&#x64A;&#x629; &#x62A;&#x62E;&#x635;&#x64A;&#x635; &#x623;&#x64A;&#x627;&#x645; &#x62E;&#x627;&#x644;&#x64A;&#x629; &#x645;&#x646; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x627;&#x62A; &#x644;&#x62A;&#x639;&#x632;&#x64A;&#x632; &#x627;&#x644;&#x646;&#x634;&#x627;&#x637; &#x648;&#x627;&#x644;&#x625;&#x646;&#x62A;&#x627;&#x62C;&#x64A;&#x629;. &#x64A;&#x648;&#x641;&#x631; &#x630;&#x644;&#x643; &#x641;&#x631;&#x635;&#x629; &#x644;&#x644;&#x62A;&#x62C;&#x631;&#x64A;&#x628;&#x60C; &#x648;&#x625;&#x62C;&#x631;&#x627;&#x621; &#x627;&#x644;&#x62A;&#x643;&#x631;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639;&#x629;&#x60C; &#x648;&#x627;&#x643;&#x62A;&#x633;&#x627;&#x628; &#x627;&#x644;&#x645;&#x639;&#x631;&#x641;&#x629;&#x60C; &#x648;&#x625;&#x62C;&#x631;&#x627;&#x621; &#x627;&#x644;&#x62A;&#x646;&#x642;&#x64A;&#x62D;&#x627;&#x62A;&#x60C; &#x645;&#x645;&#x627; &#x64A;&#x633;&#x647;&#x645; &#x641;&#x64A; &#x646;&#x647;&#x627;&#x64A;&#x629; &#x627;&#x644;&#x645;&#x637;&#x627;&#x641; &#x641;&#x64A; &#x62A;&#x642;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x62E;&#x627;&#x637;&#x631; &#x627;&#x644;&#x645;&#x631;&#x62A;&#x628;&#x637;&#x629; &#x628;&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x62C;&#x627;&#x62A;.</p><p>&#x644;&#x642;&#x62F; &#x62A;&#x623;&#x645;&#x644;&#x62A; &#x641;&#x64A; &#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x633;&#x647;&#x64A;&#x644; &#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x647;&#x630;&#x627; &#x627;&#x644;&#x647;&#x62F;&#x641; &#x628;&#x634;&#x643;&#x644; &#x623;&#x641;&#x636;&#x644; &#x644;&#x641;&#x631;&#x642;&#x646;&#x627; - &#x625;&#x630; &#x623;&#x646; &#x62A;&#x642;&#x644;&#x64A;&#x644; &#x639;&#x62F;&#x62F; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x627;&#x62A; &#x64A;&#x62A;&#x64A;&#x62D; &#x627;&#x644;&#x645;&#x632;&#x64A;&#x62F; &#x645;&#x646; &#x627;&#x644;&#x648;&#x642;&#x62A; &#x644;&#x644;&#x639;&#x645;&#x644; &#x627;&#x644;&#x641;&#x639;&#x644;&#x64A;. &#x648;&#x645;&#x639; &#x630;&#x644;&#x643;&#x60C; &#x623;&#x624;&#x645;&#x646; &#x628;&#x636;&#x631;&#x648;&#x631;&#x629; &#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x62A;&#x648;&#x627;&#x632;&#x646; &#x628;&#x64A;&#x646; &#x62A;&#x639;&#x632;&#x64A;&#x632; &#x627;&#x644;&#x625;&#x646;&#x62A;&#x627;&#x62C;&#x64A;&#x629;&#x60C; &#x648;&#x636;&#x645;&#x627;&#x646; &#x627;&#x644;&#x62C;&#x648;&#x62F;&#x629;&#x60C; &#x648;&#x62A;&#x639;&#x632;&#x64A;&#x632; &#x627;&#x644;&#x62A;&#x639;&#x644;&#x645;&#x60C; &#x648;&#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x627;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642;. &#x641;&#x647;&#x630;&#x647; &#x627;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x62A;&#x639;&#x62F; &#x645;&#x646; &#x627;&#x644;&#x641;&#x648;&#x627;&#x626;&#x62F; &#x627;&#x644;&#x645;&#x647;&#x645;&#x629; &#x627;&#x644;&#x62A;&#x64A; &#x62A;&#x646;&#x634;&#x623; &#x645;&#x646; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x648;&#x646; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x638;&#x645;&#x60C; &#x633;&#x648;&#x627;&#x621; &#x643;&#x627;&#x646; &#x630;&#x644;&#x643; &#x645;&#x646; &#x62E;&#x644;&#x627;&#x644; &#x627;&#x644;&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x645;&#x639; &#x627;&#x644;&#x641;&#x631;&#x64A;&#x642;&#x60C; &#x623;&#x648; &#x645;&#x646;&#x627;&#x642;&#x634;&#x629; &#x62A;&#x641;&#x627;&#x635;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x634;&#x643;&#x644;&#x627;&#x62A; &#x628;&#x634;&#x643;&#x644; &#x62C;&#x645;&#x627;&#x639;&#x64A;.</p><p>&#x625;&#x644;&#x64A;&#x643; &#x628;&#x639;&#x636; &#x627;&#x644;&#x62A;&#x648;&#x635;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x639;&#x645;&#x644;&#x64A;&#x629;:</p><ul><li><strong>&#x647;&#x644; &#x645;&#x646; &#x627;&#x644;&#x636;&#x631;&#x648;&#x631;&#x64A; &#x623;&#x646; &#x64A;&#x643;&#x648;&#x646; &#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x64B;&#x627;&#x61F;</strong> &#x646;&#x62D;&#x646; &#x641;&#x64A; &#x633;&#x62A;&#x627;&#x631;&#x62A; &#x622;&#x628;&#x632; &#x646;&#x639;&#x645;&#x644; &#x639;&#x646; &#x628;&#x64F;&#x639;&#x62F; &#x628;&#x634;&#x643;&#x644; &#x643;&#x627;&#x645;&#x644;&#x60C; &#x648;&#x63A;&#x627;&#x644;&#x628;&#x64B;&#x627; &#x645;&#x627; &#x646;&#x62A;&#x648;&#x632;&#x639; &#x639;&#x628;&#x631; &#x645;&#x646;&#x627;&#x637;&#x642; &#x632;&#x645;&#x646;&#x64A;&#x629; &#x645;&#x62E;&#x62A;&#x644;&#x641;&#x629;. &#x647;&#x644; &#x64A;&#x645;&#x643;&#x646; &#x627;&#x633;&#x62A;&#x628;&#x62F;&#x627;&#x644; &#x627;&#x644;&#x646;&#x642;&#x627;&#x634; &#x628;&#x633;&#x644;&#x633;&#x644;&#x629; &#x631;&#x633;&#x627;&#x626;&#x644; &#x639;&#x628;&#x631; Slack&#x61F; &#x647;&#x630;&#x627; &#x627;&#x644;&#x646;&#x647;&#x62C; &#x64A;&#x636;&#x645;&#x646; &#x627;&#x644;&#x634;&#x645;&#x648;&#x644;&#x64A;&#x629;&#x60C; &#x62D;&#x64A;&#x62B; &#x64A;&#x62A;&#x64A;&#x62D; &#x644;&#x644;&#x62C;&#x645;&#x64A;&#x639; &#x641;&#x631;&#x635;&#x629; &#x627;&#x644;&#x645;&#x633;&#x627;&#x647;&#x645;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x648;&#x642;&#x62A; &#x627;&#x644;&#x630;&#x64A; &#x64A;&#x646;&#x627;&#x633;&#x628;&#x647;&#x645;. &#x643;&#x645;&#x627; &#x64A;&#x648;&#x641;&#x631; &#x644;&#x644;&#x641;&#x631;&#x64A;&#x642; &#x645;&#x631;&#x62C;&#x639;&#x64B;&#x627; &#x648;&#x627;&#x636;&#x62D;&#x64B;&#x627; &#x64A;&#x645;&#x643;&#x646; &#x627;&#x644;&#x639;&#x648;&#x62F;&#x629; &#x625;&#x644;&#x64A;&#x647; &#x644;&#x645;&#x631;&#x627;&#x62C;&#x639;&#x629; &#x627;&#x644;&#x623;&#x641;&#x643;&#x627;&#x631; &#x648;&#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x627;&#x644;&#x648;&#x636;&#x648;&#x62D; &#x639;&#x646;&#x62F; &#x627;&#x644;&#x62D;&#x627;&#x62C;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x642;&#x628;&#x644; &#x627;&#x644;&#x642;&#x631;&#x64A;&#x628;.</li></ul><p></p><ul><li><strong>&#x627;&#x62C;&#x639;&#x644; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x627;&#x62A; &#x645;&#x62E;&#x62A;&#x635;&#x631;&#x629;</strong>&#x60C; &#x644;&#x643;&#x646; &#x644;&#x627; &#x62A;&#x62A;&#x631;&#x62F;&#x62F; &#x641;&#x64A; &#x645;&#x646;&#x627;&#x642;&#x634;&#x629; &#x627;&#x644;&#x62A;&#x641;&#x627;&#x635;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x647;&#x645;&#x629; &#x639;&#x646;&#x62F; &#x627;&#x644;&#x62D;&#x627;&#x62C;&#x629;. &#x641;&#x639;&#x646;&#x62F;&#x645;&#x627; &#x62A;&#x628;&#x62F;&#x623; &#x645;&#x624;&#x634;&#x631;&#x627;&#x62A; &#x639;&#x62F;&#x645; &#x627;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642; &#x623;&#x648; &#x627;&#x644;&#x639;&#x648;&#x627;&#x626;&#x642; &#x628;&#x627;&#x644;&#x638;&#x647;&#x648;&#x631; &#x62F;&#x627;&#x62E;&#x644; &#x627;&#x644;&#x641;&#x631;&#x64A;&#x642;&#x60C; &#x641;&#x625;&#x646; &#x62A;&#x631;&#x643;&#x647;&#x627; &#x62F;&#x648;&#x646; &#x645;&#x639;&#x627;&#x644;&#x62C;&#x629; &#x633;&#x64A;&#x632;&#x64A;&#x62F; &#x645;&#x646; &#x62A;&#x639;&#x642;&#x64A;&#x62F;&#x647;&#x627; &#x645;&#x639; &#x645;&#x631;&#x648;&#x631; &#x627;&#x644;&#x648;&#x642;&#x62A;&#x60C; &#x645;&#x645;&#x627; &#x64A;&#x624;&#x62F;&#x64A; &#x625;&#x644;&#x649; &#x645;&#x634;&#x643;&#x644;&#x627;&#x62A; &#x623;&#x643;&#x628;&#x631; &#x62A;&#x624;&#x62B;&#x631; &#x639;&#x644;&#x649; &#x627;&#x644;&#x643;&#x641;&#x627;&#x621;&#x629; &#x648;&#x62A;&#x633;&#x628;&#x628; &#x625;&#x647;&#x62F;&#x627;&#x631;&#x64B;&#x627; &#x625;&#x636;&#x627;&#x641;&#x64A;&#x64B;&#x627; &#x644;&#x644;&#x648;&#x642;&#x62A; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x642;&#x628;&#x644;. &#x62E;&#x635;&#x635; &#x648;&#x642;&#x62A;&#x64B;&#x627; &#x644;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642; &#x639;&#x644;&#x649; &#x627;&#x644;&#x631;&#x624;&#x64A;&#x629; &#x648;&#x627;&#x644;&#x646;&#x647;&#x62C; &#x644;&#x636;&#x645;&#x627;&#x646; &#x633;&#x644;&#x627;&#x633;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x639;&#x645;&#x644; &#x648;&#x62A;&#x62C;&#x646;&#x628; &#x647;&#x630;&#x647; &#x627;&#x644;&#x639;&#x642;&#x628;&#x627;&#x62A;.</li></ul><p></p><ul><li><strong>&#x62D;&#x62F;&#x62F; &#x62C;&#x62F;&#x648;&#x644; &#x623;&#x639;&#x645;&#x627;&#x644; &#x648;&#x627;&#x636;&#x62D;&#x64B;&#x627; &#x648;&#x646;&#x62A;&#x64A;&#x62C;&#x629; &#x645;&#x631;&#x62C;&#x648;&#x629; &#x644;&#x643;&#x644; &#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;</strong>. &#x62A;&#x62D;&#x645;&#x644; &#x645;&#x633;&#x624;&#x648;&#x644;&#x64A;&#x629; &#x62A;&#x62D;&#x642;&#x64A;&#x642; &#x647;&#x630;&#x627; &#x627;&#x644;&#x647;&#x62F;&#x641;&#x60C; &#x648;&#x634;&#x62C;&#x639; &#x627;&#x644;&#x622;&#x62E;&#x631;&#x64A;&#x646; &#x639;&#x644;&#x649; &#x627;&#x644;&#x627;&#x644;&#x62A;&#x632;&#x627;&#x645; &#x628;&#x646;&#x641;&#x633; &#x627;&#x644;&#x646;&#x647;&#x62C;! &#x627;&#x628;&#x62F;&#x623; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639; &#x628;&#x62A;&#x630;&#x643;&#x64A;&#x631; &#x627;&#x644;&#x62C;&#x645;&#x64A;&#x639; &#x628;&#x627;&#x644;&#x647;&#x62F;&#x641; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A; &#x644;&#x636;&#x645;&#x627;&#x646; &#x627;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642;. &#x641;&#x645;&#x646; &#x627;&#x644;&#x633;&#x647;&#x644; &#x62C;&#x62F;&#x64B;&#x627; &#x627;&#x644;&#x627;&#x646;&#x62D;&#x631;&#x627;&#x641; &#x639;&#x646; &#x627;&#x644;&#x645;&#x633;&#x627;&#x631;. &#x62A;&#x623;&#x643;&#x62F; &#x645;&#x646; &#x62F;&#x62E;&#x648;&#x644;&#x643; &#x644;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639; &#x628;&#x62E;&#x637;&#x629; &#x648;&#x627;&#x636;&#x62D;&#x629; &#x648;&#x627;&#x644;&#x62E;&#x631;&#x648;&#x62C; &#x645;&#x646;&#x647; &#x628;&#x646;&#x62A;&#x64A;&#x62C;&#x629; &#x645;&#x644;&#x645;&#x648;&#x633;&#x629;&#x60C; &#x623;&#x648; &#x639;&#x644;&#x649; &#x627;&#x644;&#x623;&#x642;&#x644; &#x628;&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x639;&#x645;&#x644;&#x64A;&#x629; &#x62A;&#x627;&#x644;&#x64A;&#x629; &#x64A;&#x62A;&#x645; &#x627;&#x644;&#x627;&#x62A;&#x641;&#x627;&#x642; &#x639;&#x644;&#x64A;&#x647;&#x627;.</li></ul><p></p><ul><li><strong>&#x627;&#x644;&#x62D;&#x636;&#x648;&#x631; &#x627;&#x62E;&#x62A;&#x64A;&#x627;&#x631;&#x64A;. </strong>&#x62F;&#x639; &#x627;&#x644;&#x62D;&#x627;&#x636;&#x631;&#x64A;&#x646; &#x64A;&#x642;&#x631;&#x631;&#x648;&#x646; &#x628;&#x623;&#x646;&#x641;&#x633;&#x647;&#x645; &#x645;&#x627; &#x625;&#x630;&#x627; &#x643;&#x627;&#x646;&#x648;&#x627; &#x628;&#x62D;&#x627;&#x62C;&#x629; &#x644;&#x62D;&#x636;&#x648;&#x631; &#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639; &#x645;&#x639;&#x64A;&#x646;. &#x627;&#x644;&#x641;&#x631;&#x642; &#x627;&#x644;&#x645;&#x62A;&#x641;&#x627;&#x639;&#x644;&#x629; &#x633;&#x62A;&#x62A;&#x62E;&#x630; &#x627;&#x644;&#x642;&#x631;&#x627;&#x631; &#x627;&#x644;&#x623;&#x646;&#x633;&#x628; &#x644;&#x647;&#x645; &#x648;&#x644;&#x639;&#x628;&#x621; &#x639;&#x645;&#x644;&#x647;&#x645;. &#x62B;&#x642; &#x641;&#x64A; &#x641;&#x631;&#x64A;&#x642; &#x627;&#x644;&#x639;&#x645;&#x644;.&#xA0;</li></ul><p></p><ul><li><strong>&#x633;&#x639;&#x627;&#x62F;&#x629; &#x627;&#x644;&#x641;&#x631;&#x642; &#x623;&#x645;&#x631; &#x628;&#x627;&#x644;&#x63A; &#x627;&#x644;&#x623;&#x647;&#x645;&#x64A;&#x629; &#x623;&#x64A;&#x636;&#x64B;&#x627;</strong>! &#x641;&#x627;&#x644;&#x641;&#x631;&#x642; &#x627;&#x644;&#x633;&#x639;&#x64A;&#x62F;&#x629; &#x623;&#x643;&#x62B;&#x631; &#x625;&#x646;&#x62A;&#x627;&#x62C;&#x64A;&#x629; &#x628;&#x646;&#x633;&#x628;&#x629; 12%&#x60C; &#x648;&#x628;&#x64A;&#x626;&#x629; &#x627;&#x644;&#x639;&#x645;&#x644; &#x627;&#x644;&#x625;&#x64A;&#x62C;&#x627;&#x628;&#x64A;&#x629; &#x62A;&#x639;&#x632;&#x632; &#x627;&#x644;&#x625;&#x628;&#x62F;&#x627;&#x639; &#x628;&#x645;&#x642;&#x62F;&#x627;&#x631; &#x62B;&#x644;&#x627;&#x62B;&#x629; &#x623;&#x636;&#x639;&#x627;&#x641;&#x60C; &#x645;&#x645;&#x627; &#x64A;&#x633;&#x627;&#x647;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x632;&#x64A;&#x62F; &#x645;&#x646; &#x627;&#x644;&#x627;&#x628;&#x62A;&#x643;&#x627;&#x631; &#x648;&#x62D;&#x644; &#x627;&#x644;&#x645;&#x634;&#x643;&#x644;&#x627;&#x62A;&#x61B; &#x648;&#x643;&#x644;&#x627;&#x647;&#x645;&#x627; &#x645;&#x646; &#x627;&#x644;&#x639;&#x648;&#x627;&#x645;&#x644; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x641;&#x64A; &#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x62C;&#x627;&#x62A;. &#x62E;&#x635;&#x635; &#x648;&#x642;&#x62A;&#x64B;&#x627; &#x644;&#x644;&#x62A;&#x648;&#x627;&#x635;&#x644; &#x627;&#x644;&#x645;&#x646;&#x62A;&#x638;&#x645;&#x60C; &#x627;&#x644;&#x627;&#x62E;&#x62A;&#x64A;&#x627;&#x631;&#x64A;&#x60C; &#x648;&#x63A;&#x64A;&#x631; &#x627;&#x644;&#x631;&#x633;&#x645;&#x64A; &#x628;&#x64A;&#x646; &#x623;&#x639;&#x636;&#x627;&#x621; &#x627;&#x644;&#x641;&#x631;&#x64A;&#x642;. &#x628;&#x627;&#x644;&#x646;&#x633;&#x628;&#x629; &#x644;&#x644;&#x641;&#x631;&#x642; &#x627;&#x644;&#x628;&#x639;&#x64A;&#x62F;&#x629;&#x60C; &#x623;&#x648;&#x635;&#x64A; &#x628;&#x627;&#x644;&#x628;&#x62F;&#x621; &#x628;&#x643;&#x627;&#x633;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x644;&#x64A;&#x62F; &#x645;&#x631;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x623;&#x633;&#x628;&#x648;&#x639; &#x641;&#x64A; &#x628;&#x62F;&#x627;&#x64A;&#x629; &#x627;&#x644;&#x627;&#x62C;&#x62A;&#x645;&#x627;&#x639;&#x627;&#x62A; &#x627;&#x644;&#x627;&#x633;&#x62A;&#x631;&#x62C;&#x627;&#x639;&#x64A;&#x629;. &#x643;&#x645;&#x627; &#x64A;&#x645;&#x643;&#x646;&#x643; &#x62A;&#x62C;&#x631;&#x628;&#x629; &#x645;&#x643;&#x627;&#x644;&#x645;&#x629; &#x645;&#x62F;&#x62A;&#x647;&#x627; 15 &#x62F;&#x642;&#x64A;&#x642;&#x629; &#x639;&#x62F;&#x629; &#x645;&#x631;&#x627;&#x62A; &#x641;&#x64A; &#x627;&#x644;&#x623;&#x633;&#x628;&#x648;&#x639;&#x60C; &#x644;&#x64A;&#x62A;&#x645;&#x643;&#x646; &#x627;&#x644;&#x623;&#x639;&#x636;&#x627;&#x621; &#x645;&#x646; &#x627;&#x644;&#x627;&#x646;&#x636;&#x645;&#x627;&#x645; &#x648;&#x627;&#x644;&#x62F;&#x631;&#x62F;&#x634;&#x629; &#x628;&#x634;&#x643;&#x644; &#x63A;&#x64A;&#x631; &#x631;&#x633;&#x645;&#x64A;.</li></ul>]]></content:encoded></item><item><title><![CDATA[Hitting the Road: My Digital Nomad Kit & Coworking Space Confessions]]></title><description><![CDATA[<p>So, you&apos;re thinking of ditching the desk for the open road? Welcome to the digital nomad life! It&apos;s a thrilling adventure, but let&apos;s be real, finding the perfect work-from-anywhere setup can be a bit of a rollercoaster.</p><p><strong>Packing Light: My Minimalist Nomad Kit</strong></p><p>First</p>]]></description><link>https://blog.startappz.com/the-digital-nomad-startappz/</link><guid isPermaLink="false">67849a226f62af5b595f37c6</guid><dc:creator><![CDATA[Moski]]></dc:creator><pubDate>Mon, 13 Jan 2025 06:23:48 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/shutterstock_traveling-person-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/shutterstock_traveling-person-1.jpg" alt="Hitting the Road: My Digital Nomad Kit &amp; Coworking Space Confessions"><p>So, you&apos;re thinking of ditching the desk for the open road? Welcome to the digital nomad life! It&apos;s a thrilling adventure, but let&apos;s be real, finding the perfect work-from-anywhere setup can be a bit of a rollercoaster.</p><p><strong>Packing Light: My Minimalist Nomad Kit</strong></p><p>First things first: your gear. You need the essentials, but you don&apos;t want to lug around a suitcase full of gadgets. My must-haves?</p><ul><li><strong>My trusty laptop:</strong>&#xA0;The heart of my operation. I chose a lightweight beast that can handle anything I throw at it.</li><li><strong>Noise-canceling headphones:</strong>&#xA0;Seriously, a lifesaver in bustling cafes and noisy coworking spaces.</li><li><strong>Portable charger:</strong>&#xA0;Because let&apos;s face it, finding a reliable outlet can be a game of chance.</li><li><strong>A tiny travel router:</strong>&#xA0;For those sketchy hotel Wi-Fi situations (you know the ones).</li><li><strong>A universal travel adapter:</strong>&#xA0;So I can charge my stuff anywhere on the planet.</li><li><strong>A comfortable backpack:</strong>&#xA0;To carry it all in style (and comfort!).</li></ul><p></p><p><strong>Coworking Spaces: The Good, the Bad, and the Ugly</strong></p><p>Coworking spaces can be amazing &#x2013; a community vibe, a change of scenery, and sometimes even free coffee. But let&apos;s not sugarcoat it:</p><ul><li><strong>The Noise:</strong>&#xA0;Background chatter, loud phone calls, and even the&#xA0;<em>click-clack</em>&#xA0;of keyboards can be seriously distracting.</li><li><strong>The &quot;Open Office&quot; Dilemma:</strong>&#xA0;Confidentiality? What&apos;s that?</li><li><strong>The Google Review Gamble:</strong>&#xA0;You never really know what you&apos;re getting into until you&apos;re already there.</li><li><strong>The &quot;Perfect Spot&quot; Quest:</strong>&#xA0;Finding the sweet spot with good Wi-Fi, comfy seating, and enough privacy is a constant battle.</li></ul><p><strong>Tips for Surviving the Nomad Life:</strong></p><ul><li><strong>Pack light, travel smart:</strong>&#xA0;Embrace the minimalist lifestyle. You&apos;ll thank yourself later.</li><li><strong>Cloud storage is your friend:</strong>&#xA0;Keep your files online and free up space on your devices.</li><li><strong>Digital tools are your secret weapons:</strong>&#xA0;From project management apps to video conferencing platforms, there&apos;s a tool for everything.</li></ul><hr><h2 id="our-recommended-equipment">Our Recommended Equipment</h2><figure class="kg-card kg-image-card"><img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/b20d6d097590058b010fb5a7b75970c9.jpeg" class="kg-image" alt="Hitting the Road: My Digital Nomad Kit &amp; Coworking Space Confessions" loading="lazy" width="2000" height="781"></figure><p><strong>Over-the-ear headphones</strong>; <a href="https://stpz.co/3DSREad?ref=blog.startappz.com" rel="noreferrer">WH-1000XM5 Wireless Noise Cancelling Headphones</a></p><p></p><figure class="kg-card kg-image-card"><img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/613a-3jtieL._AC_UF1000-1000_QL80_.jpg" class="kg-image" alt="Hitting the Road: My Digital Nomad Kit &amp; Coworking Space Confessions" loading="lazy" width="1000" height="775"></figure><p><strong>Rechargeable mouse</strong>; Logitech Mx Master 3s</p><figure class="kg-card kg-image-card"><img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/All-Sides.jpg" class="kg-image" alt="Hitting the Road: My Digital Nomad Kit &amp; Coworking Space Confessions" loading="lazy" width="1080" height="900"></figure><p><strong>Tech Bag; </strong><a href="https://stpz.co/40gCdjH?ref=blog.startappz.com" rel="noreferrer">TECH FOLIO BACKPACK</a></p><p></p><figure class="kg-card kg-image-card"><img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/Battery.png" class="kg-image" alt="Hitting the Road: My Digital Nomad Kit &amp; Coworking Space Confessions" loading="lazy" width="578" height="390"></figure><p><strong>Battery pack;</strong> UGREEN Nexode 140W 25,000mAh</p><p><strong>Data;</strong>&#xA0;eSim or local SIM Card</p><p></p><p><em>At the time of writing, I have no affiliation with any of these products. They work for me</em>.</p>]]></content:encoded></item><item><title><![CDATA[Pioneering a First-of-Its-Kind Innovation in the UAE!]]></title><description><![CDATA[<p>Startappz successfully implemented facial recognition technology for instant eSIM activation for tourists, the first solution to be launched in the UAE!<br>This revolutionary feature enables tourists to digitally activate their eSIM before even leaving the airport. A real game changer for delivering secure, seamless, and innovative mobile experiences on the</p>]]></description><link>https://blog.startappz.com/pioneering-a-first-of-its-kind-innovation-in-the-uae/</link><guid isPermaLink="false">677baea46f62af5b595f37b2</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Wed, 08 Jan 2025 05:28:27 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/esimblog.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2025/01/esimblog.png" alt="Pioneering a First-of-Its-Kind Innovation in the UAE!"><p>Startappz successfully implemented facial recognition technology for instant eSIM activation for tourists, the first solution to be launched in the UAE!<br>This revolutionary feature enables tourists to digitally activate their eSIM before even leaving the airport. A real game changer for delivering secure, seamless, and innovative mobile experiences on the go!</p><p>What we&#x2019;ve accomplished:</p><ul><li>Integrating with UAE Ministry of Interior systems, which guarantees essential integration to sync up-to-date tourist details to be used for activation<br></li><li>Working with authorities with the end goal of getting full compliance while pushing boundaries for innovations.<br></li><li>App and web friendly flow to make sure users can join and activate their eSIM in a couple of minutes.</li></ul><p>This will constitute a landmark creating an unmatched benchmark for telecom innovations in the UAE hence showing the importance of uniting cutting-edge technology with customer-centric designing.At Startappz, we strive for our market to empower redefining industries by creating phenomenal digital experiences.</p>]]></content:encoded></item><item><title><![CDATA[App Development]]></title><description><![CDATA[Explore the pros and cons of Native Apps, PWAs, Cross-Platform solutions, and App Builders to find the perfect fit for your next mobile project.]]></description><link>https://blog.startappz.com/app-development/</link><guid isPermaLink="false">674434cf6f62af5b595f36f6</guid><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Tue, 26 Nov 2024 05:47:58 GMT</pubDate><media:content url="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2024/11/banner.png" medium="image"/><content:encoded><![CDATA[<img src="https://startappz-blog.nyc3.cdn.digitaloceanspaces.com/blog/2024/11/banner.png" alt="App Development"><p>Starting a new project and wondering which tech stack to use? Native, PWA, web app builders, or maybe an AI-powered solution?</p>
<p>At StartAppz, we&#x2019;ve tested various technologies to help you assess your needs. Let&#x2019;s take you on a journey through the pros and cons of each option and where they shine.</p>
<hr><h4 id="app-builder-websites"><strong>App Builder Websites</strong></h4>
<p><strong>Pros:</strong></p>
<ul>
<li><strong>Fast Development:</strong> Pre-designed templates and drag-and-drop interfaces make it quick to create an app.</li>
<li><strong>No Programming Knowledge Required (Sometimes):</strong> Platforms like <strong>Adalo</strong>, <strong>Thunkable</strong>, or <strong>Glide</strong> allow non-developers to build apps.</li>
<li><strong>Great for MVPs:</strong> Ideal for testing an idea before committing to full development.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li><strong>Locked-in Solution:</strong> Most platforms don&#x2019;t allow you to export source code (e.g., Glide apps are bound to Glide&#x2019;s infrastructure).</li>
<li><strong>Limited Features:</strong> Complex features, like advanced machine learning, are often unsupported.</li>
<li><strong>Custom Code is Limited:</strong> For example, while Bubble supports some plugins, it doesn&#x2019;t allow deep customization like direct code.</li>
</ul>
<p><strong>Technical Example:</strong></p>
<p>If you use <strong><a href="https://thunkable.com/?ref=blog.startappz.com">Thunkable</a></strong>, creating a form app can be done in hours, but adding offline capabilities or custom animations will require switching to native development.</p>
<hr><h4 id="custom-pwa-progressive-web-apps"><strong>Custom PWA (Progressive Web Apps)</strong></h4>
<p><strong>Pros:</strong></p>
<ul>
<li><strong>Cost-effective:</strong> Uses web technologies like HTML, CSS, and JavaScript to create apps that work on multiple platforms.</li>
<li><strong>Cross-platform:</strong> A single codebase runs on browsers, desktops, and mobiles.</li>
<li><strong>SEO-Friendly:</strong> Since PWAs are web-based, search engines can index them, which is helpful for discoverability.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li><strong>Limited Access to Native Features:</strong> PWAs don&#x2019;t have full access to device APIs, like Bluetooth or NFC. Visit <a href="https://whatpwacando.today/?ref=blog.startappz.com">What PWA Can Do Today</a> for a detailed list.</li>
<li><strong>Limited User Engagement:</strong> PWAs rely on browser-based push notifications, which are less engaging than native ones.</li>
<li><strong>Relatively New:</strong> Features like the <strong>Web Share API</strong> or <strong>File System Access API</strong> aren&#x2019;t fully supported across all browsers, especially Safari on iOS.</li>
</ul>
<p><strong>Technical Example:</strong></p>
<p>PWAs like <strong>Twitter Lite</strong> offer fast performance but don&#x2019;t support high-end features like offline video processing.</p>
<hr><h4 id="native-apps"><strong>Native Apps</strong></h4>
<p><strong>Pros:</strong></p><ul><li><strong>Fast &amp; Efficient:</strong> Written directly in platform languages like Kotlin (Android) or Swift (iOS), native apps can utilize device hardware like GPUs for smooth performance.</li><li><strong>Polished UX:</strong> Native UI components look and feel like they belong on the platform.</li><li><strong>High Performance:</strong> Ideal for graphics-intensive tasks like gaming or video editing.</li></ul><p><strong>Cons:</strong></p><ul><li><strong>Slower Development:</strong> Separate teams are required for Android and iOS, increasing time.</li><li><strong>Maintenance Costs:</strong> Regular updates are needed to stay compatible with OS changes.</li><li><strong>Higher Costs:</strong> Typically requires larger budgets for development and ongoing support.</li></ul><p><strong>Technical Example:</strong><br><br>A <strong>Telco App</strong> like <a href="https://www.virginmobile.ae/app/?ref=blog.startappz.com" rel="noreferrer"><strong>Virgin Mobile UAE</strong></a> is developed natively because it requires high performance, real-time synchronization, and low latency, and plenty of customization.</p><hr><h4 id="cross-platform-native-apps"><strong>Cross-Platform Native Apps</strong></h4>
<p><strong>Pros:</strong></p><ul><li><strong>Write Once, Deploy Everywhere:</strong> Frameworks like <strong>Flutter</strong>, <strong>React Native</strong>, and <strong>Kotlin Multiplatform</strong> reduce time by sharing code across platforms.</li><li><strong>Cost-efficient:</strong> Shared codebase reduces development costs significantly.</li></ul><p><strong>Cons:</strong></p><ul><li><strong>Platform-independent UX:</strong> It may not feel truly native to users. For instance, React Native apps often use custom navigation patterns.</li><li><strong>Performance Glitches:</strong> Some frameworks, like React Native, can introduce performance issues with heavy animations or hardware access.</li></ul><p><strong>Technical Example:</strong><br><br>Apps like <strong>Facebook Ads Manager</strong> (React Native) and <strong>Google Ads</strong> (Flutter) balance the trade-offs of cross-platform development for business apps.</p><hr><h3 id="when-to-use-native-apps-pwa-or-app-builders">When to Use Native Apps, PWA, or App Builders<br></h3><ul><li><strong>App Builders:</strong> Ideal for <strong>prototyping</strong> or creating a lightweight app with basic functionality.<br><br><strong>Use Case:</strong> A small business creating a catalog or content app.<br></li><li><strong>PWA:</strong> Best when you need to go to market quickly, have a limited budget, or focus on discoverability.<br><br><strong>Use Case:</strong> News/media apps (e.g., <strong>The Washington Post</strong>), lightweight e-commerce (e.g., <strong>AliExpress PWA</strong>), or travel guides.<br></li><li><strong>Native Apps:</strong> For polished, complex apps that leverage device features like sensors, cameras, or AR/VR.<br><br><strong>Use Case:</strong> Gaming apps, fintech apps (e.g., <strong>Robinhood</strong>), or social media apps (e.g., <strong>Snapchat</strong>).<br></li><li><strong>Cross-Platform Apps:</strong> When aiming to reduce costs while maintaining moderate performance and UX.<br><br><strong>Use Case:</strong> Business tools, social media apps, or shopping apps like <strong>Shopify</strong>.</li></ul><hr><h3 id="deep-dive-app-builders-pwa-cross-platform-or-native">Deep Dive: App Builders, PWA, Cross-Platform or Native?</h3><p>When developing a mobile app, the choice of technology can drastically affect your app&apos;s cost, UX and performance.</p><hr><h4 id="app-builder-websites"><strong>App Builder Websites</strong></h4><p>Platforms like <strong>Adalo</strong>, <strong>Thunkable</strong>, and <strong>Glide</strong> allow rapid app creation using drag-and-drop interfaces. However, these platforms abstract away the code, limiting flexibility.</p>
<p><strong>Technical Limitation Example:</strong> If you want to add an <strong>offline caching mechanism</strong>, app builders typically don&#x2019;t allow access to native APIs like <code>Room</code> (Android) or <code>Core Data</code> (iOS).</p>
<hr><h4 id="custom-pwas-progressive-web-apps"><strong>Custom PWAs (Progressive Web Apps)</strong></h4><p>PWAs use standard web technologies but can mimic native apps via features like service workers and Web APIs. They&#x2019;re ideal for apps that don&#x2019;t rely on intensive hardware.</p><p><strong>Key Features:</strong></p>
<ol>
<li><strong>Service Workers</strong> for offline capabilities.</li>
<li><strong>Manifest.json</strong> for app-like appearance and installability.</li>
</ol>
<p><strong>PWA Code Snippet:</strong></p>
<pre><code class="language-javascript">// Service Worker for caching assets
self.addEventListener(&apos;install&apos;, (event) =&gt; {
  event.waitUntil(
    caches.open(&apos;static-v1&apos;).then((cache) =&gt; {
      return cache.addAll([&apos;/index.html&apos;, &apos;/styles.css&apos;, &apos;/app.js&apos;]);
    })
  );
});

self.addEventListener(&apos;fetch&apos;, (event) =&gt; {
  event.respondWith(
    caches.match(event.request).then((response) =&gt; {
      return response || fetch(event.request);
    })
  );
});

</code></pre>
<p><br>
<strong>Technical Limitation Example:</strong> PWAs cannot access hardware features like <strong>Bluetooth</strong> or <strong>Sensors</strong>. For instance, a Health app requiring access to health data and sensors is better suited for native development.</p>
<hr><h4 id="native-apps"><strong>Native Apps</strong></h4>
<p>Native apps are developed using platform-specific languages like <strong>Kotlin/Java</strong> for Android and <strong>Swift/Objective-C</strong> for iOS. They provide unmatched performance and access to hardware features.</p>
<p><strong>Technical Comparison: Push Notifications</strong><br>
<br>
Native apps handle push notifications through platform-specific services like <strong>Firebase Cloud Messaging (FCM)</strong> for Android and <strong>APNs</strong> for iOS.</p>
<p><strong>Android (Native Push Notification Example):</strong></p>
<pre><code class="language-kotlin">// Firebase Messaging Service
class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        val notification = NotificationCompat.Builder(this, &quot;CHANNEL_ID&quot;)
            .setContentTitle(remoteMessage.notification?.title)
            .setContentText(remoteMessage.notification?.body)
            .setSmallIcon(R.drawable.ic_notification)
            .build()

        NotificationManagerCompat.from(this).notify(1, notification)
    }
}

</code></pre>
<p><br>
<strong>iOS (Swift Push Notification Example):</strong></p>
<pre><code class="language-swift">// Register for notifications in AppDelegate
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: &quot;%02.2hhx&quot;, $0) }.joined()
    print(&quot;APNs token: \(token)&quot;)
}

</code></pre>
<hr><h4 id="cross-platform-native-apps"><strong>Cross-Platform Native Apps</strong></h4>
<p>Cross-platform frameworks like <strong>React Native</strong>, <strong>Flutter</strong>, and <strong>Kotlin Multiplatform (KMP)</strong> aim to reduce development time while achieving near-native performance.</p>
<h5 id="react-native"><strong>React Native</strong></h5>
<p>React Native uses <strong>JavaScript</strong> with a native bridge to render UI components. It&#x2019;s a good choice for simple business apps.<br>
<br>
<strong>React Native Code Snippet:</strong></p>
<pre><code class="language-javascript">import React from &apos;react&apos;;
import { View, Text, Button } from &apos;react-native&apos;;

export default function App() {
  return (
    &lt;View style={{ padding: 20 }}&gt;
      &lt;Text&gt;Hello, React Native!&lt;/Text&gt;
      &lt;Button title=&quot;Click Me&quot; onPress={() =&gt; alert(&apos;Button Pressed&apos;)} /&gt;
    &lt;/View&gt;
  );
}
</code></pre>
<p><br>
<strong>Limitation Example:</strong><br>
React Native can introduce performance bottlenecks in animation-heavy apps because of the bridge between JavaScript and native threads. Frameworks like Flutter bypass this by compiling directly to native code.</p>
<hr><h5 id="flutter"><strong>Flutter</strong></h5>
<p>Flutter uses <strong>Dart</strong> and offers a rich set of widgets for customizable UIs. It&#x2019;s more performant than React Native for animations and graphical interfaces.</p>
<p><strong>Flutter Code Snippet:</strong></p>
<pre><code class="language-dart">import &apos;package:flutter/material.dart&apos;;

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(&quot;Flutter App&quot;)),
        body: Center(
          child: ElevatedButton(
            onPressed: () =&gt; print(&quot;Button Pressed&quot;),
            child: Text(&quot;Click Me&quot;),
          ),
        ),
      ),
    );
  }
}

</code></pre>
<p><br>
<strong>Use Case Example:</strong><br>
The <strong>Google Ads</strong> app was rebuilt using Flutter to take advantage of its smooth animations and faster updates.</p>
<hr><h5 id="kotlin-multiplatform-kmp"><strong>Kotlin Multiplatform (KMP)</strong></h5>
<p>KMP allows sharing business logic across platforms while writing native UI for each. This strikes a balance between code sharing and native experience. Also, Compose UI can be used to write single UI for all framework.</p>
<p><strong>KMP Code Snippet (Shared Logic):</strong></p>
<pre><code class="language-kotlin">
class ApiService() {  
    private val httpClient: HttpClient = HttpClient {
        install(ContentNegotiation) {
            json(get())
        }
    }

    fun fetchDashboard(): Flow&lt;List&lt;DashboardItem&gt;&gt; {  
	    return flow {  
			val response = httpClient.get(&quot;${BuildConfig.API_URL}/dashboard&quot;)  
			emit(response.body())  
		}  
	} 
}
</code></pre>
<p>To use <code>ApiService</code> in iOS, we can export all network/data layer as framweork and import it in xcode.</p>
<p><strong>Native-Specific Code (iOS):</strong></p>
<pre><code class="language-swift">
class DashboardViewModel : ObservableObject {
    @Published var items: [DashboardItem] = []
    
    private let apiService = ApiService()
    
    func loadDashboard() {
        apiService.fetchDashboard { items in
            if let items = items {
                self.items = items
            }
        }
    }
}

struct DashboardUIView: View {
    
    @ObservedObject var viewModel = DashboardViewModel()
    
    let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale.current
        formatter.dateFormat = &quot;dd/MM/yyyy - HH:mm&quot;
        return formatter
    }()

    var body: some View {
        NavigationStack {
               List(viewModel.items) { item in
                   HStack {
                       AsyncImage(url: URL(string: item.avatar)) { phase in
                           switch phase {
                           case .empty:
                               ProgressView().frame(width: 50, height: 50)
                           case .success(let image):
                               image
                                   .resizable()
                                   .clipShape(Circle())
                                   .frame(width: 50, height: 50)
                           case .failure(_):
                               Circle()
                                   .fill(Color.gray)
                                   .frame(width: 50, height: 50)
                                   .overlay {
                                       Text(&quot;X&quot;).foregroundColor(.white)
                                   }
                           @unknown default:
                               EmptyView()
                           }
                       }

                       VStack(alignment: .leading) {
                           Text(item.name)
                               .font(.headline)
                           
                           Text(String(format: NSLocalizedString(&quot;lbl_created_at&quot;, comment: &quot;&quot;), dateFormatter.string(from: item.createdAt)))
                               .font(.subheadline)
                               .foregroundColor(.gray)
                       }
                   }
               }
               .navigationTitle(title)
               .onAppear {
                   viewModel.loadDashboard()
               }
           }
       }
}
</code></pre>
<p><strong>Native-Specific Code (Android):</strong></p>
<pre><code class="language-kotlin">class DashboardViewModel(
    dashboardRepository: DashboardRepository,
) : ViewModel() {

    val state = dashboardRepository.dashboardList()
        .map { items -&gt; MainState.Success(items) }
        .catch { MainState.Error }
        .stateIn(
            scope = viewModelScope,
            started = SharingStarted.WhileSubscribed(5_000),
            initialValue = MainState.Loading
        )
}

sealed class MainState {
    data object Loading : MainState()
    data class Success(val items: List&lt;DashboardItem&gt;) : MainState()
    data object Error : MainState()
}

@Composable
fun DashboardScreen(
    viewModel: DashboardViewModel,
) {

    val state by viewModel.state.collectAsStateWithLifecycle()

    when (state) {
        MainState.Error -&gt; // show error
        MainState.Loading -&gt; // show loading
        is MainState.Success -&gt; ListContent(
            list = (state as MainState.Success).items,
        )
    }
}


@Composable
fun ListContent(
    modifier: Modifier = Modifier,
    list: List&lt;DashboardItem&gt;
) {
    LazyColumn(
        modifier = modifier.fillMaxSize().padding(16.dp)
    ) {
        items(list) { item -&gt;
            Row(modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp)) {
                AsyncImage(
                    modifier = Modifier.clip(CircleShape).size(50.dp),
                    model = item.avatar,
                    contentDescription = item.name,
                    placeholder = painterResource(R.drawable.placeholder),
                    error = painterResource(R.drawable.placeholder),
                )

                Spacer(Modifier.width(10.dp))

                Column {
                    Text(
                        text = item.name,
                        textAlign = TextAlign.Start,
                        style = MaterialTheme.typography.titleMedium
                    )
                    Text(
                        text = item.createdAt,
                        style = MaterialTheme.typography.bodySmall,
                        color = MaterialTheme.colorScheme.outline
                    )
                }
            }
        }
    }
}
</code></pre>
<blockquote>
<p>In addition to use native UI systems, we can use CMP <a href="https://www.jetbrains.com/compose-multiplatform/?ref=blog.startappz.com">Compose UI multiplatform</a>, which is based on Android Compose UI to share the UI as well. Note that, CMP in beta for iOS and experimental for Web.</p>
</blockquote>
<p><strong>Using Expect / Actual</strong></p>
<p>KMP offers expect/actual mechanism to write platform specific code, for example to get the screen width;</p>
<p>KMP code (shared)</p>
<pre><code class="language-kotlin">expect fun getScreenWidth(): Dp
</code></pre>
<p><strong>Android Source code</strong></p>
<pre><code class="language-kotlin">actual fun getScreenWidth(): Dp = LocalConfiguration.current.screenWidthDp.dp
</code></pre>
<p><strong>iOS Source code</strong></p>
<pre><code class="language-swift">actual fun getScreenWidth(): Dp = LocalWindowInfo.current.containerSize.width.pxToPoint().dp
</code></pre>
<p><strong>Use Case Example:</strong><br>
<strong>Netflix</strong> uses KMP to share caching and analytics code between its Android and iOS apps.</p>
<hr><h3 id="comparative-table-pwa-vs-native-vs-cross-platform"><strong>Comparative Table: PWA vs Native vs Cross-Platform</strong></h3>

<!--kg-card-begin: html-->
<table style="border-collapse: separate; border-spacing: 15px; width: 100%;">
  <thead>
    <tr>
      <th style="padding: 8px;">Feature</th>
      <th style="padding: 8px;">PWA</th>
      <th style="padding: 8px;">Native</th>
      <th style="padding: 8px;">Cross-Platform</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Performance</td>
      <td style="padding: 8px;">Moderate</td>
      <td style="padding: 8px;">High</td>
      <td style="padding: 8px;">Moderate-High</td>
    </tr>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Access to Hardware</td>
      <td style="padding: 8px;">Limited</td>
      <td style="padding: 8px;">Full</td>
      <td style="padding: 8px;">Partial (depends on framework)</td>
    </tr>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Development Cost</td>
      <td style="padding: 8px;">Low</td>
      <td style="padding: 8px;">High</td>
      <td style="padding: 8px;">Moderate</td>
    </tr>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Codebase</td>
      <td style="padding: 8px;">Single (Web)</td>
      <td style="padding: 8px;">Separate for iOS/Android</td>
      <td style="padding: 8px;">Shared for most logic</td>
    </tr>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Framework Examples</td>
      <td style="padding: 8px;">N/A</td>
      <td style="padding: 8px;">Kotlin/Swift</td>
      <td style="padding: 8px;">React Native, Flutter, KMP</td>
    </tr>
    <tr>
      <td style="font-weight: bold; padding: 8px;">Use Cases</td>
      <td style="padding: 8px;">News, blogs, basic e-commerce</td>
      <td style="padding: 8px;">Gaming, Telcos, social media</td>
      <td style="padding: 8px;">Business apps, simple games</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<hr>
<h3 id="conclusion"><strong>Conclusion</strong></h3>
<p>Your choice depends on the project&#x2019;s scope:</p>
<ul>
<li>Use <strong>App Builders</strong> for quick MVPs or proof-of-concept apps.</li>
<li>Use <strong>PWAs</strong> for lightweight, SEO-friendly apps with minimal hardware dependencies.</li>
<li>Use <strong>Native Apps</strong> for performance-critical, hardware-intensive applications.</li>
<li>Use <strong>Cross-Platform</strong> frameworks for budget-conscious projects with moderate complexity.</li>
</ul>
<hr><p>Which option is best for your next project? It depends on your goals, budget, and technical requirements. Hopefully, this guide gives you a clearer perspective to make an informed choice.<br><br>This post was written and edited by <a href="https://www.linkedin.com/in/hishamgh/?ref=blog.startappz.com" rel="noreferrer">Hisham Ghatasheh</a> our Senior Mobile Solution Architect. </p>]]></content:encoded></item><item><title><![CDATA[Prototype & Test: The Shortcut to User-Centric Design]]></title><description><![CDATA[<p>The prototype is a method that makes you create the story to test, validate, find the gaps, and refine the experience and the context to be suitable for the target audience to achieve their required task.</p><p>for me, I prefer to do it right after the diagram flow and define</p>]]></description><link>https://blog.startappz.com/prototype-test-the-shortcut-to-user-centric-design/</link><guid isPermaLink="false">6666b6366f62af5b595f36e3</guid><category><![CDATA[Design Dive]]></category><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 10 Jun 2024 08:17:59 GMT</pubDate><content:encoded><![CDATA[<p>The prototype is a method that makes you create the story to test, validate, find the gaps, and refine the experience and the context to be suitable for the target audience to achieve their required task.</p><p>for me, I prefer to do it right after the diagram flow and define the user stories by mapping all the steps to check his reaction by using your services, if the service left the assumed Impact and the impression that you are looking for or not,</p><p>So by doing usability testing on your product/ service, you always get the proper feedback and precision for each design U.I. element that should be revised to enhance to be more fitted and appealing for your users.</p><p>The moderator usability testing gives you more insights as a qualitative result; So you can ask, have more impressions, and lead you to the right decisions in the designs. But the thing here is that you have to check what they are doing and match it with their feedback because sometimes they don&#x2019;t match.</p><p>Each usability test is associated with a task; you can&#x2019;t start testing your product by not giving a specific task flow to let you have accurate remarks and suggestions.</p><p>And the more important thing while doing the test is to prepare your assessment sheet and give weights for each usability aspect to be filled by the observer.</p><p>In addition to the above, you have to consider the limitations that occur by using the prototype tools, so you can&apos;t cover all the cases in the same flow; your focus will be on the happy scenarios/ flows because you can&#x2019;t mimic the actual experience with all what have from issues.</p><p>the benefit of the prototype and usability testing is that it&#x2019;s easy to do and has a tremendous:</p><ol><li><strong>Saving time</strong></li><li><strong>Quick enhancement</strong></li><li><strong>Find all the uncovered cases</strong></li><li><strong>Help all the contributors to imagine the product/ service flow.</strong></li><li><strong>Check multiple experiences as A/B testing to adopt the succeeded experience.</strong></li><li><strong>Help you to create the proper context and content.</strong></li></ol><p>In my challenge activity for this week, I created a prototype for an onboarding wireframe to let user register their account in the app.</p><p>As I mentioned above, I covered the happy scenario, despite I got many remarks that helped me to improve the flow, like:</p><p>I added one input to enter the password for login. However, I tend to make it easy to remember, So I limited this to four digits in the registration; after receiving feedback, I made four separate inputs for each number.</p><p>Another thing here is Adding More descriptions under each input to explain why I&#x2019;m asking for this input, to avoid any confusion, and to give the credibility feel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*54H1lSULG1MLEzpteddiRQ.png" class="kg-image" alt loading="lazy" width="1400" height="1181"><figcaption><span style="white-space: pre-wrap;">Figma File/ prototype screens</span></figcaption></figure><h1 id="prototype">Prototype:</h1><figure class="kg-card kg-embed-card"><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.figma.com%2Fembed%3Fembed_host%3Doembed%26url%3Dhttps%3A%2F%2Fwww.figma.com%2Fproto%2FkpJLC8GiMitJVUHZJMgTrM%2FFalmouth-Work%252F-Bank-app%3Fpage-id%3D232%253A12978%26node-id%3D232%253A13173%26viewport%3D341%252C48%252C0.09%26scaling%3Dmin-zoom%26starting-point-node-id%3D240%253A20712%26show-proto-sidebar%3D1&amp;display_name=Figma&amp;url=https%3A%2F%2Fwww.figma.com%2Fproto%2FkpJLC8GiMitJVUHZJMgTrM%2FFalmouth-Work%252F-Bank-app%3Fpage-id%3D232%253A12978%26node-id%3D232%253A13173%26viewport%3D341%252C48%252C0.09%26scaling%3Dmin-zoom%26starting-point-node-id%3D240%253A20712%26show-proto-sidebar%3D1&amp;image=https%3A%2F%2Fapi-cdn.figma.com%2Fresize%2Fthumbnails%2Feb2e328a-8b1d-436f-8849-371a838eba26%3Fheight%3D450%26bucket%3Dfigma-alpha&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=figma" allowfullscreen frameborder="0" height="450" width="800" title="Falmouth Work/ Bank app" class="el n fd dy bg" scrolling="no" style="box-sizing: inherit; top: 0px; width: 680px; height: 382.5px; position: absolute; left: 0px;"></iframe></figure><h2 id="reference-cited">Reference cited:</h2><p>Experience, W.L. in R.-B.U. (2016).&#xA0;<em>Checklist for Planning Usability Studies</em>. [online] Nielsen Norman Group. Available at:&#xA0;<a href="https://www.nngroup.com/articles/usability-test-checklist/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.nngroup.com/articles/usability-test-checklist/</a>&#xA0;[Accessed 13 Mar. 2022].</p><p>Source: <a href="https://medium.com/@naderalazzeh/week-7-prototyping-usability-50e9baca617b?ref=blog.startappz.com">https://medium.com/@naderalazzeh/week-7-prototyping-usability-50e9baca617b</a>and </p>]]></content:encoded></item><item><title><![CDATA[From Empathy to Elegance: Mastering Visual Design for a Powerful UX]]></title><description><![CDATA[<p>Visual design is the spirit of the UX as a final stage, to polish your user experience and empower it by adapting the visual design principles, giving the user the recognizability of what I meant by communicating the user empathy.</p><p>The elements of visual designs are many, like colors, spaces,</p>]]></description><link>https://blog.startappz.com/the-art-of-user-experience-how-visual-design-makes-your-app-sing/</link><guid isPermaLink="false">6666b5946f62af5b595f36d7</guid><category><![CDATA[Design Dive]]></category><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 10 Jun 2024 08:14:32 GMT</pubDate><content:encoded><![CDATA[<p>Visual design is the spirit of the UX as a final stage, to polish your user experience and empower it by adapting the visual design principles, giving the user the recognizability of what I meant by communicating the user empathy.</p><p>The elements of visual designs are many, like colors, spaces, fonts, structure, images, etc.</p><p>And to manage all these aspects, some principles help you to find your way by using and adapting these design principles, which are :</p><ol><li>Unity and Harmony</li><li>Balance</li><li>Hierarchy</li><li>Scale and Proportion</li><li>Dominance and Emphasis</li><li>Similarity and Contrast</li></ol><p>All these principles/guidance rules are connected and affect your whole design approach, so as a reflection of my exercise, I couldn&apos;t do the hierarchy by doing the Dominance and emphasis alone, so it&apos;s tough to start doing these criteria one by one. from my exercise you have to do them all in one time to have the desired look and experience, and you can add above of that, especially in the digital environments the way of the (transitions and interactions)</p><p>So I divided the screen into two parts using the<strong>&#xA0;golden ratio</strong>&#xA0;to have this aesthetic &amp; balanced view in positioning the design elements and the&#xA0;<strong>emphasis aspect</strong>.</p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*28IwwMcTUtj0WKBCRF2Rnw.png" class="kg-image" alt loading="lazy" width="1078" height="917"></figure><p>So at the upper part (dark gray), I used it to emphasize the communication area with the user by displaying all the due bills, alerts, advertisements, budgeting tips, personalized messages, etc. This is the most dynamic area.</p><p>Here, you can see the&#xA0;<strong>hierarchy</strong>&#xA0;of the design components from the above to the end, starting with the communication part, then the budgeting component that shows the balance according to assigned categories, then the details of his accounts from the main account until the points balance that he gained.</p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*762TZBqqK8Sr2cSt5I71jw.png" class="kg-image" alt loading="lazy" width="849" height="906"></figure><p>At the bottom of the screen, I placed the tab action bar as global navigation, which should appear all around the app screens at the first level screens.</p><p>For the color palette, I tried many options. I went through many iterations to find the harmony and the combination, so by doing my research on related apps in the same financial industry, I found that Blue is a good indicator of finance activity; it gives the user the feeling of trust and honesty as it instills confidence and inspires feelings of loyalty and integrity. In addition, the JOD currency has two denominations in blue color.</p><p>The colors used are as the following:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*CQvkapKvl7-djgxCgK9cxw.png" class="kg-image" alt loading="lazy" width="842" height="742"><figcaption><span style="white-space: pre-wrap;">Guidelines</span></figcaption></figure><p><strong>White color:</strong>&#xA0;the base to make the spaces and clarity, especially some many numbers and elements should be readable.</p><p><strong>Dark Blue color:</strong>&#xA0;emphasizes some areas and distinguishes between screen parts, and I used it for text links and icons all over the app.</p><p><strong>Light Blue:&#xA0;</strong>I used to highlight some areas and text on the dark blue background to give me more ability to hierarchy my content.</p><p><strong>Dark Gray:&#xA0;</strong>I<strong>&#xA0;</strong>used the text numbers on the white background.</p><p><strong>Light Gray:</strong>&#xA0;separators/ lines and inputs.</p><p><strong>Green/ Red colors:</strong>&#xA0;I used them to recognize between your transaction IN/OUT money easily, and these colors are heavily utilized in the financial industry for the same purpose.</p><p><strong>Orange color:</strong>&#xA0;the action design elements in my design and the interaction component tell the user what to do and guide him to end his task&#x2014;also, the orange color indicator of activity, confirming, and power.</p><p>The typography elements affect the user experience on many sides, like readability, credibility, and feeling. By choosing Avenir font, I benefited from the font weights; this font has many weights that helped me emphasize and hierarch my design elements.</p><p>Also, Avenir font is a modern font from google library and is compatible with different digital platforms, so it helps with consistency.</p><p>And here we go as a final result for the main landing screen (Dashboard), complying with all the design principles and using fonts and colors to have the desired impact and shape my design clearly from the User perspective.</p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*0HbyMZngsbuizHKvNM0-vw.png" class="kg-image" alt loading="lazy" width="1400" height="846"></figure><h1 id="reference-cited">Reference cited:</h1><p>Esposito, E. (2018).&#xA0;<em>The Golden Ratio &#x2014; What It Is and How to Use It in Design</em>. [online]&#xA0;<a href="http://www.invisionapp.com./?ref=blog.startappz.com" rel="noopener ugc nofollow">www.invisionapp.com.</a>&#xA0;Available at:&#xA0;<a href="https://www.invisionapp.com/inside-design/golden-ratio-designers/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.invisionapp.com/inside-design/golden-ratio-designers/</a>&#xA0;[Accessed 24 Mar. 2022].</p><p>Aragon, K. (2013).&#xA0;<em>15 Color Palettes from Top Financial Websites</em>. [online] The Daily Egg. Available at:&#xA0;<a href="https://www.crazyegg.com/blog/color-palettes-financial/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.crazyegg.com/blog/color-palettes-financial/</a>&#xA0;[Accessed 27 Mar. 2022].</p><p>Gordon, K. (2020).&#xA0;<em>5 Principles of Visual-Design in UX</em>. [online] Nielsen Norman Group. Available at:&#xA0;<a href="https://www.nngroup.com/articles/principles-visual-design/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.nngroup.com/articles/principles-visual-design/.</a></p><p>Bruna (2020).&#xA0;<em>Meaning of the Color Blue: Symbolism, Common Uses, &amp; More</em>. [online] Colors Explained. Available at:&#xA0;<a href="https://www.colorsexplained.com/color-blue-meaning-of-the-color-blue/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.colorsexplained.com/color-blue-meaning-of-the-color-blue/.</a></p><p>Today&apos;s Eggspert (2018).&#xA0;<em>16 Great Website Color Palettes to Increase Engagement (2019)</em>. [online] The Daily Egg. Available at:&#xA0;<a href="https://www.crazyegg.com/blog/website-color-palettes/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.crazyegg.com/blog/website-color-palettes/</a>&#xA0;[Accessed 27 Mar. 2022].</p><p>Source: <a href="https://bootcamp.uxdesign.cc/week-8-visual-design-ac5d29d7f41d?ref=blog.startappz.com">https://bootcamp.uxdesign.cc/week-8-visual-design-ac5d29d7f41d</a></p>]]></content:encoded></item><item><title><![CDATA[Responsive layout/ Grid system]]></title><description><![CDATA[<p>Nowadays, websites are used by users on different platforms and devices. And the good news most of these sites, especially the services and extensive sites, have followed a responsive layout to serve user needs and behaviors.</p><p>So in this week&apos;s topic, we went over these approaches to find</p>]]></description><link>https://blog.startappz.com/responsive-layout-grid-system/</link><guid isPermaLink="false">6666a4766f62af5b595f36cc</guid><category><![CDATA[Design Dive]]></category><dc:creator><![CDATA[Startappz]]></dc:creator><pubDate>Mon, 10 Jun 2024 07:01:07 GMT</pubDate><content:encoded><![CDATA[<p>Nowadays, websites are used by users on different platforms and devices. And the good news most of these sites, especially the services and extensive sites, have followed a responsive layout to serve user needs and behaviors.</p><p>So in this week&apos;s topic, we went over these approaches to find out the difference between them, and how these structures will impact your design layout, and affect your user target.</p><p>To start a responsive layout, you have to structure your design using a grid system. This will assist you in arranging your design elements to avoid un justifying design objects issues from spaces, padding, and margins and help the user easily distinguish your whole design parts.</p><p><strong>The most usable grid system is the 8pt grid, Why?</strong></p><p>It&apos;s easy to scale your design using this logic of 8pt, especially in the different sizes of mobile screens. And it&apos;s not only used for the design layout or the main container, it&apos;s used for all the design elements, text and icons, and the verticals spaces as well, which gives complete control of all the design elements.</p><p><strong>The 8pt is the multiples of 8:</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*uKBerGwysx2o3t4L9WV4tQ.png" class="kg-image" alt loading="lazy" width="1400" height="72"><figcaption><span style="white-space: pre-wrap;">(8)multiples</span></figcaption></figure><p>Using this principle for icons, text, and images and your whole design canvas, you will find your design balanced and save a lot of time by arranging and finding the appropriate spaces; also, it&apos;s compatible with differences in screens&apos; mobile proportions.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*V2D1b8OdgLY11uNH142mnA.png" class="kg-image" alt loading="lazy" width="1400" height="646"><figcaption><span style="white-space: pre-wrap;">Grid layout</span></figcaption></figure><p>Here is a sample of the used icons using 8pt on mobile devices screen (four columns)</p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*un5ZbIK7Ch3l7Y6_MZQtSg.png" class="kg-image" alt loading="lazy" width="1400" height="520"></figure><p><strong>Mobile screen Grid:</strong></p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*sOQTPkn4RuDzcEsZdFb1qg.png" class="kg-image" alt loading="lazy" width="1400" height="1421"></figure><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/v2/resize:fit:1400/1*jjyijsuR3LP85DvEQ1GSyQ.png" class="kg-image" alt loading="lazy" width="1400" height="256"></figure><p>For the bottom action bar, the max-width of the icon size is 32px offset around it is 40px, the padding width 32px between them.</p><p>Despite the fact that my service is a native mobile app, especially at this stage as an MVP, I will check the web to see how many changes I have to be aligned with user needs and the hierarchy; the result came as the following.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*Pra7y5huetg6K5dcunTKdg.png" class="kg-image" alt loading="lazy" width="1400" height="475"><figcaption><span style="white-space: pre-wrap;">Web grid layout</span></figcaption></figure><p>From size 1440px, the wide desktop screen until the size 960px using the 8pt grid system, I don&apos;t have changes in the designs for rearranging design and the structure.</p><p>And from size 600px until 320px, it back again to the mobile view to cover these screen sizes, so as a result, I don&apos;t need to do an adaptive design, so the responsive design is fair enough for me by using a column shifter as a responsive method by removing the action bottom bar to be a left column navigational.</p><ul><li>320px &#x2014; 480px: Mobile devices.</li><li>481px &#x2014; 768px: iPads, Tablets.</li><li>769px &#x2014; 1024px: Small screens, laptops.</li><li>1025px &#x2014; 1200px: Desktops, large screens.</li><li>1201px and more &#x2014; Extra large screens, TV.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://miro.medium.com/v2/resize:fit:1400/1*yXm_Vp086OOQX_Q7_XRIpg.png" class="kg-image" alt loading="lazy" width="1400" height="612"><figcaption><span style="white-space: pre-wrap;">Screen responsive layout</span></figcaption></figure><h2 id="reference-cited"><strong>Reference cited:</strong></h2><p>Vitsky (2021).&#xA0;<em>The Comprehensive 8pt Grid Guide</em>. [online] The Startup. Available at:&#xA0;<a href="https://medium.com/swlh/the-comprehensive-8pt-grid-guide-aa16ff402179?ref=blog.startappz.com" rel="noopener">https://medium.com/swlh/the-comprehensive-8pt-grid-guide-aa16ff402179</a>&#xA0;[Accessed 30 Mar. 2022].</p><p>Rumman (2022).&#xA0;<em>Everything You Should Know About 8 Point Grid System in UX Design</em>. [online] Medium. Available at:&#xA0;<a href="https://uxplanet.org/everything-you-should-know-about-8-point-grid-system-in-ux-design-b69cb945b18d?ref=blog.startappz.com#:~:text=The%20principle%20of%208pt%20Grid" rel="noopener ugc nofollow">https://uxplanet.org/everything-you-should-know-about-8-point-grid-system-in-ux-design-b69cb945b18d#:~:text=The%20principle%20of%208pt%20Grid</a>&#xA0;[Accessed 30 Mar. 2022].</p><p>Mads Soegaard (2019).&#xA0;<em>Adaptive vs. Responsive Design</em>. [online] The Interaction Design Foundation. Available at:&#xA0;<a href="https://www.interaction-design.org/literature/article/adaptive-vs-responsive-design?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.interaction-design.org/literature/article/adaptive-vs-responsive-design</a>&#xA0;[Accessed 30 Mar. 2022].</p><p>Eygi, C. (2020).&#xA0;<em>Media Query CSS Tutorial &#x2014; Standard Resolutions, CSS Breakpoints, and Target Phone Sizes</em>. [online] freeCodeCamp.org. Available at:&#xA0;<a href="https://www.freecodecamp.org/news/css-media-queries-breakpoints-media-types-standard-resolutions-and-more/?ref=blog.startappz.com" rel="noopener ugc nofollow">https://www.freecodecamp.org/news/css-media-queries-breakpoints-media-types-standard-resolutions-and-more/</a>&#xA0;[Accessed 30 Mar. 2022].</p><p>Source: <a href="https://medium.com/design-bootcamp/week-9-responsive-layout-grid-system-b6faa7bfd7aa?ref=blog.startappz.com">https://medium.com/design-bootcamp/week-9-responsive-layout-grid-system-b6faa7bfd7aa</a></p>]]></content:encoded></item></channel></rss>