<?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>Projekte Archives - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/category/studium/studium-projekte/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/category/studium/studium-projekte/</link>
	<description>Die &#34;Mobile Forschungsgruppe&#34; der USTP, sie  sammelt hier alles zu den Themen Design, UX und Entwicklung mobiler Applikationen</description>
	<lastBuildDate>Tue, 20 Jan 2026 11:23:05 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mobile.fhstp.ac.at/wp-content/uploads/2025/03/icon-120x120.webp</url>
	<title>Projekte Archives - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/category/studium/studium-projekte/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Print2Mobile Event registration tool</title>
		<link>https://mobile.fhstp.ac.at/allgemein/print2mobile-event-registration-tool/</link>
		
		<dc:creator><![CDATA[Clemens Kavan]]></dc:creator>
		<pubDate>Tue, 21 Oct 2025 13:59:49 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Print2Mobile]]></category>
		<category><![CDATA[QR-Code]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15013</guid>

					<description><![CDATA[<p>Introduction Working in event management and also as staff during some of Austria’s biggest festivals, you start noticing some problems when it comes to registration of your clients: The company I currently work with (Adrenalin Company) specialises in the renting and operation high-thrill event tools that have certain risks associated to them in the event <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/print2mobile-event-registration-tool/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/print2mobile-event-registration-tool/">Print2Mobile Event registration tool</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Introduction</h2>



<p class="wp-block-paragraph">Working in event management and also as staff during some of Austria’s biggest festivals, you start noticing some problems when it comes to registration of your clients: The company I currently work with (Adrenalin Company) specialises in the renting and operation high-thrill event tools that have certain risks associated to them in the event of misuse. Therefore, participants are required to sign so called liability exclusion disclaimers before attending.</p>



<h2 class="wp-block-heading">The problem</h2>



<div class="wp-block-group is-content-justification-left is-nowrap is-layout-flex wp-container-core-group-is-layout-fbe4aca3 wp-block-group-is-layout-flex">
<p class="wp-block-paragraph">Currently, this process is very time-consuming, since every single person needs to read, fill out and sign these papers by hand, one by one. Apart from the need for thousands of printed sheets of paper per event, which then have to be scanned manually at the end of an event, this system causes long queue times and an overall mixed customer experience. This is exaggerated by the disclaimer being mostly printed in German, which makes it inaccessible for international guests.</p>
</div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1233" height="1746" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-220033.png" alt="" class="wp-image-15015" style="width:331px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-220033.png 1233w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-220033-1085x1536.png 1085w" sizes="(max-width: 1233px) 100vw, 1233px" /><figcaption class="wp-element-caption"><em>Disclaimer</em> <em>(German version) </em></figcaption></figure>
</div>


<h2 class="wp-block-heading">Solution</h2>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<p class="wp-block-paragraph">With this Print2Mobile prototype, I aimed to simplify and reduce the time needed for this necessary procedure: Outside the event booth and next to the queue line, a poster would be installed. It contains a QR code that directs participants to a website where they can read the legal document and fill out a form.</p>
</div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="1183" height="1678" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-222326.jpg" alt="" class="wp-image-15023" style="width:278px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-222326.jpg 1183w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-222326-1083x1536.jpg 1083w" sizes="(max-width: 1183px) 100vw, 1183px" /></figure>
</div>


<p class="wp-block-paragraph">Clients can read the liability exclusion disclaimer and sign it easily using their smartphone. Not only does this reduce the need for printed forms, but it also allows all participants to sign simultaneously, reducing overall wait time. After filling out and submitting the form, the participants are given a personalised QR-code that contains all the relevant information for us organisers.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img decoding="async" width="636" height="1360" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-222649.png" alt="" class="wp-image-15021" style="width:267px;height:auto"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="637" height="1357" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Screenshot-2025-10-19-222805.png" alt="" class="wp-image-15022" style="width:268px;height:auto"/></figure>
</div>
</div>
</div></div>



<h2 class="wp-block-heading">Future</h2>



<p class="wp-block-paragraph">In future versions of this tool, the website would display the information in the system-used language, making it more accessible. The submitted information would be stored securely on a dedicated server for the legally required duration. On the other hand, there is a need to develop a specialised QR-code scanner application, that can read the participants codes and cross check them with the database in order to check their validity.</p>



<p class="wp-block-paragraph">All in all, a user would first scan the QR-code on the poster and read, sign and submit the disclaimer. Then they would go to the event booth, where a staff member would scan each participant’s personalised code to verify its validity before they can enjoy the attraction.</p>



<p class="wp-block-paragraph"><strong>Disclaimer:</strong><em> </em><strong>This project is not associated with BAGJUMP in any way. It is a purely academic student project, created for educational purposes only.</strong></p>



<p class="wp-block-paragraph">Link to the website: <a href="https://karavam.github.io/QR-Code-Website/">https://karavam.github.io/QR-Code-Website/</a></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/print2mobile-event-registration-tool/">Print2Mobile Event registration tool</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Print2Mobile &#124; TrackBack Vienna &#8211; Get to know Viennas Subway System (Print2Mobile Project)</title>
		<link>https://mobile.fhstp.ac.at/studium/studium-projekte/trackback-vienna-get-to-know-viennas-subway-system-print2mobile-project/</link>
		
		<dc:creator><![CDATA[Daniel Studera]]></dc:creator>
		<pubDate>Fri, 17 Oct 2025 10:10:21 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14877</guid>

					<description><![CDATA[<p>Vienna’s subway system is one of the best in the world. It currently consists of five lines, with a sixth one under construction. While building the stations and tunnels over the past 47 years, the architects had to work around basements, the sewage system, and the Wienfluss. That’s why many stations have an interesting history <a class="read-more" href="https://mobile.fhstp.ac.at/studium/studium-projekte/trackback-vienna-get-to-know-viennas-subway-system-print2mobile-project/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/trackback-vienna-get-to-know-viennas-subway-system-print2mobile-project/">Print2Mobile | TrackBack Vienna &#8211; Get to know Viennas Subway System (Print2Mobile Project)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Vienna’s subway system is one of the best in the world. It currently consists of five lines, with a sixth one under construction. While building the stations and tunnels over the past 47 years, the architects had to work around basements, the sewage system, and the Wienfluss. That’s why many stations have an interesting history and appear somewhat unstructured, which can make them difficult to navigate.</p>



<p class="wp-block-paragraph">My idea was to create a virtual museum that can be accessed via QR codes printed on ads displayed directly in the stations. This way, people can learn about the station’s history while waiting for the train, riding it, or exploring the station. The aim is to make the project appealing not only to tourists but also to locals.</p>



<p class="wp-block-paragraph">For my poster and prototype, I chose Karlsplatz Station as an example because it has a fascinating history and is notoriously difficult to navigate due to its many levels and countless exits.</p>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="725" height="1024" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Frame-3-2.png" alt="" class="wp-image-14886" style="width:409px;height:auto"/></figure>
</div>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">The slogan on the poster plays with the phrase “finding out”, which not only refers to literally finding a way out of the complex passages and levels of Karlsplatz, but also to discovering the station’s history. The language is English because many tourists pass through Karlsplatz every day. When the campaign is implemented for other stations, such as Seestadt, which is mainly used by locals, a German version of the poster would make more sense. This particular poster could be displayed not only on the platforms but also near the exits, as the advertisement directly references that scenario.</p>



<figure class="wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14889" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Station-Karlsplatz.png" alt="" class="wp-image-14889"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14888" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Stationen.png" alt="" class="wp-image-14888"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14890" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Map.jpg" alt="" class="wp-image-14890"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14887" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/More.png" alt="" class="wp-image-14887"/></figure>
</figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">After scanning the QR code, the content page for Karlsplatz opens. It contains four paragraphs focusing on the history, construction, and current role of Karlsplatz, supported by relevant images. There is also an option to listen to the content, the audio version should not exceed five minutes to keep the information concise and engaging. The language can be changed as well.</p>



<p class="wp-block-paragraph">If you’re interested in the history of other stations, you can visit the station overview and search for them. There is also a map where you can check out your surroundings and nearby stations. In the “More” section, there could be items such as the imprint, data policies, contact information, or links to other services and apps provided by the City of Vienna.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>This Project is just a concept and not affiliated with Wiener Linien in any way. It is a purely academic student project, created for educational purposes only. No financial support, sponsorship, or compensation has been received from Wiener Linien or any other company. Any use of names or logos is solely for demonstration purposes within the prototype.</strong> </p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Sources:</p>



<ul class="wp-block-list">
<li>Person auf dem Poster: Foto von <a href="https://unsplash.com/de/@nate_dumlao?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Nathan Dumlao</a> auf <a href="https://unsplash.com/de/fotos/mann-im-grauen-rundhalshemd-mit-braunen-haaren-rWJ2RthM-gc?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></li>



<li>Karlsplatzbild: Foto von <a href="https://unsplash.com/de/@shery0101?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Shery Arturova</a> auf <a href="https://unsplash.com/de/fotos/ein-grun-weisses-gebaude-mit-einer-grunen-tur-V_j2ogDY5Vw?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></li>



<li>Karte von https://www.openstreetmap.org/#map=15/48.18031/16.36414</li>



<li>Baustelle Karlsplatz Bild: https://newsv2.orf.at/stories/2424487/2425558/</li>



<li>United kingdom icons created by Freepik &#8211; Flaticon: https://www.flaticon.com/free-icons/united-kingdom</li>
</ul>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/trackback-vienna-get-to-know-viennas-subway-system-print2mobile-project/">Print2Mobile | TrackBack Vienna &#8211; Get to know Viennas Subway System (Print2Mobile Project)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Print2Mobile &#124; Dishcovery</title>
		<link>https://mobile.fhstp.ac.at/studium/print2mobile-dishcovery/</link>
		
		<dc:creator><![CDATA[Kevin Kraushofer]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 10:31:34 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14879</guid>

					<description><![CDATA[<p>(QR Codes in the pictures have no functionality) We’ve all been there, standing in front of the fridge or in the supermarket aisle not knowing what to cook. Meanwhile, tons of perfectly good food end up in the trash every day. Dishcovery aims to change that.With a simple scan at your local supermarket or your <a class="read-more" href="https://mobile.fhstp.ac.at/studium/print2mobile-dishcovery/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/print2mobile-dishcovery/">Print2Mobile | Dishcovery</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph" style="font-size:9px">(QR Codes in the pictures have no functionality)</p>



<p class="wp-block-paragraph">We’ve all been there, standing in front of the fridge or in the supermarket aisle not knowing what to cook. Meanwhile, tons of perfectly good food end up in the trash every day.</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<p class="wp-block-paragraph"><strong>Dishcovery</strong> aims to change that.<br>With a simple scan at your local supermarket or your advertising in the letterbox, the app instantly shows you recipes that match your preferences <em>and</em> the store’s current stock including products nearing their expiry date. But that’s not all: you can also add ingredients you already have at home, and Dishcovery will automatically include them in the recipe suggestions. Every recipe comes with clear quantities, can be saved to your favorites and added directly to a digital shopping list. The app also shows how many products you’ve helped rescue, turning sustainability into something measurable and rewarding.</p>
</div>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14898" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Homepage-1.png" alt="figma prototype Homepage recipe" class="wp-image-14898"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14899" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/homepage2.png" alt="figma prototype Homepage ingredients" class="wp-image-14899"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14897" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Filter.png" alt="figma prototype filterpage overview" class="wp-image-14897"/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="852" data-id="14896" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/Filter2.png" alt="figma prototype filterpage whats in your kitchen page." class="wp-image-14896"/></figure>
</figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Dishcovery not only inspires creativity in the kitchen — it makes sustainability simple, digital, and rewarding.</p>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="840" height="1188" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/website-mit-fake-qr-code-1-1.jpg" alt="" class="wp-image-14919" style="width:376px;height:auto"/></figure>
</div>


<p class="wp-block-paragraph"><strong>This project is not affiliated with BILLA or the REWE Group in any way. It is a purely academic student project, created for educational purposes only. No financial support, sponsorship, or compensation has been received from BILLA or any other company. Any use of names or logos is solely for demonstration purposes within the prototype.</strong></p>



<p class="wp-block-paragraph">iPhone design by Luis Orea<br>Icons designed by Kryston Schwarze https://coolicons.cool/<br>Illustrations/Icons designed by Freepick www.freepik.com</p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/print2mobile-dishcovery/">Print2Mobile | Dishcovery</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt SS25 &#124; MixMatch (Fortsetzung)</title>
		<link>https://mobile.fhstp.ac.at/allgemein/projekt-ss25-mixmatch-fortsetzung/</link>
		
		<dc:creator><![CDATA[Andreas Kaiser]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 08:54:14 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14351</guid>

					<description><![CDATA[<p>Nach der ersten Umsetzungsphase habe ich entschlossen mit dem Projekt: Mix &#38; Match nun in die zweite Runde zu gehen. Aufbauend auf dem bisherigen Konzept und dem erhaltenen Feedback der Lektoren wurde die App gezielt weiterentwickelt und technisch auf ein neues Niveau gehoben. Der Fokus lag dabei auf der nativen Umsetzung, der Optimierung bestehender Funktionen <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/projekt-ss25-mixmatch-fortsetzung/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-ss25-mixmatch-fortsetzung/">Projekt SS25 | MixMatch (Fortsetzung)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nach der ersten Umsetzungsphase habe ich entschlossen mit dem Projekt: Mix &amp; Match nun in die zweite Runde zu gehen. Aufbauend auf dem bisherigen Konzept und dem erhaltenen Feedback der Lektoren wurde die App gezielt weiterentwickelt und technisch auf ein neues Niveau gehoben. Der Fokus lag dabei auf der nativen Umsetzung, der Optimierung bestehender Funktionen sowie der vollständigen Integration teils nur angedachter Features aus dem ersten Prototypen. Ergänzt wurde die Anwendung um ein neues, zentrales Feature: die sogenannten &#8220;Signature Drinks&#8221; – individuell erstellbare Rezepturen, die das Angebot an bestehenden Anleitungen zur Getränkemischung erweitert. Bevor ich näher auf die Fortschritte eingehe, möchte ich in aller Kürze das für die native Entwicklung genutzte Framework beschreiben &#8211; und zwar:</p>



<h2 class="wp-block-heading">Nativescript &#8211; eine kurze Vorstellung</h2>



<figure class="wp-block-image size-large"><img decoding="async" src="data:image/jpeg;base64,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" alt=""/></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Mit <strong>NativeScript</strong>, das 2015 auf den Markt kam, wurde ein Framework präsentiert, das plattformübergreifende mobile Apps ermöglicht und zugleich direkten Zugriff auf die nativen Funktionen von Android und iOS bietet. Seit dessen Einführung wird es kontinuierlich weiterentwickelt und hat sich zu einer stabilen Lösung für die App-Entwicklung etabliert. NativeScript erlaubt es, Apps mit bekannten Web-Technologien wie JavaScript, TypeScript, Angular oder Vue.js zu erstellen, wodurch der Einstieg für Web-Entwickler besonders einfach ist. Gleichzeitig werden die UI-Komponenten direkt nativ gerendert, was eine nahezu maximale Leistung gewährleistet. Ein Großteil des Codes kann zwischen Android und iOS weiterverwendet werden, wodurch Entwicklungszeit und -kosten reduziert werden. Damit kombiniert NativeScript die Vorteile plattformübergreifender Entwicklung mit direktem API-Zugriff und nativer Performance.</p>



<p class="wp-block-paragraph">Mit diesem Wissen im Gepäck gelang es mir meine Erstentwicklung als reine WebApp in Angular ohne grundlegenden Neuanfang im nativen Bereich durchführen. Das hat mir die Möglichkeit eröffnet viele Teile der ursprünglichen Angular-Programmierung in eine App zu übertragen, auch wenn dies mit einer gewissen Komplexität einherging.</p>



<h2 class="wp-block-heading">Von einer Web-App zu einer nativen App</h2>



<p class="wp-block-paragraph">Der Wechsel von der ursprünglichen Angular Web-App zu einer nativen App mit NativeScript stellte einen entscheidenden Entwicklungsschritt dar. Während die erste Version ausschließlich im Browser funktionierte und auf klassische Web-Komponenten ausgelegt war, verlagerte sich der Fokus nun auf die mobile Nutzung, native Performance und eine tiefere Integration in die jeweilige Plattform. Diese Veränderung erforderte nicht nur technisches Know-how, sondern auch ein grundlegendes Umdenken im App-Design. Die Benutzeroberfläche musste für mobile Endgeräte neu konzipiert werden, denn alleine responsive Layouts reichten nicht mehr aus. Stattdessen waren eine intuitive Navigation, Gestensteuerung und schnelle Ladezeiten gefragt. Technisch konnten viele Angular-Module und Services zwar grundsätzlich übernommen werden, jedoch waren umfangreiche Anpassungen notwendig, insbesondere beim Routing, der Datenbindung und dem Zugriff auf systemnahe Funktionen wie dem Dateispeicher.</p>



<h2 class="wp-block-heading">Optimierter Suchalgorithmus</h2>



<p class="wp-block-paragraph">Der ursprüngliche Suchalgorithmus stellte einen klaren Engpass dar, da jede Filteranfrage direkt an die externe API gesendet wurde. Das führte zu langen Ladezeiten und unnötiger Netzwerklast. </p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.34%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a69c2d741378&quot;}" data-wp-interactive="core/image" data-wp-key="6a69c2d741378" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1180" height="1536" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/image-1.jpg" alt="" class="wp-image-14823"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Alter (langsamer) Suchalgo. direkt über die API</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a69c2d7417f6&quot;}" data-wp-interactive="core/image" data-wp-key="6a69c2d7417f6" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1324" height="1531" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/api_data_loader_into_db.png" alt="" class="wp-image-14832"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Methode, um die Drink-Daten der API in eine lokale DB zu übertragen</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a69c2d741bfb&quot;}" data-wp-interactive="core/image" data-wp-key="6a69c2d741bfb" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1398" height="2010" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/filter_method_recipes_over_db-2.jpg" alt="" class="wp-image-14834" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/filter_method_recipes_over_db-2.jpg 1398w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/filter_method_recipes_over_db-2-1068x1536.jpg 1068w" sizes="auto, (max-width: 1398px) 100vw, 1398px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Logik des neuen Suchalgo. (Daten werden direkt aus lok. DB geholt)</figcaption></figure>
</div>
</div>



<p class="wp-block-paragraph">Mit dem neuen, optimierten Ansatz werden die Rezeptdaten nun beim Start der Anwendung automatisch aus der API geladen und in die lokale Datenbank geschrieben. Die Suche erfolgt anschließend vollständig serverseitig über diese Datenbank, wodurch Abfragen deutlich schneller und stabiler laufen. Gleichzeitig bleibt die Filterlogik flexibel: Nutzer:innen können nach Kategorie, Alkoholgehalt und Zutaten suchen, ohne dass alle Kriterien zwingend gesetzt sein müssen.</p>



<h2 class="wp-block-heading">Die &#8220;Signature&#8221;-Drinks</h2>



<p class="wp-block-paragraph">Dieses neue Feature bietet dem/der User:in die Möglichkeit, sich seinen/ihren Drink (Cocktail) selbst nach eigenen Wünschen zusammenzustellen. Diese Drinks in Form von Rezepten werden entsprechend gekennzeichnet und sind mit dem/der Ersteller:in verknüpft. Die Datenspeicherung erfolgt in der selben Tabelle, wo die Drink Rezepte der API abgespeichert sind. Nach dem Anlegen eines &#8220;Signature&#8221;-Drinks stehen dem/der Ersteller:in die Möglichkeit zur Verfügung den Drink . Hier ein Blick in die App (Bild folgt):</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Weitere Features/Verbesserungen</h2>



<h3 class="wp-block-heading">Redesign</h3>



<p class="wp-block-paragraph">Mit dem Wechsel von einer WebApp auf eine native Mobile-App wurde das bestehende Design nicht vollständig neu entwickelt, sondern gezielt modernisiert und an mobile Nutzungsszenarien angepasst. Der Fokus lag dabei auf einer klareren visuellen Struktur, einer verbesserten Bedienbarkeit sowie einem konsistenten Erscheinungsbild über alle Ansichten hinweg.</p>



<p class="wp-block-paragraph">Ein wesentlicher Schritt war die Umstellung des UI-Designs auf das Utility-First-Framework <strong>Tailwind CSS</strong>, das eine deutlich effizientere Gestaltung und höhere Flexibilität bei der Komponentenentwicklung ermöglicht. Dadurch konnten wiederkehrende Layouts vereinheitlicht, Abstände und Typografie präzise gesteuert und das gesamte Erscheinungsbild minimalistischer und moderner gestaltet werden.</p>



<h3 class="wp-block-heading">Zutaten Suchfunktion</h3>



<p class="wp-block-paragraph">Bisher musst man sich durch eine lange Liste von Zutaten &#8220;quälen&#8221; &#8211; mit einem neuen Suchfeld bei den Zutaten wurde dies nun deutlich vereinfacht.</p>



<h2 class="wp-block-heading">Herausforderungen im Entwicklungsprozess</h2>



<p class="wp-block-paragraph">Anbei zwei wesentliche Herausforderungen, die sich während der Entwicklungsarbeit zunehmend herauskristallisiert haben:<br><br>Die mobile Umsetzung von MixMatch mit NativeScript und Angular brachte einige technische und strukturelle Herausforderungen mit sich. Der Umstieg von der bisherigen Angular-Webumgebung auf NativeScript erforderte eine Einarbeitung in neue Syntaxkonzepte und native UI-Komponenten. Viele Layouts und Funktionen ließen sich nicht direkt übernehmen, sondern mussten gezielt an mobile Anforderungen angepasst werden. Zudem NativeScript auch noch ein sehr &#8220;junges&#8221; natives Framework ist und die Dokumentation derzeit noch nicht als allzu ausgereift erscheint.<br><br>Gleichzeitig wurde deutlich, dass Teile des bestehenden Codes, insbesondere im Hinblick auf Wartbarkeit und Performance auf mobilen Geräten, zu komplex aufgebaut waren. Um dem entgegenzuwirken, habe ich z. B. Übersetzungen in separate Lokalisations-Files ausgelagert, anstatt sie direkt im Code zu halten. Auch die Datenverarbeitung wurde angepasst: Statt verschachtelter Aufrufe zu der thecocktaildb API erfolgt die Filterung nun über eine lokale Datenbank, nachdem alle Daten der externen API einmalig gespeichert wurden.</p>



<h2 class="wp-block-heading">Resümee mit Ausblick</h2>



<p class="wp-block-paragraph">Das Projekt stellte in mehrfacher Hinsicht eine wertvolle Lernerfahrung dar – insbesondere durch den mutigen Schritt, mit NativeScript in ein für mich völlig neues Framework einzusteigen. Dieser Ansatz bot die Gelegenheit, die Stärken und Schwächen der Plattform unmittelbar kennenzulernen: Auf der einen Seite die hohe Flexibilität, die tiefe Integration nativer Funktionen und die Möglichkeit, moderne Frontend-Technologien wie Angular und Tailwind zu kombinieren; auf der anderen Seite aber auch die typischen Herausforderungen eines jungen Frameworks – etwa eingeschränkte Dokumentation, komplexe Build-Prozesse und teils unerwartete Kompatibilitätsprobleme.</p>



<p class="wp-block-paragraph">Gerade dieser direkte Umgang mit den Schattenseiten und positiven Aspekten des Frameworks hat jedoch den größten Lerneffekt gebracht. Es entstand ein tieferes Verständnis für mobile App-Architekturen, die Bedeutung einer sauberen Code-Struktur.</p>



<p class="wp-block-paragraph">Auch nach Abschluss dieser Entwicklungsphase bleiben einige naheliegende Erweiterungen vorstellbar, die sich mittelfristig umsetzen lassen. Dazu zählt etwa eine Kommentarfunktion, mit der Nutzer:innen direkt Rückmeldung zu einzelnen Drinks geben oder sich austauschen können. Ebenso wäre es denkbar, die „Signature Drinks“ für andere sichtbar zu machen. Mit der individuellen Möglichkeit, eigene Rezepturen anderen Usern/Userinnen sichtbar zu machen, können persönliche Rezeptideen einem weiten Publikum präsentiert werden.<br>Ergänzend ließe sich eine einfache Einkaufsliste integrieren, in der fehlende Zutaten gesammelt und als Liste exportiert werden könnte. Diese funktionalen Erweiterungen würden, wie üblich, Hand in Hand mit weiterem Bugfixing, Code-Optimierungen und kleineren UI-Verbesserungen erfolgen, um die App sowohl technisch als auch inhaltlich weiter zu stabilisieren, der Benutzerfreundlichkeit hin zu optimieren und auszubauen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Beitragsbild</strong>: dieses wurde mittels Einsatz von KI erzeugt</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-ss25-mixmatch-fortsetzung/">Projekt SS25 | MixMatch (Fortsetzung)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; Powda Club-Dashboard</title>
		<link>https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/</link>
		
		<dc:creator><![CDATA[David Grünberger]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 01:25:15 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[clerk]]></category>
		<category><![CDATA[convex]]></category>
		<category><![CDATA[Next.js]]></category>
		<category><![CDATA[Semesterprojekt]]></category>
		<category><![CDATA[shadcn]]></category>
		<category><![CDATA[stripe]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[webhooks]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14812</guid>

					<description><![CDATA[<p>Im Rahmen des Semesterprojekts im zweiten Semester der Masterklasse Mobile habe ich ein Club Dashboard entwickelt – eine Webanwendung, mit der Skiclubs ihre Ausfahrten verwalten und Teilnehmer:innen direkt online buchen und bezahlen lassen können.Ziel des Projekts war es, einen funktionsfähigen MVP (Minimum Viable Product) zu erstellen, der eine vollständige End-to-End-Integration für Zahlungen bietet – von <a class="read-more" href="https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/">Projekt | Powda Club-Dashboard</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Im Rahmen des Semesterprojekts im zweiten Semester der Masterklasse Mobile habe ich ein <strong>Club Dashboard</strong> entwickelt – eine Webanwendung, mit der Skiclubs ihre <strong>Ausfahrten verwalten</strong> und <strong>Teilnehmer:innen direkt online buchen und bezahlen</strong> lassen können.<br>Ziel des Projekts war es, einen <strong>funktionsfähigen MVP (Minimum Viable Product)</strong> zu erstellen, der eine vollständige End-to-End-Integration für Zahlungen bietet – von der Erstellung der Events bis zur erfolgreichen Bezahlung über die Website.</p>



<p class="wp-block-paragraph">In diesem Beitrag möchte ich den Aufbau der Anwendung, die verwendeten Technologien sowie einige Herausforderungen und Learnings während der Umsetzung vorstellen.</p>



<h2 class="wp-block-heading">Technologie-Stack</h2>



<p class="wp-block-paragraph">Das Club Dashboard wurde als moderne Webanwendung mit Fokus auf Skalierbarkeit, Sicherheit und einfache Erweiterbarkeit entwickelt.<br>Hier ein Überblick über die zentralen Technologien:</p>



<h3 class="wp-block-heading">Framework: Next.js (App Router)</h3>



<p class="wp-block-paragraph">Für das Frontend kam <strong>Next.js</strong> mit dem neuen <strong>App Router</strong> zum Einsatz. Diese Architektur erlaubt serverseitiges Rendering (SSR), API-Routen und eine saubere Trennung von Client- und Server-Komponenten. Dadurch konnte ich sowohl UI-Logik als auch Backend-Funktionalität innerhalb eines Frameworks umsetzen.</p>



<p class="wp-block-paragraph"><strong>Vorteile:</strong></p>



<ul class="wp-block-list">
<li>Serverseitiges Rendering für bessere Performance und SEO</li>



<li>Integrierte API-Routen für serverseitige Logik (z. B. Payment Handling)</li>



<li>Moderne Struktur durch den App Router</li>
</ul>



<h3 class="wp-block-heading">Data Layer: Convex</h3>



<p class="wp-block-paragraph">Anstatt einer klassischen REST- oder GraphQL-API habe ich mich für <strong>Convex</strong> entschieden – eine innovative Backend-as-a-Service-Lösung, die reaktive Datenabfragen, serverseitige Funktionen und Auth-Integration out of the box bietet.</p>



<p class="wp-block-paragraph"><strong>Convex</strong> ermöglicht es, Daten- und Serverlogik in TypeScript zu schreiben und nahtlos mit dem Frontend zu verbinden. Dadurch entfällt ein Großteil der sonst notwendigen API- und Datenbankkonfiguration.</p>



<h3 class="wp-block-heading">Styling &amp; UI: TailwindCSS &amp; shadcn</h3>



<p class="wp-block-paragraph">Für das Styling habe ich auf <strong>TailwindCSS</strong> gesetzt – ein Utility-First-CSS-Framework, das schnelles Prototyping und einheitliches Design ermöglicht.<br>Zusätzlich kam <strong>shadcn</strong> zum Einsatz, eine leichtgewichtige Component Library mit Fokus auf Barrierefreiheit, Dark Mode und Customizability.</p>



<p class="wp-block-paragraph"><strong>Vorteile dieser Kombination:</strong></p>



<ul class="wp-block-list">
<li>Konsistentes UI mit klarer Design-Sprache</li>



<li>Wiederverwendbare Komponenten</li>



<li>Effiziente Entwicklung durch Utility-Klassen</li>



<li>Code Ownership: Components werden einfach ins Projekt kopiert</li>
</ul>



<h3 class="wp-block-heading">Authentifizierung: Clerk</h3>



<p class="wp-block-paragraph">Die Authentifizierung wird durch <strong>Clerk</strong> umgesetzt – denselben Anbieter, den ich bereits im ersten Semesterprojekt genutzt habe. Clerk bietet ein modernes User Management inklusive OAuth-Integration und JWT-Handling, was eine einfache Verbindung mit Convex und Next.js ermöglicht.</p>



<p class="wp-block-paragraph">Durch Clerk konnte ich schnell eine sichere Login-, Logout- und Session-Logik aufsetzen, ohne selbst komplexe Authentifizierungssysteme implementieren zu müssen.</p>



<h3 class="wp-block-heading">Payment Provider: Stripe</h3>



<p class="wp-block-paragraph">Ein zentrales Feature dieses Projekts war die <strong>Integration von Stripe</strong> als Payment Provider. Nutzer:innen können direkt über die Website eine Skiausfahrt buchen und bezahlen.<br>Dazu wurde das Stripe Checkout-System in die App eingebunden – inklusive <strong>Webhook-Handling</strong>, um Payment-Status-Änderungen serverseitig zu verarbeiten.</p>



<p class="wp-block-paragraph"><strong>Beispielhafte Flows:</strong></p>



<ul class="wp-block-list">
<li>User wählt eine Ausfahrt aus → Klick auf „Buchen“</li>



<li>Stripe Checkout öffnet sich → Zahlung erfolgt</li>



<li>Stripe sendet einen Webhook an das System → Buchung wird bestätigt und gespeichert</li>
</ul>



<p class="wp-block-paragraph">Diese End-to-End-Integration war der Kern des Projekts und erforderte ein gutes Zusammenspiel zwischen <strong>Frontend, Convex Backend und Stripe Webhooks</strong>.</p>



<h2 class="wp-block-heading">Kommunikation &amp; Webhooks</h2>



<p class="wp-block-paragraph">Ein spannender Teil des Projekts war die <strong>Kommunikation zwischen den verschiedenen Systemen</strong>.<br>Sowohl Stripe als auch Clerk arbeiten mit <strong>Webhooks</strong>, um Echtzeit-Informationen an das System zu senden (z. B. erfolgreiche Zahlungen oder neue Benutzer).<br>Die Webhooks werden über API-Routen in Next.js empfangen und anschließend in Convex weiterverarbeitet – beispielsweise um Buchungsdaten zu aktualisieren oder Rechnungen zu speichern.</p>



<h2 class="wp-block-heading">Herausforderungen &amp; Learnings</h2>



<p class="wp-block-paragraph">Während der Entwicklung gab es mehrere interessante Herausforderungen:</p>



<ul class="wp-block-list">
<li><strong>Webhook-Handling:</strong> Das Zusammenspiel von Stripe, Clerk und Convex erfordert saubere Trennung von Sicherheits- und Logikschichten. Insbesondere das Validieren von Webhook-Signaturen war anfänglich fehleranfällig.</li>



<li><strong>Datenmodellierung in Convex:</strong> Da Convex ein eigenes Datenmodell nutzt, war es notwendig, sich in dessen Schema-System einzuarbeiten.</li>



<li><strong>SSR + Client-Komponenten:</strong> Der Wechsel zwischen Server- und Client-Komponenten im Next.js App Router war zunächst ungewohnt und erforderte ein gutes Verständnis des Rendering-Modells.</li>
</ul>



<p class="wp-block-paragraph">Trotz dieser Hürden war die Entwicklung äußerst lehrreich – vor allem im Hinblick auf <strong>Payment-Flows, Security und API-Kommunikation</strong>.</p>



<h2 class="wp-block-heading">Fazit</h2>



<p class="wp-block-paragraph">Das Club Dashboard war ein spannendes Projekt, das mir erstmals die Umsetzung einer <strong>vollständigen End-to-End-Integration mit Stripe</strong> ermöglicht hat.<br>Durch den Einsatz moderner Tools wie <strong>Next.js, Convex, Clerk und Stripe</strong> konnte ich einen funktionalen MVP umsetzen, der reale Buchungsprozesse abbildet.</p>



<p class="wp-block-paragraph">Besonders interessant war zu sehen, wie gut sich die verschiedenen Services über <strong>Webhooks und API-Routen</strong> integrieren lassen – und wie wichtig saubere Datenflüsse und Sicherheit in einem Payment-System sind.</p>



<p class="wp-block-paragraph">Im nächsten Schritt plane ich, das Dashboard um weitere Funktionalitäten zu erweitern, um einem produktionsreifen Produkt näher zu kommen, das sich veröffentlichen und vertreiben lässt.</p>



<h2 class="wp-block-heading">Screenshots</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1996" height="1594" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/landing_page.jpg" alt="" class="wp-image-14844" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/landing_page.jpg 1996w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/landing_page-1536x1227.jpg 1536w" sizes="auto, (max-width: 1996px) 100vw, 1996px" /><figcaption class="wp-element-caption">Screenshot: Landing Page</figcaption></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1993" height="1591" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/ausfahrten.png" alt="" class="wp-image-14845" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/ausfahrten.png 1993w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/ausfahrten-1536x1226.png 1536w" sizes="auto, (max-width: 1993px) 100vw, 1993px" /><figcaption class="wp-element-caption">Screenshot: Ausfahrtenliste mit Buchungsoption</figcaption></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2011" height="1600" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/dashboard.png" alt="" class="wp-image-14847" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/dashboard.png 2011w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/dashboard-1536x1222.png 1536w" sizes="auto, (max-width: 2011px) 100vw, 2011px" /><figcaption class="wp-element-caption">Screenshot: Ausfahrtenverwaltung am Dashboard</figcaption></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1990" height="1429" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/zahlungsinfos.png" alt="" class="wp-image-14848" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/zahlungsinfos.png 1990w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/zahlungsinfos-1536x1103.png 1536w" sizes="auto, (max-width: 1990px) 100vw, 1990px" /><figcaption class="wp-element-caption">Screenshot: Eingebettete Stripe Account Komponenten am Dashboard</figcaption></figure>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/">Projekt | Powda Club-Dashboard</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; Recipe Scanner</title>
		<link>https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-recipe-scanner/</link>
		
		<dc:creator><![CDATA[Jan Weiß]]></dc:creator>
		<pubDate>Wed, 01 Oct 2025 20:20:45 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web-App]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14785</guid>

					<description><![CDATA[<p>Do you have a collection of printed or handwritten recipes you’d like to digitize? You’ve come to the right place! This tool makes it easy to convert photos of your recipes into a machine-readable format. The output format is a subset of the&#160;schema.org Recipe&#160;and can be expanded (merge request are welcome). How it works The <a class="read-more" href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-recipe-scanner/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-recipe-scanner/">Projekt | Recipe Scanner</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Do you have a collection of printed or handwritten recipes you’d like to digitize? You’ve come to the right place!</p>



<p class="wp-block-paragraph"><a href="https://github.com/realJanWeiss/recipe-scanner">This tool</a> makes it easy to convert photos of your recipes into a machine-readable format.</p>



<p class="wp-block-paragraph">The output format is a subset of the&nbsp;<a href="https://schema.org/Recipe">schema.org Recipe</a>&nbsp;and can be expanded (merge request are welcome).</p>



<h2 class="wp-block-heading">How it works</h2>



<p class="wp-block-paragraph">The Recipe Scanner is a web application built with the Nuxt framework. Through its user interface, you can upload photos of recipes, which are stored on the server. The server then sends the images, along with a prompt, to a vision Large Language Model (LLM). The LLM extracts the relevant recipe information and formats it as specified. Finally, the server validates the structure of the returned data and sends it back to the client.</p>



<h2 class="wp-block-heading">Technical considerations</h2>



<p class="wp-block-paragraph">This application was created for personal use (I wanted to digitize many old and messy recipes from my school days) and for experimentation so it is not designed to be fully “production-ready.” This influenced some of my technical choices.</p>



<p class="wp-block-paragraph">For instance, I wanted to try out running a vision LLM on my own machine instead of using a hosted service. I tried out <a href="https://ollama.com/">Ollama</a> and <a href="https://lmstudio.ai/">LM Studio</a> and opted for the latter because its interface made managing connections easier. In principle, Ollama should also work.</p>



<p class="wp-block-paragraph">I also tried out several models. I began with the smalles vision-enabled Gemma 3 model (4B parameters, 3.3 GB). Unfortunately, it made many errors when extracting recipe data. Hosted models such as ChatGPT-5 and Mistral (Large?) performed much better, proving the task was feasible for LLMs. Among open-weight models, Mistral Small 3.2 (24B parameters, 15 GB) was the first that consistently produced accurate results. It’s possible that bigger Gemma 3 models (e.g., 12B) or specialized models like LLaVA, could also perform well or even better. If you test them, I’d be interested in hearing your results.</p>



<p class="wp-block-paragraph">Another unusual design choice is how persistence is handled. Since this is a personal project, I opted for simplicity. The server does not use a database. There are no user accounts and images and parsed recipe data are saved directly to the server&#8217;s file system. To simulate a multi-user experience, each user only sees their own recipes. This is managed on the client side by storing image IDs in the browser’s IndexedDB. IndexedDB is not the ideal tool for this, but I wanted to experiment with it.</p>



<h2 class="wp-block-heading">Next steps</h2>



<p class="wp-block-paragraph">My immediate goal is to digitize my collection of printed and handwritten recipes. Once that data is gathered, I plan to use both the images and extracted recipe information to fine-tune a smaller, more efficient model specifically optimized for this task.</p>



<p class="wp-block-paragraph">Link to the repository: <a href="https://github.com/realJanWeiss/recipe-scanner">https://github.com/realJanWeiss/recipe-scanner</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-recipe-scanner/">Projekt | Recipe Scanner</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; QR Reader for Mac</title>
		<link>https://mobile.fhstp.ac.at/development/native-development/projekt-qr-reader-for-mac/</link>
		
		<dc:creator><![CDATA[Jan Weiß]]></dc:creator>
		<pubDate>Mon, 29 Sep 2025 21:26:10 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[QR]]></category>
		<category><![CDATA[swift]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14750</guid>

					<description><![CDATA[<p>Ever come across a QR code on your MacBook and wished you could scan it directly without reaching for your phone? This app makes that possible. Features Future versions may include more data types — contributions are welcome! How It Works Simply launch the app, point your MacBook’s camera at a QR code, and the <a class="read-more" href="https://mobile.fhstp.ac.at/development/native-development/projekt-qr-reader-for-mac/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/native-development/projekt-qr-reader-for-mac/">Projekt | QR Reader for Mac</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ever come across a QR code on your MacBook and wished you could scan it directly without reaching for your phone? <a href="https://github.com/realJanWeiss/QR-reader-for-Mac">This app</a> makes that possible.</p>



<h2 class="wp-block-heading">Features<a href="https://github.com/realJanWeiss/QR-reader-for-Mac#features"></a></h2>



<ul class="wp-block-list">
<li>Scan QR codes using your MacBook’s built-in camera</li>



<li>Keep a searchable history of scanned codes</li>



<li>Enhanced support for:
<ul class="wp-block-list">
<li>Website links (open directly in your browser)</li>



<li>Contact data in&nbsp;<strong>vCard</strong>&nbsp;format</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Future versions may include more data types — contributions are welcome!</p>



<h2 class="wp-block-heading">How It Works<a href="https://github.com/realJanWeiss/QR-reader-for-Mac#how-it-works"></a></h2>



<p class="wp-block-paragraph">Simply launch the app, point your MacBook’s camera at a QR code, and the app will recognize it instantly. Your scans are stored in your history so you can revisit them at any time.</p>



<figure class="wp-block-image size-full is-style-default"><a href="https://mobile.fhstp.ac.at/wp-content/uploads/2025/09/QR-Reader-for-Mac-screenshot-1.jpg"><img loading="lazy" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/09/QR-Reader-for-Mac-screenshot-1.jpg" alt="" class="wp-image-14780" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/09/QR-Reader-for-Mac-screenshot-1.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/09/QR-Reader-for-Mac-screenshot-1-770x400.jpg 770w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/09/QR-Reader-for-Mac-screenshot-1-1536x798.jpg 1536w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a><figcaption class="wp-element-caption">Screenshot of the application.</figcaption></figure>



<h2 class="wp-block-heading">Contributing<a href="https://github.com/realJanWeiss/QR-reader-for-Mac#contributing"></a></h2>



<p class="wp-block-paragraph">If you’d like to add support for additional QR code data types:</p>



<ol class="wp-block-list">
<li>Implement a new&nbsp;<code>HistoryItemData</code></li>



<li>Add it to&nbsp;<code>QRCodeUtils.historyItemDataFromQRCode</code></li>



<li>Create a view that extends&nbsp;<code>HistoryItemViewBase</code></li>



<li>Integrate your view into&nbsp;<code>HistoryItemView</code></li>
</ol>



<p class="wp-block-paragraph">We welcome pull requests and improvements from the community.</p>



<h2 class="wp-block-heading">Development<a href="https://github.com/realJanWeiss/QR-reader-for-Mac#development"></a></h2>



<p class="wp-block-paragraph">The application is written in Swift and uses SwiftUI and only native packages. To run the project locally:</p>



<ol class="wp-block-list">
<li>Clone the repository</li>



<li>Open the project in&nbsp;<strong>Xcode</strong></li>



<li>Build and run</li>
</ol>



<p class="wp-block-paragraph">That’s it — you’re ready to go!</p>



<h2 class="wp-block-heading">Other thoughts</h2>



<p class="wp-block-paragraph">A long time ago, I learned a bit of JavaFX and Swing. Since then, I have been working on web projects and mainly developing user interfaces with the frontend framework Vue, though I am also familiar with Angular and React. With this background, I was excited to write my first native macOS application.</p>



<p class="wp-block-paragraph">What surprised me immediately was how easy it was to create and style UI components. With very little code, I was able to build attractive layouts, apply colors (also supporting dark mode!), add shadows, and even implement subtle animations. Coming from a web-development background, I had mixed feelings about the lack of separation between templates and styles that I observed in the code examples online. The code I saw (and wrote) was essentially equivalent to defining CSS rules directly in an element’s style attribute. I’m sure there are cleaner approaches that I have yet to discover.</p>



<p class="wp-block-paragraph">Another interesting aspect of the macOS development ecosystem is the simplicity and richness of the system APIs. Want to save a contact to the OS&#8217;s contact book or detect a QR code? There is a native package that can be imported with a single line, usually just two words (e.g., import Vision). In general, importing code is very straightforward, and code inside a module is automatically available everywhere. This simplicity does have a downside: it can make it less clear where a piece of code comes from and how different units are related.</p>



<p class="wp-block-paragraph">While developing data classes to represent various scanned QR code data formats, I encountered an unpleasant aspect of Swift. I needed classes to represent scanned QR codes containing plain data, contact information, or website links. All QR code entries share certain properties, such as the date they were scanned or had to implement a certain method. I initially wanted to capture this relationship with an abstract class, (e.g., HistoryItem being extended by a ContactHistoryItem).</p>



<p class="wp-block-paragraph">The first thing I discovered was that Swift does not have abstract classes; instead, it uses protocols, which worked fine for my use case. However, I then found that I could not use my protocol as a type for collections. I also tried created a generic HistoryItem holding a ContactHistoryItemData implementing the HistoryItemData protocol. But this also didn&#8217;t work. The common Swift approach seems to be a wrapper class to erase the type. As a result, I ended up with a HistoryItem holding an AnyHistoryItemData that contains an object conforming to the HistoryItemData protocol. Having to implement type erasure instead of using generics felt somewhat unsatisfying and slightly clouded my impression of the language.</p>



<p class="wp-block-paragraph">If I am missing any important details, please let me know! I am looking forward to your feedback and hope to learn some tricks for designing Swift code more effectively and elegantly.</p>



<p class="wp-block-paragraph">Link to the repository: <a href="https://github.com/realJanWeiss/QR-reader-for-Mac">github.com/realJanWeiss/QR-reader-for-Mac</a></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/native-development/projekt-qr-reader-for-mac/">Projekt | QR Reader for Mac</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
