<?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>iOS &#8211; Smartup</title>
	<atom:link href="https://smartupweb.com/blog/portfolio-tag/ios/feed/" rel="self" type="application/rss+xml" />
	<link></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>iOS &#8211; Smartup</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Stadion Sports Center</title>
		<link>https://smartupweb.com/project/stadion-sports-center/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 12:18:42 +0000</pubDate>
				<guid isPermaLink="false">https://smartupweb.com/?post_type=ohio_portfolio&#038;p=249113</guid>

					<description><![CDATA[<p>Stadion Sports Center A historic sports club, run from one platform. Stadion...</p>
<p>The post <a href="https://smartupweb.com/project/stadion-sports-center/">Stadion Sports Center</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="249113" class="elementor elementor-249113">
				<div class="elementor-element elementor-element-1b52109 e-flex e-con-boxed e-con e-parent" data-id="1b52109" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-4fbed4f e-con-full e-flex e-con e-child" data-id="4fbed4f" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-06baef6 e-con-full e-flex e-con e-child" data-id="06baef6" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-2c3d48d elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="2c3d48d" 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">
                Stadion Sports Center                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-564d59e e-con-full e-flex e-con e-child" data-id="564d59e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ba496d9 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="ba496d9" 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 class="code-line" dir="auto" data-line="17"><strong>A historic sports club, run from one platform.</strong></p><p class="code-line" dir="auto" data-line="19">Stadion is the digital platform of Stadion Sports Center, a historic multi-sport venue with tennis, padel, pickleball, golf simulators, a gym, group classes, a restaurant and a private members&#8217; Clubhouse. It replaces phone calls, spreadsheets and front-desk paperwork with one connected system. Members book a court, invite friends, pay and manage their membership from the web or their phone. Staff run the whole venue from one live back-office: courts, classes, coaches, pricing, memberships, reports and the Clubhouse. We designed and built every part of it: the customer web app, the iOS and Android member app, the staff back-office and the cloud API behind them, connected to Stripe, Salesforce, SoftOne ERP and the venue&#8217;s door-access system.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-b357c3f e-con-full e-flex e-con e-parent" data-id="b357c3f" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
				</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">
                A historic club, run by phone and paper                    </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>Booking a court meant a phone call or a trip to the front desk. Availability lived in spreadsheets, payments and invoices were handled by hand, and member details had to be kept in step across the venue&#8217;s ERP and CRM. Every sport came with its own rules: floodlights after sunset, coaches with their own fees, guests with a yearly visit cap, children booked by their parents, and a cancellation policy that has to be applied fairly every time.</p><p>On top of that sits the Clubhouse, a private members&#8217; club where discretion matters: invitation-only access, event requests, referrals and sensitive health information that has to be protected by law. The venue needed one system that members find effortless, and that staff can trust to apply the rules without exceptions.</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">
                One venue, one live system                    </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>Four parts share one backend. The customer web app and the iOS and Android member app are where members book, pay and manage their membership. The staff back-office is where the front desk, managers and coaches run the venue day to day. A cloud API connects them all, so whatever staff change shows up for members straight away, and the reverse.</p><p>The platform plugs into the systems the venue already runs. Stripe handles card payments, SoftOne ERP keeps customer data and invoicing in step, Salesforce receives Clubhouse accounts, event requests, referrals and approved cases, and Genetec opens the Clubhouse door from a member&#8217;s phone.</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 fetchpriority="high" decoding="async" width="1344" height="800" src="https://smartupweb.com/wp-content/uploads/2026/10/Stadion_Project_Hero_Banner.webp" class="attachment-full size-full wp-image-249119" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Stadion_Project_Hero_Banner.webp 1344w, https://smartupweb.com/wp-content/uploads/2026/10/Stadion_Project_Hero_Banner-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2026/10/Stadion_Project_Hero_Banner-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2026/10/Stadion_Project_Hero_Banner-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/2026/10/Stadion_1-1-scaled.webp" alt="Stadion Sports Center" /><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/Stadion_2-2-scaled.webp" alt="Stadion Sports Center" /><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/Stadion_3-3-scaled.webp" alt="Stadion Sports Center" /><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">
                Book a court in a few taps                    </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">
									The home screen opens on a card for each sport, controlled by the venue from the back-office. Members pick a date and a time window and see every free court, grouped by sport and filterable by features such as Central, Covered, Hard or Clay. The time-slot grid prices the booking as they choose and blocks anything that clashes with their other bookings. Evening slots offer floodlights, because the app knows when the sun sets. Members can add a coach (with the lesson fee shown up front), book for a child on their account, or join a waiting list for a full slot and get it automatically if it frees up. Full Members get an all-day gym pass in one tap, and the restaurant uses the same flow with party size, dietary requirements and special requests.								</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">
                Play together                    </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">
									Members can invite other players to share a court, searching members by name or inviting guests by email. The app checks for duplicates and guest-visit limits, and warns when someone is close to their yearly cap. When the players change, a plain message explains what that means for the price: an extra amount, a refund to the wallet, or a lower balance due. Venue rules say a session has a coach or invited players, never both, and the interface makes that clear without losing anything the member already typed. Invitations from other members arrive with Accept and Decline.								</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">
                A checkout that explains every euro                    </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">
									Bookings wait in a cart with a live countdown while the slots are held. The cost is broken down line by line: court price, peak-hour charges, lights, guests, coach fee, coupons, wallet use and total. Coupons are matched to each booking automatically. Members with saved business details (VAT number, tax office) can choose a formal invoice instead of a receipt. Payment happens on a secure Stripe page, and bookings fully covered by credits confirm instantly. On the web, a personal QR code then works as the member&#8217;s access key to the venue. Before cancelling, members see exactly how much they&#8217;ll get back under the venue&#8217;s policy.								</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">
                A wallet that shows what's really yours                    </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">
									The Stadion Wallet shows three numbers: the available balance, the total balance, and funds held for upcoming bookings, which are charged only once the service has happened and released straight away on cancellation. Members top up by card, filter every transaction by date and type, and keep an eye on their Stadion Points: a weekly court allowance that comes with subscriptions, with a built-in explanation of how points are earned and spent.								</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">
                Classes and coaches                    </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">
									A weekly timetable shows every group class with its coach, studio, price and places left. Members enrol in one tap, join a waitlist when a class is full, and cancel with an automatic refund. The Our Coaches page gives every coach a profile with photo, sports, certifications, years of experience and a bio in Greek and English.								</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">
                The Clubhouse                    </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">
									A private area that appears only for members the venue has invited. From the app, members unlock the Clubhouse door with one tap through the venue&#8217;s access-control system. A three-step wizard books a venue tour or requests a private or corporate event; each request gets a reference code, goes straight to Salesforce, and can be followed from &#8220;under review&#8221; to &#8220;confirmed&#8221;. Members can refer a friend, with an optional supporting document, and follow each referral&#8217;s status. A health profile keeps allergies, conditions and emergency instructions so staff can keep members safe. It is stored only with explicit consent, encrypted, and erased the moment consent is withdrawn. Prospects who aren&#8217;t members yet can use a public version of the event wizard, which creates leads in Salesforce and is protected against spam.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-2beb52e elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="2beb52e" 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-c9256dc e-con-full e-flex e-con e-child" data-id="c9256dc" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-4f021cb e-con-full e-flex e-con e-child" data-id="4f021cb" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-9fabccf elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="9fabccf" 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">
                Running the venue                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-af94a47 e-con-full e-flex e-con e-child" data-id="af94a47" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-988c4fb elementor-invisible elementor-widget elementor-widget-text-editor" data-id="988c4fb" 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 back-office is the venue&#8217;s operating system. A live booking grid shows every court and every slot, colour-coded by status. The front desk books on a member&#8217;s behalf, choosing who pays and who plays, and checks out by wallet, cash or card. Bookings are moved by drag and drop, with every move checked first, and a right-click closes a court for maintenance. A wizard creates recurring series (every Tuesday at 18:00) with coach availability checks. Group programmes have their own calendar, recurrence rules and attendance. Staff set prices per court, guest pricing by plan and sport, booking windows, guest limits and under-18 rules; they configure membership plans and manage subscriptions with proration; they issue campaign coupons and vouchers; and they broadcast messages by push, email and in-app, scheduled in advance. Reports cover court occupancy, revenue, member activity heatmaps and cancellation trends, and every report exports to Excel. Coaches log in to their own portal to see their lessons and classes.								</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">
                One source of truth, many doors                    </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>A REST API on Google Cloud Run in the EU, backed by PostgreSQL, is the single source of truth for bookings, wallets and memberships. The web apps are built in Angular 20 and 19, with standalone components, Signals, lazy loading on every page, and server-side rendering for fast first loads. The member app is built in Flutter for iOS and Android, with a layered structure (screens → view models → services) and reactive streams, so a change to a member&#8217;s balance or Clubhouse access updates every screen on its own. Firebase handles sign-in, with a token checked on every API call, plus push notifications on web and mobile, hosting and media storage. The reasoning behind the mobile app&#8217;s key decisions is written down in fifteen Architecture Decision Records.</p><p>The venue&#8217;s rules are enforced by the platform, not by goodwill. Each membership plan has its own limit on active bookings, with a counter members can see. Members who cancel too often are suspended automatically for a set period, with the end date shown clearly. Under-18 rules are set per sport, academy accounts follow their own simpler rules, and members whose plan doesn&#8217;t include app booking are told to contact the front desk instead of hitting a broken screen. On the staff side, nine roles (Admin, Front Desk, General Manager, Staff, Coach, Academy, Grid Maintainer, Clubhouse Manager and Customer) each get their own permissions and their own start page, enforced in the interface and on the server.</p><p>Privacy and security are designed in. Health data is treated as a special category under GDPR Article 9: explicit consent, encryption, one-click erasure, and every staff view of it audit-logged. Error reports, sent to Sentry, carry only what engineers need: never what a member typed, never health data, and email addresses masked. The web apps ship with a strict Content Security Policy, and payment result pages can&#8217;t be opened by typing their address. The web apps release through GitHub Actions, with a preview link for every pull request and separate staging and production environments.</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">
                Since 2023, from feedback panel to operating system                    </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>Product design, web, mobile, backend and integrations are all ours. A team of 16. That adds up to more than 1,800 commits on the two web apps alone. Along the way:</p>								</div>
				<div class="elementor-element elementor-element-afa1a50 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="afa1a50" data-element_type="widget" data-e-type="widget" 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">2023: the staff back-office, starting as a feedback panel and growing into the venue's operating system</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">2024: wallet and points, coupons, notifications and membership packages</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">2025: launch of the customer web app, with booking for every sport, Stripe payments, QR access and push notifications; in the back-office, the live booking grid, drag and drop, recurring bookings, group programmes, coaches, and the Salesforce and SoftOne integrations</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">Late 2025: family accounts, guest invitations, coach booking, golf simulators, under-18 rules, automatic suspensions and a full visual redesign</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">2026: invoices and detailed cost breakdowns, academy accounts and a new pricing model; then the Clubhouse, with event planning, referrals, GDPR health profiles and its own back-office; and the native member app with door access from the phone</span>
									</li>
						</ul>
						</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">Web: Angular 20 / 19 · TypeScript · Signals · Tailwind CSS · Angular Material</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">Mobile: Flutter · Dart · Flutter Hooks · RxDart · go_router · built_value</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 (EU) · PostgreSQL</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 &amp; messaging: Firebase Authentication · 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">Hosting &amp; storage: Firebase Hosting · 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">Payments: Stripe</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">Business systems: Salesforce · SoftOne ERP</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">Physical access: Genetec</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">Monitoring &amp; delivery: Sentry · GitHub Actions</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 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile 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">
                SKAI.gr                    </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">
															<img 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-201cfa9 elementor-widget elementor-widget-image" data-id="201cfa9" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
															<img 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/stadion-sports-center/">Stadion Sports Center</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SKAI News</title>
		<link>https://smartupweb.com/project/skai-news/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 08:34:13 +0000</pubDate>
				<guid isPermaLink="false">https://smartupweb.com/?post_type=ohio_portfolio&#038;p=249080</guid>

					<description><![CDATA[<p>SKAI The skai.gr newsroom, in your pocket. SKAI News is the official...</p>
<p>The post <a href="https://smartupweb.com/project/skai-news/">SKAI News</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="249080" class="elementor elementor-249080">
				<div class="elementor-element elementor-element-1b52109 e-flex e-con-boxed e-con e-parent" data-id="1b52109" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-4fbed4f e-con-full e-flex e-con e-child" data-id="4fbed4f" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-06baef6 e-con-full e-flex e-con e-child" data-id="06baef6" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-2c3d48d elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="2c3d48d" 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">
                SKAI                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-564d59e e-con-full e-flex e-con e-child" data-id="564d59e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ba496d9 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="ba496d9" 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 class="code-line" dir="auto" data-line="16"><strong>The skai.gr newsroom, in your pocket.</strong></p><p class="code-line" dir="auto" data-line="18">SKAI News is the official news app of SKAI, one of Greece&#8217;s major TV and radio broadcasters. It puts the whole skai.gr newsroom on the phone: top stories, a live news feed, breaking-news alerts, minute-by-minute live blogs, opinion columns, news videos and each morning&#8217;s newspaper front pages. It is free, in Greek, on iPhone and Android, and nobody has to sign up. We have designed, built and looked after the app continuously since January 2020. The current release is 6.9.8.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-b357c3f e-con-full e-flex e-con e-parent" data-id="b357c3f" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
				</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">
                A national newsroom that never stops publishing                    </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>skai.gr publishes all day across 16 categories, runs live blogs for big events, and produces video and opinion alongside the news. Showing all of it to everyone buries the stories each reader actually cares about. Alerting everyone about everything trains people to switch notifications off.</p><p>Readers needed a way to follow their own topics and get alerts only for those, without creating an account. Shared stories had to open properly on the other person&#8217;s phone. And the newsroom could not run a second publishing system just for the app.</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">
                Personal, without an account                    </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 first time the app opens, it quietly creates an anonymous profile in the background. From then on, favourite topics become their own tabs and alert choices are remembered, with no email and no password. Favourites and alert settings are stored in the cloud, and any change reaches the open app immediately.</p><p>The app has no content database of its own. Everything comes straight from skai.gr: articles, categories, top and popular stories, breaking news, live blogs, opinions and videos. When the newsroom renames or reorders a category on the site, the app follows. The app team can also change parts of the layout remotely, with no store update: whether videos appear on Home, compact or full story cards, text sizes, summaries, and the links to SKAI&#8217;s other apps.</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/2026/10/SKAI_Project_Hero_Banner.webp" class="attachment-full size-full wp-image-249085" alt="" srcset="https://smartupweb.com/wp-content/uploads/2026/10/SKAI_Project_Hero_Banner.webp 1344w, https://smartupweb.com/wp-content/uploads/2026/10/SKAI_Project_Hero_Banner-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2026/10/SKAI_Project_Hero_Banner-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2026/10/SKAI_Project_Hero_Banner-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/2026/10/SKAI-1-scaled.webp" alt="SKAI" /><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/SKAI-2-scaled.webp" alt="SKAI" /><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/SKAI-3-scaled.webp" alt="SKAI" /><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">
                Your topics, as tabs                    </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">
									The main navigation is a row of tabs you can swipe across: Home, Feed, your favourite categories, Popular, Front Pages and Videos. Favourites are chosen from a grid of photo tiles with a simple + / ✓ toggle, and every favourite becomes its own tab. Home mirrors the skai.gr front page: the lead story large, the editors&#8217; top stories, a rotating Opinions band, the latest videos and a short section for each category. A story never appears twice.								</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">
                Breaking and live, without refreshing                    </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">
									When the newsroom marks a story as breaking, a bold red banner appears at the top of Home. The app checks for new breaking news every three minutes. For big events a story becomes a live blog, with a pulsing red LIVE BLOGGING label and a timeline of updates that refreshes itself every minute, so readers never have to pull to refresh.								</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">
                A video player that follows you                    </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 play slides the player up from the bottom while the page behind it blurs. Swipe it down and it shrinks into a mini-player bar, so the reader can keep browsing while the video plays. Turn the phone sideways and it goes full-screen. The screen stays awake during playback, and the video pauses when the reader leaves the app.								</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">
                Alerts only for what you follow                    </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">
									Readers choose which categories may send them alerts, with one main switch for all of them. The newsroom sends alerts per category, and each one reaches only the readers who follow that category, with the article&#8217;s photo attached on both iPhone and Android. Tapping an alert opens the story directly, even if the app was closed.								</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">
                Links that open in the right place                    </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">
									Sharing a story or a video creates a link that appears as a rich preview card (headline, summary, image) in WhatsApp, Viber, Messenger and similar apps. If the person receiving it has the app, the link opens that exact story or video in the app. If not, it takes them to the App Store or Google Play. When Google shut down its old link service, we moved the app to a new link system in 2026.								</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">
                The morning's front pages                    </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">
									Each day&#8217;s Greek newspaper front pages, split into political and sports papers, open in a full-screen gallery you can swipe through and pinch to zoom. Header shortcuts lead to the rest of the SKAI family: the SKAI TV and SKAI 100.3 radio apps, Sport FM and the weather.								</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">
                Connected to the newsroom                    </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 reads straight from the skai.gr content feed and keeps no content of its own. A journalist publishes once, and the story appears on the website and in the app together. Every article opened in the app is counted in skai.gr&#8217;s reading statistics, which is what feeds the Popular list.</p><p>Everything personal and everything remote-controlled lives in Firebase. An anonymous identity recognises each reader. Cloud Firestore holds favourites, alert choices and the layout switches, and every open app updates the moment one of them changes. Alerts go through Firebase Cloud Messaging, one topic per category, with a small cloud function attaching the article photo. Share links are served from Firebase Hosting, with a preview page for messaging apps and a hand-off to the app or the store.</p><p>The video player sits above every screen rather than inside one, which is why a video keeps playing while the reader moves around the app.</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">
                Six years and counting                    </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>Design, development and maintenance have all been ours since January 2020. Along the way:</p>								</div>
				<div class="elementor-element elementor-element-afa1a50 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="afa1a50" data-element_type="widget" data-e-type="widget" 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">2020: first build, notifications, link-up with the SKAI Radio app</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">2021: front pages, with categories now coming from skai.gr</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">2022: Breaking News banner, live blogging, X / Instagram / TikTok embeds</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">2025: rebuilt on a fresh, up-to-date Flutter project</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">2026: smart share links, Android 16 support, State Advertising disclosure page</span>
									</li>
						</ul>
						</div>
				<div class="elementor-element elementor-element-7d50f2b elementor-invisible elementor-widget elementor-widget-text-editor" data-id="7d50f2b" 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>Four text sizes that apply to every article, a gentle rate-the-app prompt after about ten launches, and all the legal pages a broadcaster needs, including protection of minors and the yearly state-advertising statement. The current release is 6.9.8 (build 4056).</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</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">Content: skai.gr content feed · Sport FM front-pages feed</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 (anonymous)</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">Preferences &amp; remote settings: 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">Push: Firebase Cloud Messaging · Cloud Functions</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">Share links: Firebase Hosting</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">Analytics: Firebase Analytics</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">
                SKAI.gr                    </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/us/app/skai-gr/id1076335165" target="_blank" rel="nofollow">
							<img 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=gr.skai.skai_android&#038;hl=el" target="_blank" rel="nofollow">
							<img 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/skai-news/">SKAI News</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AthletesWeR</title>
		<link>https://smartupweb.com/project/athleteswer/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 09:51:55 +0000</pubDate>
				<guid isPermaLink="false">https://smartupweb.com/?post_type=ohio_portfolio&#038;p=249018</guid>

					<description><![CDATA[<p>AthletesWeR Every race, every result, one platform. AthletesWeR is a social platform...</p>
<p>The post <a href="https://smartupweb.com/project/athleteswer/">AthletesWeR</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="249018" class="elementor elementor-249018">
				<div class="elementor-element elementor-element-1b52109 e-flex e-con-boxed e-con e-parent" data-id="1b52109" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-4fbed4f e-con-full e-flex e-con e-child" data-id="4fbed4f" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-06baef6 e-con-full e-flex e-con e-child" data-id="06baef6" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-2c3d48d elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="2c3d48d" 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">
                AthletesWeR                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-564d59e e-con-full e-flex e-con e-child" data-id="564d59e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ba496d9 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="ba496d9" 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>Every race, every result, one platform.</strong></p><p><strong>AthletesWeR</strong> is a social platform for amateur athletes in Greece and the organisers who put on their races. Athletes get every race, organised event and casual meetup in one personal calendar, register and pay for entries, and after the race find their official results, statistics and history in the same place, alongside a social feed, chat and group-buy deals on gear. Organisers get one place to publish events, sell tickets and publish results to an audience that&#8217;s already looking for them. We designed, built and run the whole product end to end: the web app at athleteswer.com, the iOS and Android apps, and the backend platform behind them. It has been in continuous development since 2022 and is co-funded by the European Union – NextGenerationEU through the Greece 2.0 programme.</p>								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-b357c3f e-con-full e-flex e-con e-parent" data-id="b357c3f" data-element_type="container" data-e-type="container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
				</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">
                Every race lived somewhere else                    </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>Amateur athletes find races on organisers&#8217; websites, in Facebook groups and by word of mouth. They register on a different page for every event. Results come out as PDFs or on timing sites, and finding your own name across years of races is tedious enough that most people simply don&#8217;t. Training partners are scattered across messaging apps.</p><p>Organisers have the mirror-image problem. They need to publish events, sell entries, publish results and reach athletes, with nothing tying those jobs together. The opportunity was one platform that serves both sides of the start line, and turns a list of events into a community people come back to.</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">
                One platform, two sides of the start line                    </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>Three surfaces run on one backend. The web app at athleteswer.com works on desktop and mobile browsers. The iOS and Android apps are the athlete&#8217;s everyday tool. A back office lets the AthletesWeR team approve organisers and results, and manage campaigns, sponsors and content. There are two account types, athlete and organiser, and the same identity works everywhere. Sign-in takes seconds by phone number (an SMS code), email, Google or Apple, with Facebook as well on mobile.</p><p>Organiser accounts are reviewed before they can publish official events: the organiser applies with company details, logo, VAT number, website and a contact person, and follows the status of the application. The product earns from several directions at once: Premium subscriptions, race ticket sales, group-buy offers on gear, and sponsor and brand placements, each built into the normal flow instead of bolted on.</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/2026/10/Athleteswer_Project_Hero_Banner.webp" class="attachment-full size-full wp-image-249024" alt="Athleteswer" srcset="https://smartupweb.com/wp-content/uploads/2026/10/Athleteswer_Project_Hero_Banner.webp 1344w, https://smartupweb.com/wp-content/uploads/2026/10/Athleteswer_Project_Hero_Banner-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2026/10/Athleteswer_Project_Hero_Banner-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2026/10/Athleteswer_Project_Hero_Banner-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/2026/10/Mockup_framePhone-2-scaled.webp" alt="Mockup_framePhone-2" /><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/Mockup_framePhone-4-scaled.webp" alt="Mockup_framePhone-4" /><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/Mockup_framePhone-5-scaled.webp" alt="Mockup_framePhone-5" /><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">
                Every event, in your calendar                    </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">
									The events feed opens on swipeable sport tabs, with upcoming races, meetups and suggestions picked for each athlete. Official events come from approved organisers and can be grouped into a race series with its own page. Meetups are group runs, rides and training sessions that any athlete can create, with start and finish points picked on a map. Search responds instantly, with filters for sport, town, country, organiser and type, and filters and scroll position are kept when you come back from an event. Each event page has the organiser, dates, an interactive map with start and finish markers, a searchable participant list, a sponsor strip, and results and race photos once it&#8217;s over. The monthly calendar shows colour-coded counts on every day: available events, events you&#8217;re in, and past events.								</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">
                Tickets that fill themselves in                    </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">
									Organisers sell tickets for each race inside an event, with several ticket types and prices, registration windows with deadlines, and sold-out handling. Group and club tickets can require a minimum number of participants. Each organiser designs their own registration form, with text, number, date, multiple-choice and email fields, and the form is filled in automatically from the athlete&#8217;s profile. Payment happens on a secure Stripe checkout, followed by a confirmation page, an email receipt and an in-app notification. Every purchase stays in the athlete&#8217;s history with its registration and transaction numbers.								</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">
                Results, uploaded once and found for you                    </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">
									Organisers upload official results straight from an Excel file, one table per race, with overall, age-group and gender rankings, bib numbers, start and finish times, and triathlon splits (swim, T1, bike, T2, run). Every upload is checked by the admin team before it&#8217;s published. Then the automatic results finder does the searching for the athlete: with one tap it scans every published result for their name. Clear matches are saved to their profile, and possible matches are shown with names masked for privacy, so the athlete can confirm or hide each one. Results can also be claimed straight from any results table.								</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">
                A season's work, in numbers                    </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">
									Premium turns an athlete&#8217;s results into a performance dashboard. It has a level and XP, a leaderboard with gold, silver and bronze medals, and a full personal history that can be filtered by sport and year and sorted by date, rank or finish time. Monthly charts track distance, time and participations over 3, 6 or 12 months, and a map shows every race the athlete has completed. Premium is sold through Stripe on the web and through the App Store and Google Play in the apps.								</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">
                Share it with people who don't have the app                    </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">
									Any result card, chart or race map can be shared as a link to a public page that works without an account. Each athlete also gets a public performance résumé, a page with their profile and race history that appears with a rich preview image when shared on social media. A branded photo creator takes a race photo, adds a stylish fade and the AthletesWeR logo, and lets the athlete download it or post it straight to the feed.								</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">
                A community built around the start line                    </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">
									The feed has two streams: Following for people you follow, and Sports for activity in your sports. Posts carry text and up to five photos, can be linked to an event you took part in, and show instant likes and view counts. Athletes follow each other, become friends when the follow is mutual, and can block or report a profile. Joining an event adds you automatically to its group chat. There are also private chats and custom groups, with emojis, attachments up to 25 MB (images, inline videos and files), read status and unread badges. Chat search ignores accents and understands Greek typed in Latin letters. Strangers are limited to one message until it&#8217;s accepted, which keeps spam out.								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-b71c612 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="b71c612" 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-7a0ea2d e-con-full e-flex e-con e-child" data-id="7a0ea2d" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-71a0890 e-con-full e-flex e-con e-child" data-id="71a0890" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-6fb19cc elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="6fb19cc" 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">
                Group buying that only charges when it works                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-582eff8 e-con-full e-flex e-con e-child" data-id="582eff8" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-c8522e5 elementor-invisible elementor-widget elementor-widget-text-editor" data-id="c8522e5" 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 apps, the Crowdfunding section offers limited-time group-buy deals on clothes, shoes, accessories and nutrition. Each offer shows the retail price next to the offer price, a countdown and a progress bar toward the number of participants needed. The athlete&#8217;s payment is held until the offer closes. If enough people join, the order goes ahead and ships. If not, nobody is charged.								</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">
                One backend for every screen                    </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 web app is built in Angular and the mobile apps in Flutter, and both talk to the same platform: a versioned cloud API on Google Cloud Run, with endpoints for users, events, results, social, chat, search, payments, campaigns and forms, plus Firebase Cloud Functions for serverless logic. Firebase Authentication handles every sign-in method, and each account is mirrored on the AthletesWeR server so one identity works everywhere. Cloud Firestore holds users, events and chat rooms. The Firebase Realtime Database carries everything that has to be instant: chat messages, typing indicators, unread counters and live notifications. Public pages get server-side social previews, so a shared link always shows a proper image and title.</p><p>The rules of the platform are explicit. Organisers are approved before they publish. Results uploads are reviewed before they go live. Events move from submitted to approved or rejected, with listed, draft or private visibility. Result matching never attributes a result to the wrong person without the athlete&#8217;s confirmation. One subscription gate decides whether to show Premium content or an upsell, so the free/paid boundary is identical on web and mobile. Card payments happen only on hosted Stripe pages or through the app stores, and the server confirms every order before notifying the athlete.</p><p>The team can steer the platform without a release. A bilingual maintenance page switches on in seconds on web and mobile, the apps can show a soft or mandatory update prompt, and legal pages are edited from the CMS. Development, testing and production are separate environments with one-command deployment. Every feed uses infinite scrolling and pagination so large lists stay fast, and errors are reported to Sentry in real time.</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">
                Since 2022, end to end                    </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>Product design, web, mobile and backend are all ours. That adds up to more than 690 commits on the web app and about 880 on the mobile apps. Along the way:</p>								</div>
				<div class="elementor-element elementor-element-afa1a50 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="afa1a50" data-element_type="widget" data-e-type="widget" 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">Late 2022: core platform launch, with events, calendar, profiles, chat, phone login and maps</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">2023: rebrand from Match Racers to AthletesWeR, referral programme, organiser accounts, first results features</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">2024: social feed, follows and friends, full Greek/English support, new login, a new high-performance backend; then Excel results upload, race series, Premium subscriptions, performance statistics and brand campaigns</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">2025: public shareable stats pages, race ticketing with custom registration forms, and a complete visual redesign</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">2026: automatic results finder, public performance résumé, maintenance mode and ticket-form autofill</span>
									</li>
						</ul>
						</div>
				<div class="elementor-element elementor-element-7d50f2b elementor-invisible elementor-widget elementor-widget-text-editor" data-id="7d50f2b" 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>Bilingual throughout, in the interface, the sport names and the legal content. The project &#8220;A social platform for amateur athletes with event/meetup calendar, features and more&#8221; is part of the Greece 2.0 national recovery and resilience plan, funded by the European Union – NextGenerationEU.</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">Web: Angular · TypeScript · RxJS · Angular Material · Tailwind CSS</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">Mobile: Flutter · Dart</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: API on Google Cloud Run · Firebase Cloud Functions</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 (phone, email, Google, Apple, Facebook on mobile)</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">Data: Cloud Firestore · Firebase Realtime Database · 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">Search: Algolia</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: Stripe · RevenueCat with App Store and 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">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">Maps &amp; charts: Google Maps &amp; Places · Chart.js</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">Monitoring: Sentry · Firebase Analytics · Google Analytics</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">
                AthletesWeR                    </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/athleteswer/id1664178620" target="_blank" rel="nofollow">
							<img 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.smartup.match_racers_app" target="_blank" rel="nofollow">
							<img 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/athleteswer/">AthletesWeR</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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 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 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>AHEPA Connect</title>
		<link>https://smartupweb.com/project/ahepa-connect/</link>
		
		<dc:creator><![CDATA[Smartup]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 06:41:32 +0000</pubDate>
				<guid isPermaLink="false">https://smartupweb.com/?post_type=ohio_portfolio&#038;p=247720</guid>

					<description><![CDATA[<p>The Problem Everything lived in three places and none of them talked...</p>
<p>The post <a href="https://smartupweb.com/project/ahepa-connect/">AHEPA Connect</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="247720" class="elementor elementor-247720">
				<div class="elementor-element elementor-element-6884f6b e-flex e-con-boxed e-con e-parent" data-id="6884f6b" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-251441a e-con-full e-flex e-con e-child" data-id="251441a" data-element_type="container" data-e-type="container">
		<div class="elementor-element elementor-element-1ce8559 e-con-full e-flex e-con e-child" data-id="1ce8559" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-e21ee33 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="e21ee33" 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">
                AHEPA                    </h2>

    
    
</div>				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-b57833e e-con-full e-flex e-con e-child" data-id="b57833e" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-732806f elementor-invisible elementor-widget elementor-widget-text-editor" data-id="732806f" 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>One codebase. One branded app per district.</strong></p><p><strong>AHEPA CONNECT</strong> is a fraternal organisation with districts across Greece and the United States, each running its own chapters, events and members. We built a member app that ships as a separate branded product for every district, from a single Flutter codebase and one API. District 25 went live for its 1,500 members in Greece. District 6, New York, is built and waiting on the store.</p>								</div>
				</div>
				</div>
					</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">
                Everything lived in three places and none of them talked                    </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>Chapter secretaries kept member lists in spreadsheets that were already out of date by the time they were shared. Event announcements went out on Viber and email, and whoever showed up, showed up — attendance was a printed sheet and a pen at the door, if that. Subscriptions were tracked in a notebook per chapter, which meant nobody at district level could answer a simple question like who has paid this year. News was published on the district website and then re-typed, badly, into whatever channel reached members first.</p><p>Every district had the same problem and had solved it slightly differently, so there was nothing to standardise on. The obvious answer — build one app for AHEPA — was wrong: a member in Thessaloniki and a member in New York have different chapters, different languages, different governing documents, and no reason to see each other&#8217;s content.</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 product, not a project                    </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 member app on iOS and Android, a REST API that serves every district from one deployment, and a web dashboard where administrators do the work that used to happen in spreadsheets.</p><p>The app is usable before you sign in. A visitor browsing the store gets the district&#8217;s news, chapters and upcoming events with no account, hitting the sign-in wall only on the personal parts — their card, their dues, their documents. That one decision removed the biggest source of drop-off for an organisation whose members are not all comfortable creating accounts.</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 loading="lazy" decoding="async" width="1344" height="800" src="https://smartupweb.com/wp-content/uploads/2026/04/AHEPA-CONNECT-banner.webp" class="attachment-full size-full wp-image-248769" alt="AHEPA CONNECT" srcset="https://smartupweb.com/wp-content/uploads/2026/04/AHEPA-CONNECT-banner.webp 1344w, https://smartupweb.com/wp-content/uploads/2026/04/AHEPA-CONNECT-banner-300x179.webp 300w, https://smartupweb.com/wp-content/uploads/2026/04/AHEPA-CONNECT-banner-1024x610.webp 1024w, https://smartupweb.com/wp-content/uploads/2026/04/AHEPA-CONNECT-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 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-scaled.webp" alt="AHEPA Connect-Membership Card" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_2-scaled.webp" alt="" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-scaled.webp" alt="AHEPA Connect-Finances" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="4 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-scaled.webp" alt="AHEPA Connect-Finances" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="5 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_6-scaled.webp" alt="AHEPA Connect-My Profile" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="6 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_7-scaled.webp" alt="AHEPA Connect-Member Directory" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="7 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-scaled.webp" alt="AHEPA Connect-Event Management" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="8 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-scaled.webp" alt="AHEPA Connect-Event Management" /><div class="swiper-lazy-preloader"></div></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="9 of 9"><figure class="swiper-slide-inner"><img class="swiper-slide-image swiper-lazy" data-src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-scaled.webp" alt="AHEPA Connect-Create Event" /><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">
                The membership card is also the ticket                    </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>Every member carries a digital card with their name, member number, chapter and role, and a QR code bound to their ID. At an event, the chapter administrator opens the scanner, scans the card, and the scanner immediately re-arms for the next person. Attendance is recorded as people walk in, including anyone who turned up without declaring. The same object solves identity and check-in, so there is nothing extra to hand out and nothing to lose.</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 loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-scaled.webp" class="attachment-full size-full wp-image-248773" alt="AHEPA Connect-Membership Card" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_1-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">
                Events that go through approval, not through a group chat                    </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>Chapter administrators create events; the district administrator approves before anything is published. Members declare attendance or interest and the counter updates live. Afterwards, administrators see who actually came, and members see their own history — which events they made, which they missed.</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 loading="lazy" decoding="async" width="1260" height="2560" src="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-scaled.webp" class="attachment-full size-full wp-image-248780" alt="AHEPA Connect-Event Management" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_8-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				<div class="elementor-element elementor-element-f7f4b73 elementor-widget elementor-widget-image" data-id="f7f4b73" 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/AHEPA-Connect_10-scaled.webp" class="attachment-full size-full wp-image-248785" alt="AHEPA Connect-Create Event" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_10-1008x2048.webp 1008w" sizes="(max-width: 1260px) 100vw, 1260px" />															</div>
				<div class="elementor-element elementor-element-e917d12 elementor-widget elementor-widget-image" data-id="e917d12" 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/AHEPA-Connect_9-scaled.webp" class="attachment-full size-full wp-image-248781" alt="AHEPA Connect-Event Management" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_9-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">
                Published once, everywhere                    </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>District 25 runs a WordPress site, District 6 runs Wix. Content approved in the app publishes to the site, and changes made on the site come back into the app. Nobody re-types anything. The server knows, per district, where to publish and how, so connecting a new district&#8217;s site is configuration, not a release.</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">
                Dues, finally in one ledger                    </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>Subscriptions, event charges and other debts are issued per member, with an amount, a period and a status. Members see what they owe and what they have paid, split into two tabs with a running total. Administrators see the same thing across a chapter or the whole district, and mark entries as settled. Payment itself still happens the way it always has, in person or by transfer — the app is the record of who owes what, not a payment processor.</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/AHEPA-Connect_3-scaled.webp" class="attachment-full size-full wp-image-248775" alt="AHEPA Connect-Finances" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_3-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/AHEPA-Connect_4-scaled.webp" class="attachment-full size-full wp-image-248776" alt="AHEPA Connect-Finances" srcset="https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/10/AHEPA-Connect_4-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/04/Finances_AHEPA-Connect-scaled.webp" class="attachment-full size-full wp-image-248786" alt="AHEPA Connect-Finances" srcset="https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-scaled.webp 1260w, https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-148x300.webp 148w, https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-504x1024.webp 504w, https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-768x1561.webp 768w, https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-756x1536.webp 756w, https://smartupweb.com/wp-content/uploads/2026/04/Finances_AHEPA-Connect-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">
                An assistant that cites its sources                    </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>District 25 bundles its Statute and Regulations in the app, so we put a retrieval-backed assistant in front of them. Ask a question about the organisation and the answer expands to show the documents it came from. It accepts voice input in Greek or English. District 6 does not have it, and in that build the screen, the entry point and the route do not exist in the binary at all.</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>
				</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">
                Adding a district is adding one line                    </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>Every fact that differs between districts — brand name, bundle id, default language, which manuals ship, whether the AI assistant exists — lives in a single enum. No screen in the app checks which district it is running in. When we add a district, the compiler lists everything that has to change, and a build with a missing configuration does not compile rather than shipping a wrong default.</p><p>The same discipline runs through the API. Every request carries the district it belongs to, and permission is checked three ways before anything executes: who you are, what role you hold, and whether the thing you are touching belongs to your chapter. A member of one district cannot use another district&#8217;s app, and the rule lives in one place.</p><p>The result is that District 6 — different brand, different language, different governing documents, no AI — took a fraction of the effort of District 25, and none of it was rework.</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 admin dashboard were all ours. A team of twelve: product design lead, mobile developers, web developers, backend.</p><p>Bilingual throughout, 281 translated strings per language, light and dark themes, and a separate accent palette for administrator screens so privileged actions never look like ordinary ones. iOS release is automated end to end — the build asserts its own bundle id, version, signing certificate and push entitlement before it is allowed near TestFlight.</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</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: NestJS · 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">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">Data: PostgreSQL · SQLite (on-device)</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: Retrieval-backed assistant on 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">Admin: Firebase-hosted web dashboard</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">
                AHEPA CONNECT                    </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-4f03ef0 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="4f03ef0" 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>

        
    
    <h4 class="title">
                AHEPA CONNECT D25, Greece                    </h4>

    
    
</div>				</div>
				</div>
				<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">
																<a href="https://apps.apple.com/gr/app/ahepa-hellas/id6764537323" target="_blank" rel="nofollow">
							<img 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-ad1b17d elementor-widget elementor-widget-image" data-id="ad1b17d" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
																<a href="https://play.google.com/store/apps/details?id=com.smartupweb.ahepa25&#038;hl=el" target="_blank" rel="nofollow">
							<img 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 class="elementor-element elementor-element-e0e4979 e-con-full e-flex e-con e-child" data-id="e0e4979" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-ade56e1 elementor-invisible elementor-widget elementor-widget-ohio_heading" data-id="ade56e1" 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>

        
    
    <h4 class="title">
                AHEPA CONNECT D6, New York                    </h4>

    
    
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-2b73e72 elementor-widget elementor-widget-image" data-id="2b73e72" 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="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-ad0ce28 elementor-widget elementor-widget-image" data-id="ad0ce28" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
																<a href="https://play.google.com/store/apps/details?id=com.smartupweb.ahepa6" target="_blank" rel="nofollow">
							<img 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/ahepa-connect/">AHEPA Connect</a> appeared first on <a href="https://smartupweb.com">Smartup</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
