<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lifestyle &amp; Shopping &#8211; Smartup</title>
	<atom:link href="https://smartupweb.com/portfolio-category/lifestyle-shopping/feed/" rel="self" type="application/rss+xml" />
	<link>https://smartupweb.com/portfolio-category/lifestyle-shopping/</link>
	<description>Mobile App Design &#38; Development in Thessaloniki</description>
	<lastBuildDate>Tue, 13 Oct 2026 11:22:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://smartupweb.com/wp-content/uploads/2026/08/cropped-S-favicon-image-32x32.png</url>
	<title>Lifestyle &amp; Shopping &#8211; Smartup</title>
	<link>https://smartupweb.com/portfolio-category/lifestyle-shopping/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Noema Personalized Astrology</title>
		<link>https://smartupweb.com/project/noema/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Fri, 02 Oct 2026 11:47:56 +0000</pubDate>
				<guid isPermaLink="false">https://smartupweb.com/?post_type=ohio_portfolio&#038;p=248963</guid>

					<description><![CDATA[<p>Noema Your whole chart, not your star sign. Noema is a premium...</p>
<p>The post <a href="https://smartupweb.com/project/noema/">Noema Personalized Astrology</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="248963" class="elementor elementor-248963">
				<div class="elementor-element elementor-element-148c3bd e-flex e-con-boxed e-con e-parent" data-id="148c3bd" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-b662224 e-con-full e-flex e-con e-child" data-id="b662224" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-9049629 e-con-full e-flex e-con e-child" data-id="9049629" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-987e93e elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="987e93e" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Noema                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-dc2622f e-con-full e-flex e-con e-child" data-id="dc2622f" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-36409d3 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="36409d3" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p><strong>Your whole chart, not your star sign.</strong></p><p><strong>Noema</strong> is a premium astrology app for the global market, on iOS and Android. It takes a user&#8217;s exact birth data, calculates their full natal chart, and turns it into a daily reading, a live transits feed, compatibility reports and an astrology encyclopedia. The interpretations come from two sources: a professional astrologer wrote a library of texts, and generative AI writes the parts that change every day. We designed and built the app, the backend and the back office. It was delivered in about twelve weeks.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-8695dfc e-con-full e-flex e-con e-parent" data-id="8695dfc" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-45046ca elementor-widget elementor-widget-html" data-id="45046ca" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<video class="noema-intro" muted playsinline preload="metadata"
       poster="/wp-content/uploads/2026/10/Noema-Intro-poster_16x9.jpg">
  <source src="/wp-content/uploads/2026/10/Noema-Intro_ConceptB-Orbit_16x9_1920x1080.mp4" type="video/mp4">
</video>
<style>
  .noema-intro{display:block;width:100%;height:auto;aspect-ratio:16/9;border-radius:16px;background:#05060F}
</style>
<script>
  // Ξεκινάει όταν φανεί στην οθόνη, παίζει μία φορά και μένει στο λογότυπο
  (function(){
    var v = document.querySelector('.noema-intro');
    if (!v || !('IntersectionObserver' in window)) { v && v.play(); return; }
    new IntersectionObserver(function(e, o){
      if (e[0].isIntersecting) { v.play(); o.disconnect(); }
    }, { threshold: 0.4 }).observe(v);
  })();
</script>				</div>
				</div>
		<div class="elementor-element elementor-element-bf56dbd e-flex e-con-boxed e-con e-parent" data-id="bf56dbd" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-6612a5c e-con-full e-flex e-con e-child" data-id="6612a5c" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-f48063d e-con-full e-flex e-con e-child" data-id="f48063d" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-b6319b0 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="b6319b0" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            The Problem        </div>

        
    
    <h2 class="title">
                Every horoscope said the same thing to a twelfth of the country
                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-65db892 e-con-full e-flex e-con e-child" data-id="65db892" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-2cbae1a elementor-invisible elementor-widget elementor-widget-text-editor" data-id="2cbae1a" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Most astrology apps publish one horoscope per sun sign. Everyone born in the same month reads the same paragraph. Serious astrology works from the whole chart: where every planet sits, in which house, and at what angle to the others. That depth usually comes with vocabulary that loses people on the first screen: aspects, houses, orbs, retrogrades.</p><p>The obvious shortcut was to point an AI model at a birth date and let it write. That produces text that sounds confident and means nothing, and an astrology audience notices quickly. The product needed real calculations, real astrological expertise, and daily writing fast enough to be ready every morning. It also had to feel premium enough that people would pay for it.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-55f6a53 e-flex e-con-boxed e-con e-parent" data-id="55f6a53" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-e04503c e-con-full e-flex e-con e-child" data-id="e04503c" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-ab28d02 e-con-full e-flex e-con e-child" data-id="ab28d02" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-c361737 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="c361737" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            What we built        </div>

        
    
    <h2 class="title">
                A chart that explains itself                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-0597c8a e-con-full e-flex e-con e-child" data-id="0597c8a" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-95d48df elementor-invisible elementor-widget elementor-widget-text-editor" data-id="95d48df" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Three things ship together. The first is the app on iOS and Android. The second is a dedicated backend that calculates charts and transits, holds the astrologer&#8217;s interpretation library and generates the daily readings. The third is a back office where the team edits texts, grants complimentary subscriptions and runs push campaigns.</p><p>We treated jargon as a design problem, not a content problem. Every term the app uses opens a plain-language definition in one tap: aspect, house, element, retrograde. The Knowledge tab gathers all of them into an encyclopedia with a term of the day. A user who has never heard the word &#8220;synastry&#8221; can still read their compatibility report.</p>								</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-31473c5 e-con-full elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child" data-id="31473c5" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-dadc91c elementor-widget elementor-widget-image" data-id="dadc91c" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img fetchpriority="high" decoding="async" width="1344" height="800" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema_Project_Hero_Banner.webp" class="attachment-full size-full wp-image-248967" alt="Noema app" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema_Project_Hero_Banner.webp 1344w, https://smartupweb.com/wp-content/uploads/2026/10/Noema_Project_Hero_Banner-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2026/10/Noema_Project_Hero_Banner-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2026/10/Noema_Project_Hero_Banner-768x457.webp 768w" sizes="(max-width: 1344px) 100vw, 1344px" />															</div>
				</div>
		<div class="elementor-element elementor-element-72cbfb2 e-con-full elementor-hidden-desktop e-flex e-con e-child" data-id="72cbfb2" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ddcd992 elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="ddcd992" data-element_type="widget" data-e-type="widget" data-settings="{&quot;slides_to_show_mobile&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;dots&quot;,&quot;lazyload&quot;:&quot;yes&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
							<div class="elementor-image-carousel-wrapper swiper" role="region" aria-roledescription="carousel" aria-label="Image Carousel" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-scaled.webp" alt="Noema-mobile_1" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-scaled.webp" alt="Noema-mobile_2" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-scaled.webp" alt="Noema-mobile_3" /><div class="swiper-lazy-preloader"></div></figure></div>			</div>
							
									<div class="swiper-pagination"></div>
									</div>
						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-86193a1 e-flex e-con-boxed e-con e-parent" data-id="86193a1" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-0e95e7d e-con-full e-flex e-con e-child" data-id="0e95e7d" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-981d65c e-con-full e-flex e-con e-child" data-id="981d65c" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-6d19050 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="6d19050" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Product tour        </div>

        
    
    <h2 class="title">
                From sign-up to your Big 3 in a minute                    </h2>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-11fb21d elementor-invisible elementor-widget elementor-widget-text-editor" data-id="11fb21d" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Onboarding takes five steps: name, birth details, goals, chart calculation, and the reveal of the user&#8217;s Sun, Moon and Ascendant. Birth-place search runs entirely offline over roughly 50,000 places in Greek and Latin script, and the timezone is worked out from the location, so nobody is ever asked for one. Users who don&#8217;t know their birth time can still continue, and the app explains the approximation. If someone leaves halfway, the wizard reopens at the first unfinished step, even on another device. While the user is reading their Big 3, the app is already fetching today&#8217;s forecast, so the dashboard opens instantly.</p>								</div>
				</div>
		<div class="elementor-element elementor-element-7ef1b10 e-con-full e-flex e-con e-child" data-id="7ef1b10" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-46fc1ff elementor-widget elementor-widget-image" data-id="46fc1ff" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-scaled.webp" class="attachment-full size-full wp-image-248971" alt="Noema-Big3" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Big3-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-550251b e-con-full e-flex e-con e-child" data-id="550251b" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-be962ee e-con-full e-flex e-con e-child" data-id="be962ee" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-8b7706a elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="8b7706a" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                A day with a score, and a reason
                    </h2>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-3f024be elementor-invisible elementor-widget elementor-widget-text-editor" data-id="3f024be" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The Today tab scores the day from 0 to 100 and breaks it into Energy, Love, Money and Communication. Each score has its own reading. Next to it are the theme of the day, what the day favours and what it doesn&#8217;t, and a moon card with phase, illumination and a countdown to the next phase. Weekly and monthly readings are one tap away. None of it is a sun-sign horoscope: every line is written from that user&#8217;s chart and that day&#8217;s sky.</p>								</div>
				</div>
		<div class="elementor-element elementor-element-e0e4c5b e-con-full e-flex e-con e-child" data-id="e0e4c5b" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-04405bf elementor-widget elementor-widget-image" data-id="04405bf" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-scaled.webp" class="attachment-full size-full wp-image-248972" alt="Noema-Home" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Home-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-ab81986 e-con-full e-flex e-con e-child" data-id="ab81986" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-912acea e-con-full e-flex e-con e-child" data-id="912acea" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-95c4795 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="95c4795" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                A natal wheel, drawn for one person                    </h2>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-d4fb272 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="d4fb272" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The Chart tab paints the user&#8217;s natal wheel: the zodiac ring, 15 points at their exact degree, house cusps, the Ascendant and Midheaven axes, and a colour-coded web of aspects. Planets, houses and around 30 aspects each open the astrologer&#8217;s own interpretation. Cosmic History keeps a calendar of past daily forecasts, so a user can look back at how a week actually went.</p>								</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-af4987e e-con-full e-flex e-con e-child" data-id="af4987e" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-a9c9372 e-con-full e-flex e-con e-child" data-id="a9c9372" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ea109ce elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="ea109ce" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Today's sky, against your own chart                    </h2>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-8fafba5 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="8fafba5" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Transits shows how the planets moving today touch the user&#8217;s natal chart, usually 40 to 55 active aspects, ordered the way the astrologer specified. Fast planets show the exact time of the peak. Slow ones show the whole window and every exact pass, including retrograde ones. The six aspects that today&#8217;s forecast was written from are flagged as key, so the Today tab and the Transits tab always tell the same story.</p>								</div>
				</div>
		<div class="elementor-element elementor-element-14c2c94 e-con-full e-flex e-con e-child" data-id="14c2c94" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-5cacb50 elementor-widget elementor-widget-image" data-id="5cacb50" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-scaled.webp" class="attachment-full size-full wp-image-248970" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_1-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				<div class="elementor-element elementor-element-85bfb15 elementor-widget elementor-widget-image" data-id="85bfb15" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-scaled.webp" class="attachment-full size-full wp-image-248969" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_2-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				<div class="elementor-element elementor-element-4e0599b elementor-widget elementor-widget-image" data-id="4e0599b" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-scaled.webp" class="attachment-full size-full wp-image-248968" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_3-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-2a7c808 e-con-full e-flex e-con e-child" data-id="2a7c808" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-5180c0b e-con-full e-flex e-con e-child" data-id="5180c0b" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-65d117f elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="65d117f" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Compatibility, with the working shown                    </h2>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-f112633 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="f112633" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Synastry compares two charts and returns an overall score, three sub-scores (Communication, Emotions, Passion) and the five aspects that drive them. An AI-written report, Noema Insight, turns that into a summary, a reading for each area and advice. Free users get one comparison a week and a preview of the report. Premium removes both limits.</p>								</div>
				</div>
		<div class="elementor-element elementor-element-959763d e-con-full elementor-hidden-mobile e-flex e-con e-child" data-id="959763d" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-3579b72 elementor-widget elementor-widget-image" data-id="3579b72" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-scaled.webp" class="attachment-full size-full wp-image-248973" alt="Noema-Synastry" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/Noema-mobile_Synastry-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-072a9fc e-flex e-con-boxed e-con e-parent" data-id="072a9fc" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;gradient&quot;}">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-ac0d067 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="ac0d067" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-1db36f1 e-con-full e-flex e-con e-child" data-id="1db36f1" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-f8249d2 e-con-full e-flex e-con e-child" data-id="f8249d2" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-61bd3ce elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="61bd3ce" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            The architecture        </div>

        
    
    <h2 class="title">
                Written by an astrologer, finished by AI                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-d4b954f e-con-full e-flex e-con e-child" data-id="d4b954f" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-e688f3d elementor-invisible elementor-widget elementor-widget-text-editor" data-id="e688f3d" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The astrology itself is never generated. Charts, transits and the timing of every aspect come from a Swiss Ephemeris engine, the same standard professional astrologers use. Each chart is matched server-side against the astrologer&#8217;s library, about 70 personal texts per user. Every text is versioned, so edits reach users without an app release.</p><p>The AI (Google Gemini) writes only what changes: the daily, weekly and monthly readings and the compatibility reports. Its prompts are grounded in the user&#8217;s placements, the moon phase and the astrologer&#8217;s texts for the aspects active that day. The day&#8217;s percentages come from the astrologer&#8217;s own scoring, not from the model. Every user&#8217;s forecast is pre-generated overnight. If a request arrives before then, it triggers exactly one generation, and every later read comes back in under 150 ms.</p><p>The app follows the same discipline. It uses a strict one-way architecture: services, then repositories, then view models, then views. The last audit found zero violations. The starfield behind every screen is mounted once and never reloads between pages. Every animation runs without rebuilding the screen and pauses when the app is in the background. 874 hard-coded colours and fonts were moved onto design tokens that come straight from Figma, so the visual language cannot drift.</p>								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-cac7c82 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="cac7c82" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-5df36e0 e-con-full e-flex e-con e-child" data-id="5df36e0" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-992c117 e-con-full e-flex e-con e-child" data-id="992c117" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-4336c93 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="4336c93" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Team and scope        </div>

        
    
    <h2 class="title">
                One team, from idea to store                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-737b643 e-con-full e-flex e-con e-child" data-id="737b643" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-d665786 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="d665786" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Product design, mobile, backend and the back office were all ours. A team of 12 roles. We went from first commit to a store-ready build in about twelve weeks, with more than 500 commits.</p><p>Greek throughout, with Greek typography rules applied properly: capitals without accents, and search and matching that ignore accents. Every push and pull request runs more than 400 automated tests. Crashes are reported through Crashlytics. A store build refuses to start if a single production setting is missing.</p>								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-5416541 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="5416541" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-25a76c1 e-con-full e-flex e-con e-child" data-id="25a76c1" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-435fa51 e-con-full e-flex e-con e-child" data-id="435fa51" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-0e88c3a elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="0e88c3a" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Technologies        </div>

        
    
    <h2 class="title">
                Stack                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-642caff e-con-full e-flex e-con e-child" data-id="642caff" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-a218bc1 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-invisible elementor-widget elementor-widget-icon-list" data-id="a218bc1" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:400}" data-widget_type="icon-list.default">
							<ul class="elementor-icon-list-items">
							<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Mobile: Flutter · Dart · go_router · Provider · flutter_hooks</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Backend: REST API on Google Cloud Run</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Astrology engine: Swiss Ephemeris</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">AI: Google Gemini</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Identity: Firebase Authentication</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Push: Firebase Cloud Messaging</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Payments: RevenueCat · StoreKit · Google Play Billing</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Quality: Firebase Crashlytics · GitHub Actions</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Design: Figma design tokens · custom-painted charts and motion</span>
									</li>
						</ul>
						</div>
				<div class="elementor-element elementor-element-24f0b3b elementor-widget elementor-widget-html" data-id="24f0b3b" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div class="su-badge">
  <div class="su-badge__stage">
    <div class="su-badge__tilt">
      <div class="su-badge__ring"></div>
    </div>

    <svg class="su-badge__mark" viewBox="0 0 101 122" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
      <rect x="25.25" y="0"    width="75.75" height="24.4"/>
      <rect x="0"     y="24.4" width="25.25" height="24.4"/>
      <rect x="25.25" y="48.8" width="50.5"  height="24.4"/>
      <rect x="75.75" y="73.2" width="25.25" height="24.4"/>
      <rect x="0"     y="97.6" width="75.75" height="24.4"/>
    </svg>
  </div>
</div>

<style>
  .su-badge {
    display: flex;
    justify-content: center;
    color: #fff;
  }

  .su-badge__stage {
    position: relative;
    width: 280px;
    height: 180px;
    perspective: 9000px;
  }

  .su-badge__tilt {
    position: absolute;
    inset: 0;
    transform: rotateX(28deg);
    transform-style: preserve-3d;
  }

  .su-badge__ring {
    position: absolute;
    inset: 0;
    transform-style: preserve-3d;
    animation: suBadgeSpin 16s linear infinite;
  }

  .su-badge__ch {
    position: absolute;
    left: 50%;
    top: 50%;
    margin: -0.6em 0 0 -0.5em;
    width: 1em;
    font-family: "Open Sans", sans-serif;
    font-size: 18px;
    font-weight: 400;
    line-height: 1.2;
    text-align: center;
    white-space: pre;
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
  }

  .su-badge__mark {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 41px;
    height: 50px;
    transform: translate(-50%, -50%);
    fill: currentColor;
  }

  @keyframes suBadgeSpin {
    from {
      transform: rotateY(0deg);
    }
    to {
      transform: rotateY(360deg);
    }
  }

  @media (prefers-reduced-motion: reduce) {
    .su-badge__ring {
      animation: none;
    }
  }
</style>

<script>
(function () {
  var TEXT = 'THIS PROJECT WAS MADE BY HUMANS \u2022 ';
  var REPEAT = 2;
  var RADIUS = 122;
  var FONT = '700 15px "Open Sans", sans-serif';
  var TRACKING = 1.0;

  function build(root) {
    if (root.hasAttribute('data-su-ready')) return;
    root.setAttribute('data-su-ready', '');

    var ring = root.querySelector('.su-badge__ring');
    if (!ring) return;

    var str = '';
    for (var r = 0; r < REPEAT; r++) str += TEXT;
    var chars = str.split('');
    var n = chars.length;

    var ctx = document.createElement('canvas').getContext('2d');
    ctx.font = FONT;

    var widths = [];
    var total = 0;
    for (var i = 0; i < n; i++) {
      var w = ctx.measureText(chars[i]).width * TRACKING;
      widths.push(w);
      total += w;
    }

    var frag = document.createDocumentFragment();
    var cursor = 0;

    for (var k = 0; k < n; k++) {
      var deg = (cursor + widths[k] / 2) / total * 360;
      cursor += widths[k];

      var out = document.createElement('span');
      out.className = 'su-badge__ch';
      out.textContent = chars[k];
      out.style.transform = 'rotateY(' + deg.toFixed(3) + 'deg) translateZ(' + RADIUS + 'px)';
      frag.appendChild(out);

      var inn = document.createElement('span');
      inn.className = 'su-badge__ch';
      inn.textContent = chars[k];
      inn.style.transform = 'rotateY(' + (180 - deg).toFixed(3) + 'deg) translateZ(' + RADIUS + 'px) rotateY(180deg)';
      frag.appendChild(inn);
    }

    ring.appendChild(frag);
  }

  function init() {
    var all = document.querySelectorAll('.su-badge');
    for (var i = 0; i < all.length; i++) build(all[i]);
  }

  if (document.fonts && document.fonts.ready) {
    document.fonts.ready.then(init);
  } else if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
</script>				</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-b15b913 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="b15b913" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-1ae68d6 e-con-full e-flex e-con e-child" data-id="1ae68d6" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-b3dc245 e-con-full e-flex e-con e-child" data-id="b3dc245" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-cbe7056 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="cbe7056" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Download mobile app        </div>

        
    
    <h2 class="title">
                Noema – Personalized Astrology                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-8d71ded e-con-full e-flex e-con e-child" data-id="8d71ded" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-9860639 elementor-widget elementor-widget-image" data-id="9860639" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="497" height="146" src="https://smartupweb.com/wp-content/uploads/2026/09/apple.png" class="elementor-animation-grow attachment-full size-full wp-image-247580" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/09/apple.png 497w, https://smartupweb.com/wp-content/uploads/2026/09/apple-300x88.png 300w" sizes="(max-width: 497px) 100vw, 497px" />															</div>
				<div class="elementor-element elementor-element-ad1b17d elementor-widget elementor-widget-image" data-id="ad1b17d" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="497" height="146" src="https://smartupweb.com/wp-content/uploads/2026/09/android.png" class="elementor-animation-grow attachment-full size-full wp-image-247581" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/09/android.png 497w, https://smartupweb.com/wp-content/uploads/2026/09/android-300x88.png 300w" sizes="(max-width: 497px) 100vw, 497px" />															</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6572417 e-flex e-con-boxed e-con e-parent" data-id="6572417" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-a5bbf2f e-con-full e-flex e-con e-child" data-id="a5bbf2f" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-7b69160 su-cta elementor-widget elementor-widget-ohio_call_to_action" data-id="7b69160" data-element_type="widget" data-e-type="widget" data-widget_type="ohio_call_to_action.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget call-to-action subtitle-bottom" >
    <div class="heading title">

        
        <h2  class="title">
            Tell us what you're building.        </h2>

                    <div class="subtitle" >
                A 30-minute call — no deck, no pitch. You describe the problem, we tell you honestly whether we're the right team for it, and what we'd do first.            </div>
        
    </div>
    <div class="holder">
        <a class="button -default btn-elementor-colored"
            href="/contact/" >
            
                            <svg xmlns="http://www.w3.org/2000/svg" class="su-mark" width="101" height="122" viewBox="0 0 101 122" aria-hidden="true"><style>    .su-mark { color: #053634; }              .su-mark__blk {      fill: currentColor;      transform-box: fill-box;      transform-origin: center;      animation: suSWave 1.5s ease-in-out infinite;    }    .su-mark__b1 { animation-delay: 0s;    }    .su-mark__b2 { animation-delay: 0.11s; }    .su-mark__b3 { animation-delay: 0.22s; }    .su-mark__b4 { animation-delay: 0.33s; }    .su-mark__b5 { animation-delay: 0.44s; }    @keyframes suSWave {      0%, 65%, 100% { opacity: 0.22; transform: scale(0.86); }      22%           { opacity: 1;    transform: scale(1);    }    }    @media (prefers-reduced-motion: reduce) {      .su-mark__blk { animation: none; opacity: 1; transform: none; }    }  </style><rect class="su-mark__blk su-mark__b1" x="25.25" y="0" width="75.75" height="24.4"></rect><rect class="su-mark__blk su-mark__b2" x="0" y="24.4" width="25.25" height="24.4"></rect><rect class="su-mark__blk su-mark__b3" x="25.25" y="48.8" width="50.5" height="24.4"></rect><rect class="su-mark__blk su-mark__b4" x="75.75" y="73.2" width="25.25" height="24.4"></rect><rect class="su-mark__blk su-mark__b5" x="0" y="97.6" width="75.75" height="24.4"></rect></svg>                        
                            <span class="text">Contact us</span>
            
                    </a>
    </div>
</div>				</div>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>The post <a href="https://smartupweb.com/project/noema/">Noema Personalized Astrology</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Agora.AI</title>
		<link>https://smartupweb.com/project/agora-ai-smart-shopping-app/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 14:21:44 +0000</pubDate>
				<guid isPermaLink="false">https://ohio.clbthemes.com/demoportfolio/?post_type=ohio_portfolio&#038;p=21044</guid>

					<description><![CDATA[<p>The Problem Thirteen supermarkets, and none of them on your list Shoppers...</p>
<p>The post <a href="https://smartupweb.com/project/agora-ai-smart-shopping-app/">Agora.AI</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="21044" class="elementor elementor-21044">
				<div class="elementor-element elementor-element-a114b5a e-flex e-con-boxed e-con e-parent" data-id="a114b5a" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-1c26f43 e-con-full e-flex e-con e-child" data-id="1c26f43" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-8f39c70 e-con-full e-flex e-con e-child" data-id="8f39c70" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-5bfcadb elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="5bfcadb" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Agora.AI                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-51ca49e e-con-full e-flex e-con e-child" data-id="51ca49e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-b7f2912 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="b7f2912" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p><strong>Transforming Grocery &amp; Household Shopping with Voice AI and IoT. Write your list. See where it&#8217;s cheapest.</strong></p><p><strong>Agora.ai</strong> is a grocery-savings app for the Greek market. Users write their shopping list the way they would on paper, or simply say it out loud: &#8220;<em>2 packs of pasta no.6</em>&#8220;. The platform turns every line into real products across 13 Greek supermarket chains, pre-selects the cheapest match, and prices the whole list two ways: as a combined basket, with each item bought where it&#8217;s cheapest, and as a per-store basket, with the entire list bought at one chain. Before leaving the house, the shopper knows what to buy, where, and what it will cost. We built Version 3 of the app, one Flutter codebase live on the App Store and Google Play as &#8220;<strong>Agora</strong>&#8220;.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-ca1c106 e-flex e-con-boxed e-con e-parent" data-id="ca1c106" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-a564c32 e-con-full e-flex e-con e-child" data-id="a564c32" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-260eebe e-con-full e-flex e-con e-child" data-id="260eebe" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-35789d2 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="35789d2" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            The Problem        </div>

        
    
    <h2 class="title">
                Thirteen supermarkets, and none of them on your list                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-04dd9ee e-con-full e-flex e-con e-child" data-id="04dd9ee" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-39e6488 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="39e6488" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Shoppers who want to save money compare flyers, apps and shelf prices by hand, chain by chain. A shopping list is a few loose words, like &#8220;pasta&#8221; or &#8220;milk&#8221;, while a price belongs to one specific product at one specific chain. Bridging the two by hand is exactly the job nobody has time for.</p><p>The app had to accept messy human input, typed or spoken, match it to real products at every chain, and price it in several ways at once. It also had to feel as instant as writing on paper, even though every single line needs a trip to the server and back.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-c99c0f1 e-flex e-con-boxed e-con e-parent" data-id="c99c0f1" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-b918797 e-con-full e-flex e-con e-child" data-id="b918797" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-d52f880 e-con-full e-flex e-con e-child" data-id="d52f880" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-d66a2b4 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="d66a2b4" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            What we built        </div>

        
    
    <h2 class="title">
                A list that prices itself                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-e4f0712 e-con-full e-flex e-con e-child" data-id="e4f0712" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-74ba6bc elementor-invisible elementor-widget elementor-widget-text-editor" data-id="74ba6bc" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The list lives in Cloud Firestore and streams to the phone in real time. Every change the user makes (add, swap, quantity, tick, complete, share) is sent as a command to the Agora AI REST API. The API does the matching, the price ranking and the per-store lists on the server and writes the results back into the stream. Around that loop sit the discovery features: a live offers feed, a supermarket map, a digital flyer reader, favourites, the government Household Basket browser and personal spending analytics.</p><p>Getting started takes seconds: email, Google or Sign in with Apple. Account setup is transactional. If any step of provisioning fails, the sign-in is rolled back, so nobody ends up with a half-made account. A nine-step interactive tutorial then walks new users through the list, using demo items added through the real API so they see real prices.</p>								</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-e767b73 e-con-full elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child" data-id="e767b73" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ae77543 elementor-widget elementor-widget-image" data-id="ae77543" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img loading="lazy" decoding="async" width="1344" height="800" src="https://smartupweb.com/wp-content/uploads/2025/03/Project_Hero_Banner-2.webp" class="attachment-full size-full wp-image-247555" alt="Agora AI-Figma Design-Mobile App" srcset="https://smartupweb.com/wp-content/uploads/2025/03/Project_Hero_Banner-2.webp 1344w, https://smartupweb.com/wp-content/uploads/2025/03/Project_Hero_Banner-2-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2025/03/Project_Hero_Banner-2-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2025/03/Project_Hero_Banner-2-768x457.webp 768w" sizes="(max-width: 1344px) 100vw, 1344px" />															</div>
				</div>
		<div class="elementor-element elementor-element-11e3824 e-con-full elementor-hidden-desktop e-flex e-con e-child" data-id="11e3824" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-59a0c1f elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="59a0c1f" data-element_type="widget" data-e-type="widget" data-settings="{&quot;slides_to_show_mobile&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;dots&quot;,&quot;lazyload&quot;:&quot;yes&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
							<div class="elementor-image-carousel-wrapper swiper" role="region" aria-roledescription="carousel" aria-label="Image Carousel" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2025/03/Agora-AI-frame2-scaled.webp" alt="Agora AI" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2025/03/Agora-AI-frame-scaled.webp" alt="Agora AI-Figma Design-Mobile App" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 3"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2025/03/Agora-AI-frame-3-scaled.webp" alt="Agora AI-Figma Design-Mobile App" /><div class="swiper-lazy-preloader"></div></figure></div>			</div>
							
									<div class="swiper-pagination"></div>
									</div>
						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6d9410a e-flex e-con-boxed e-con e-parent" data-id="6d9410a" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-00bc014 e-con-full e-flex e-con e-child" data-id="00bc014" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-1605f7b e-con-full e-flex e-con e-child" data-id="1605f7b" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ce2e6c8 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="ce2e6c8" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Type it, or just say it                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-3821ba1 e-con-full e-flex e-con e-child" data-id="3821ba1" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-e5ceead elementor-invisible elementor-widget elementor-widget-text-editor" data-id="e5ceead" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									One input bar handles both typing and push-to-talk voice, in Greek or English. The raw phrase goes to the server, which works out the quantity and can return several items from a single sentence. The moment the user submits, a placeholder row appears at half opacity. It becomes the real, priced row in the same frame the data arrives, with no flicker and no duplicates. If nothing matches, the row fades out with a clear message.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-d77a1f0 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="d77a1f0" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-e654226 e-con-full e-flex e-con e-child" data-id="e654226" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-39b2ff2 e-con-full e-flex e-con e-child" data-id="39b2ff2" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-db0b797 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="db0b797" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                One basket, or one store                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-7a9e557 e-con-full e-flex e-con e-child" data-id="7a9e557" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-cd836e9 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="cd836e9" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									The default view is the combined basket. Each line shows the product picked, the logo of the chain where it&#8217;s cheapest, and the user&#8217;s original words underneath. A strip of chips shows the combined total first, then the price of the entire list at each chain. Tap a chip and the list switches to that chain&#8217;s version, with its own product picks. A toggle groups everything by supermarket, with subtotals and item counts, and a &#8220;notebook&#8221; mode hides prices for a plain paper-style list.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-ef66eaf elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="ef66eaf" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-49df43f e-con-full e-flex e-con e-child" data-id="49df43f" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-061fbfc e-con-full e-flex e-con e-child" data-id="061fbfc" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-9046e03 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="9046e03" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Every alternative, side by side                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-b041655 e-con-full e-flex e-con e-child" data-id="b041655" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-8c2acb1 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="8c2acb1" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									Tapping a line opens every matching product across all chains. A smart price assistant picks four standouts: cheapest product, lowest price per kilo or litre, biggest discount and customer favourite. Further tabs show only products on offer, and multipacks that work out cheaper. Store and brand filters show a live result count. Choosing an alternative swaps it into the list in one tap, and every total updates.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-a2ab8cd elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="a2ab8cd" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-1c3646c e-con-full e-flex e-con e-child" data-id="1c3646c" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-c388d47 e-con-full e-flex e-con e-child" data-id="c388d47" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-224b813 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="224b813" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                In the aisle                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-edde703 e-con-full e-flex e-con e-child" data-id="edde703" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-4f7d161 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="4f7d161" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									In the shop, a cart button ticks items off: they&#8217;re struck through and sink to the bottom of the list. Quantity taps respond instantly. When every item for a store is ticked, the app offers to complete that store&#8217;s list. The whole list can also be exported and shared as text.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-e01783f elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="e01783f" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-778273f e-con-full e-flex e-con e-child" data-id="778273f" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-bb15a33 e-con-full e-flex e-con e-child" data-id="bb15a33" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-0e7a646 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="0e7a646" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Offers, flyers and the nearest branch                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-eee6d36 e-con-full e-flex e-con e-child" data-id="eee6d36" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-add0b17 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="add0b17" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The offers feed shows the 300 biggest current discounts, with personal keyword tabs such as γάλα or coffee that ignore Greek accents. A map finds every branch of every chain within 3 km and hands off to Apple Maps or Google Maps for directions. The flyer library shows each chain&#8217;s current promotional flyers, flags new ones, and opens them in a zoomable reader. Users can choose which chains to follow and get a notification when a new flyer comes out.</p>								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-cc20a02 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="cc20a02" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-b61f82b e-con-full e-flex e-con e-child" data-id="b61f82b" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-7ac3a0b e-con-full e-flex e-con e-child" data-id="7ac3a0b" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-9dc5d22 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="9dc5d22" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
                    </div>

        
    
    <h2 class="title">
                Shopping for a household                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-c753082 e-con-full e-flex e-con e-child" data-id="c753082" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-594d54d elementor-invisible elementor-widget elementor-widget-text-editor" data-id="594d54d" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Users can invite other Agora users by email to share their list. Members appear in real time. Tapping a family member switches the active list, and everyone with access can add, swap and tick items. The app also includes the Greek Ministry of Development&#8217;s Household Basket price-cap programme, browsable chain by chain, and a spending view broken down by category.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-d808782 e-flex e-con-boxed e-con e-parent" data-id="d808782" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;gradient&quot;}">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c46f099 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="c46f099" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-655d79d e-con-full e-flex e-con e-child" data-id="655d79d" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-8f176b7 e-con-full e-flex e-con e-child" data-id="8f176b7" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-14b33e1 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="14b33e1" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            The architecture        </div>

        
    
    <h2 class="title">
                Instant, even though the server decides                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-419ac9e e-con-full e-flex e-con e-child" data-id="419ac9e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-3ac588b elementor-invisible elementor-widget elementor-widget-text-editor" data-id="3ac588b" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>The app separates reading from writing. Firestore snapshots handle every read, and every write is a REST command to the domain API, which owns the matching, pricing and list building. The main list and each store&#8217;s list stream in parallel, are combined on the device, and are debounced by 500 ms, so a burst of server writes becomes one smooth update.</p><p>The optimistic layer is what makes the app feel instant. Placeholder rows are never removed when the HTTP call returns, only when their real counterpart appears in the stream, and that swap happens inside the stream listener, in a single frame. Quantity taps are applied locally, collected per item for two seconds and sent as one request, with an automatic rollback if the server says no. On every change, a totals engine recalculates the combined total, each chain&#8217;s share of the combined basket, and the whole list priced at every chain.</p><p>The client follows MVVM with a separate use-case layer, so list behaviour is plain, testable Dart. Widgets rebuild at row level, so changing one item repaints one row, not the whole list. The dependency graph is scoped to the signed-in user and rebuilt on account switch, so nothing leaks between accounts. A typed error model tells &#8220;the server said no&#8221; apart from &#8220;we never reached the server&#8221;. A single store-name normaliser resolves every way the data sources spell a chain (Greek, Latin, accents, abbreviations) to one code and one logo. The codebase also supports white-label builds, each bound to its own Firebase project.</p>								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-7befe79 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="7befe79" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-e76b81d e-con-full e-flex e-con e-child" data-id="e76b81d" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-b45fb24 e-con-full e-flex e-con e-child" data-id="b45fb24" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-b95083a elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="b95083a" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Team and scope        </div>

        
    
    <h2 class="title">
                Version 3, rebuilt from the list up                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-2f3cbe1 e-con-full e-flex e-con e-child" data-id="2f3cbe1" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-1e5cdc3 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="1e5cdc3" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:100}" data-widget_type="text-editor.default">
									<p>Mobile was ours from the ground up: a full refactor to MVVM with use cases in February 2026, then a performance and stability pass in September 2026, which included bundled fonts, bounded caches, listener-leak fixes, typed errors and a shared HTTP client with timeouts. A team of 15.</p><p>Fully bilingual, with around 660 strings in each of Greek and English and full parity between them. Switching language also switches the speech-recognition language. Account deletion is built into the app, as both stores require. The current release is 3.0.2 (build 343).</p>								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-e04abb2 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="e04abb2" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-5e78469 e-con-full e-flex e-con e-child" data-id="5e78469" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-ab8beec e-con-full e-flex e-con e-child" data-id="ab8beec" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-87ca80e elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="87ca80e" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Technologies        </div>

        
    
    <h2 class="title">
                Stack                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-8464858 e-con-full e-flex e-con e-child" data-id="8464858" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-8382fda elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-invisible elementor-widget elementor-widget-icon-list" data-id="8382fda" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:400}" data-widget_type="icon-list.default">
							<ul class="elementor-icon-list-items">
							<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Mobile: Flutter · Dart · Provider (MVVM) · RxDart</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Identity: Firebase Authentication (email, Google, Apple)</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Real-time data: Cloud Firestore</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">APIs: Agora AI REST API (v3) · Operations API</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Push: Firebase Cloud Messaging</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Storage: Firebase Storage</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Maps &amp; location: OpenStreetMap · Geolocator</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Voice: Platform speech recognition (el-GR / en-US)</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Charts: fl_chart</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-square" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Design: Figma design tokens</span>
									</li>
						</ul>
						</div>
				<div class="elementor-element elementor-element-350b4cb elementor-widget elementor-widget-html" data-id="350b4cb" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div class="su-badge">
  <div class="su-badge__stage">
    <div class="su-badge__tilt">
      <div class="su-badge__ring"></div>
    </div>

    <svg class="su-badge__mark" viewBox="0 0 101 122" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
      <rect x="25.25" y="0"    width="75.75" height="24.4"/>
      <rect x="0"     y="24.4" width="25.25" height="24.4"/>
      <rect x="25.25" y="48.8" width="50.5"  height="24.4"/>
      <rect x="75.75" y="73.2" width="25.25" height="24.4"/>
      <rect x="0"     y="97.6" width="75.75" height="24.4"/>
    </svg>
  </div>
</div>

<style>
  .su-badge {
    display: flex;
    justify-content: center;
    color: #fff;
  }

  .su-badge__stage {
    position: relative;
    width: 280px;
    height: 180px;
    perspective: 9000px;
  }

  .su-badge__tilt {
    position: absolute;
    inset: 0;
    transform: rotateX(28deg);
    transform-style: preserve-3d;
  }

  .su-badge__ring {
    position: absolute;
    inset: 0;
    transform-style: preserve-3d;
    animation: suBadgeSpin 16s linear infinite;
  }

  .su-badge__ch {
    position: absolute;
    left: 50%;
    top: 50%;
    margin: -0.6em 0 0 -0.5em;
    width: 1em;
    font-family: "Open Sans", sans-serif;
    font-size: 18px;
    font-weight: 400;
    line-height: 1.2;
    text-align: center;
    white-space: pre;
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
  }

  .su-badge__mark {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 41px;
    height: 50px;
    transform: translate(-50%, -50%);
    fill: currentColor;
  }

  @keyframes suBadgeSpin {
    from {
      transform: rotateY(0deg);
    }
    to {
      transform: rotateY(360deg);
    }
  }

  @media (prefers-reduced-motion: reduce) {
    .su-badge__ring {
      animation: none;
    }
  }
</style>

<script>
(function () {
  var TEXT = 'THIS PROJECT WAS MADE BY HUMANS \u2022 ';
  var REPEAT = 2;
  var RADIUS = 122;
  var FONT = '700 15px "Open Sans", sans-serif';
  var TRACKING = 1.0;

  function build(root) {
    if (root.hasAttribute('data-su-ready')) return;
    root.setAttribute('data-su-ready', '');

    var ring = root.querySelector('.su-badge__ring');
    if (!ring) return;

    var str = '';
    for (var r = 0; r < REPEAT; r++) str += TEXT;
    var chars = str.split('');
    var n = chars.length;

    var ctx = document.createElement('canvas').getContext('2d');
    ctx.font = FONT;

    var widths = [];
    var total = 0;
    for (var i = 0; i < n; i++) {
      var w = ctx.measureText(chars[i]).width * TRACKING;
      widths.push(w);
      total += w;
    }

    var frag = document.createDocumentFragment();
    var cursor = 0;

    for (var k = 0; k < n; k++) {
      var deg = (cursor + widths[k] / 2) / total * 360;
      cursor += widths[k];

      var out = document.createElement('span');
      out.className = 'su-badge__ch';
      out.textContent = chars[k];
      out.style.transform = 'rotateY(' + deg.toFixed(3) + 'deg) translateZ(' + RADIUS + 'px)';
      frag.appendChild(out);

      var inn = document.createElement('span');
      inn.className = 'su-badge__ch';
      inn.textContent = chars[k];
      inn.style.transform = 'rotateY(' + (180 - deg).toFixed(3) + 'deg) translateZ(' + RADIUS + 'px) rotateY(180deg)';
      frag.appendChild(inn);
    }

    ring.appendChild(frag);
  }

  function init() {
    var all = document.querySelectorAll('.su-badge');
    for (var i = 0; i < all.length; i++) build(all[i]);
  }

  if (document.fonts && document.fonts.ready) {
    document.fonts.ready.then(init);
  } else if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
</script>				</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-6cfe968 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="6cfe968" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
							<div class="elementor-divider">
			<span class="elementor-divider-separator">
						</span>
		</div>
						</div>
		<div class="elementor-element elementor-element-d6a12ab e-con-full e-flex e-con e-child" data-id="d6a12ab" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-add1ce1 e-con-full e-flex e-con e-child" data-id="add1ce1" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-8184cf7 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="8184cf7" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="ohio_heading.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget heading -left">

    
            <div class="subtitle">
            Download mobile app        </div>

        
    
    <h2 class="title">
                Agora AI                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-c9a92c3 e-con-full e-flex e-con e-child" data-id="c9a92c3" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-fbce23f elementor-widget elementor-widget-image" data-id="fbce23f" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
																<a href="https://apps.apple.com/gr/app/agora-ai/id1628286208?l=el" target="_blank" rel="nofollow">
							<img loading="lazy" decoding="async" width="497" height="146" src="https://smartupweb.com/wp-content/uploads/2026/09/apple.png" class="elementor-animation-grow attachment-full size-full wp-image-247580" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/09/apple.png 497w, https://smartupweb.com/wp-content/uploads/2026/09/apple-300x88.png 300w" sizes="(max-width: 497px) 100vw, 497px" />								</a>
															</div>
				<div class="elementor-element elementor-element-201cfa9 elementor-widget elementor-widget-image" data-id="201cfa9" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
																<a href="https://play.google.com/store/apps/details?id=com.push2shop.pushapp&#038;pcampaignid=web_share&#038;pli=1" target="_blank" rel="nofollow">
							<img loading="lazy" decoding="async" width="497" height="146" src="https://smartupweb.com/wp-content/uploads/2026/09/android.png" class="elementor-animation-grow attachment-full size-full wp-image-247581" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/09/android.png 497w, https://smartupweb.com/wp-content/uploads/2026/09/android-300x88.png 300w" sizes="(max-width: 497px) 100vw, 497px" />								</a>
															</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6572417 e-flex e-con-boxed e-con e-parent" data-id="6572417" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-a5bbf2f e-con-full e-flex e-con e-child" data-id="a5bbf2f" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-7b69160 su-cta elementor-widget elementor-widget-ohio_call_to_action" data-id="7b69160" data-element_type="widget" data-e-type="widget" data-widget_type="ohio_call_to_action.default">
				<div class="elementor-widget-container">
					<div class="ohio-widget call-to-action subtitle-bottom" >
    <div class="heading title">

        
        <h2  class="title">
            Tell us what you're building.        </h2>

                    <div class="subtitle" >
                A 30-minute call — no deck, no pitch. You describe the problem, we tell you honestly whether we're the right team for it, and what we'd do first.            </div>
        
    </div>
    <div class="holder">
        <a class="button -default btn-elementor-colored"
            href="/contact/" >
            
                            <svg xmlns="http://www.w3.org/2000/svg" class="su-mark" width="101" height="122" viewBox="0 0 101 122" aria-hidden="true"><style>    .su-mark { color: #053634; }              .su-mark__blk {      fill: currentColor;      transform-box: fill-box;      transform-origin: center;      animation: suSWave 1.5s ease-in-out infinite;    }    .su-mark__b1 { animation-delay: 0s;    }    .su-mark__b2 { animation-delay: 0.11s; }    .su-mark__b3 { animation-delay: 0.22s; }    .su-mark__b4 { animation-delay: 0.33s; }    .su-mark__b5 { animation-delay: 0.44s; }    @keyframes suSWave {      0%, 65%, 100% { opacity: 0.22; transform: scale(0.86); }      22%           { opacity: 1;    transform: scale(1);    }    }    @media (prefers-reduced-motion: reduce) {      .su-mark__blk { animation: none; opacity: 1; transform: none; }    }  </style><rect class="su-mark__blk su-mark__b1" x="25.25" y="0" width="75.75" height="24.4"></rect><rect class="su-mark__blk su-mark__b2" x="0" y="24.4" width="25.25" height="24.4"></rect><rect class="su-mark__blk su-mark__b3" x="25.25" y="48.8" width="50.5" height="24.4"></rect><rect class="su-mark__blk su-mark__b4" x="75.75" y="73.2" width="25.25" height="24.4"></rect><rect class="su-mark__blk su-mark__b5" x="0" y="97.6" width="75.75" height="24.4"></rect></svg>                        
                            <span class="text">Contact us</span>
            
                    </a>
    </div>
</div>				</div>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>The post <a href="https://smartupweb.com/project/agora-ai-smart-shopping-app/">Agora.AI</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
