<?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>Thu, 17 Sep 2026 09:37:10 +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>OnTime V2</title>
		<link>https://mobile.fhstp.ac.at/allgemein/ontime-v2/</link>
					<comments>https://mobile.fhstp.ac.at/allgemein/ontime-v2/#respond</comments>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:37:09 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[supabase]]></category>
		<category><![CDATA[Typescript]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15971</guid>

					<description><![CDATA[<p>OnTime started because I didn&#8217;t want to pay for a time tracker. Version one only had that traccker and one Tauri 2 codebase that shipped to the web, Windows and Android. V2 lives in a new repository, but it is of course built on Version one. The tracker is still at its core and around <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/ontime-v2/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/ontime-v2/">OnTime V2</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">OnTime started because I didn&#8217;t want to pay for a time tracker. Version one only had that traccker and one Tauri 2 codebase that shipped to the web, Windows and Android.</p>



<p class="wp-block-paragraph">V2 lives in a new repository, but it is of course built on Version one. The tracker is still at its core and around it, OnTime now handles teams, invoices and payments.</p>



<h2 class="wp-block-heading">What changed</h2>



<p class="wp-block-paragraph">In V1, one person tracked their own time but in V2, everything happens inside <strong>workspaces</strong>. A workspace can consist of just you or a whole team and every member has one of four roles: owner, admin, manager or member.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-1540x800.png" alt="" class="wp-image-15973" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-770x400.png 770w" sizes="(max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">But the basics are of course still there: a timer, manual entries and clients, projects and tasks with their own detail pages. The calendar is now shared and even updates live across devices. Projects can have budgets that send a notification when they cross a threshold. The whole app is in English and German and on mobile it works offline thanks to a persisted query cache.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Dark-1540x800.png" alt="" class="wp-image-15974" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Dark-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Dark-770x400.png 770w" sizes="(max-width: 1540px) 100vw, 1540px" /></figure>



<h2 class="wp-block-heading">Invoices and payments<br></h2>



<p class="wp-block-paragraph">This is where V2 changes the most from its previous version. Billable time becomes an invoice and when you send it, an Edge Function renders it as a PDF and <strong>freezes</strong> it. If you edit the underlying time entries later, the document the client already received doesn&#8217;t change.</p>



<p class="wp-block-paragraph">Additionally, OnTime connects to your bank through <strong>Enable Banking</strong>. The connection is read-only by design and you bring your own credentials, which are stored encrypted in Supabase Vault. A scheduled pg_cron job pulls in transactions and matches them against open invoices. When a match is confident, the invoice is marked paid automatically. Everything else waits in a queue for one-click review.<br></p>



<h2 class="wp-block-heading">Database changes</h2>



<p class="wp-block-paragraph">V1&#8217;s database only had to serve one person tracking their own hours. V2 needed a real data model, so I didn&#8217;t patch the old schema and started from the start.</p>



<p class="wp-block-paragraph">As said before, <strong>Everything belongs to a workspace</strong>: Clients, projects, tasks, time entries and invoices all hang off a workspace and every row knows which workspace it belongs to. That one change is what makes teams possible. It&#8217;s also what the security model is built on.</p>



<p class="wp-block-paragraph">Also, every table has row-level security policies that check the caller&#8217;s workspace and role before returning a single row. Views run with <code>security_invoker</code>, so they apply the permissions of the person querying them instead of quietly bypassing them. Owners, admins, managers and members all hit the same tables and get different answers. Since the frontend isn&#8217;t trusted to enforce any of this, pgTAP suites test the rules against a real database.</p>



<p class="wp-block-paragraph">Another security measure was to add a timestamp to entries when they get deleted. Now they are moved to a trash view, where they can be restored. A pg_cron job purges them for good once they&#8217;ve been in the trash long enough, so nobody has to clean up by hand.</p>



<p class="wp-block-paragraph">An invoice can&#8217;t point at time entries and hourly rates, because those can change or be edited. When an invoice is sent, it stores a JSONB snapshot of everything it was built from and the PDF is frozen alongside it. Rates also keep a history, so billing a project in March uses March&#8217;s rate even if it went up in June. Invoice numbers are generated per workspace and restart each year.</p>



<p class="wp-block-paragraph">pg_cron also triggers the bank sync so that transactions come in on a schedule, get matched against open invoices and confident matches mark the invoice as paid. The bank credentials never sit in a plain column and are encrypted in Supabase Vault.</p>



<p class="wp-block-paragraph">The shared calendar and the notifications subscribe to database changes through Supabase Realtime. When someone stops a timer on their phone, the entry shows up on everyone else&#8217;s desktop without a refresh.</p>



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



<p class="wp-block-paragraph">Tests run in three layers:</p>



<ul class="wp-block-list">
<li><strong>Vitest</strong> for units and components</li>



<li><strong>Playwright</strong> end-to-end tests against a preview build</li>



<li><strong>pgTAP</strong> for the security rules</li>
</ul>



<p class="wp-block-paragraph">Unit and end-to-end coverage are combined into one number and uploaded to Codecov on every CI run. Right now I have about 40% coverage but that will still be improved in later versions.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" width="1540" height="800" data-id="15980" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-1-1540x800.png" alt="" class="wp-image-15980" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-1-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Dark-1-770x400.png 770w" sizes="(max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15978" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Light-1540x800.png" alt="" class="wp-image-15978" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Calendar-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15983" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Dark-1540x800.png" alt="" class="wp-image-15983" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Dark-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Dark-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15985" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Light-1540x800.png" alt="" class="wp-image-15985" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoice-Detail-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15984" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Dark-1540x800.png" alt="" class="wp-image-15984" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Dark-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Dark-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15982" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Light-1540x800.png" alt="" class="wp-image-15982" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Invoices-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15981" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Light-1540x800.png" alt="" class="wp-image-15981" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Overview-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="680" data-id="15977" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Payment-Review-Dark-1-1540x680.png" alt="" class="wp-image-15977"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="680" data-id="15979" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Payment-Review-Light-1540x680.png" alt="" class="wp-image-15979"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15987" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Dark-1540x800.png" alt="" class="wp-image-15987" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Dark-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Dark-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15988" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-1540x800.png" alt="" class="wp-image-15988" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>
</figure>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/ontime-v2/">OnTime V2</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mobile.fhstp.ac.at/allgemein/ontime-v2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Designing a Calm Planning Experience: From Wireframes to a Coherent Visual Identity</title>
		<link>https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/</link>
					<comments>https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/#respond</comments>
		
		<dc:creator><![CDATA[Melanie Maier]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 08:01:13 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[UI-Design]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15911</guid>

					<description><![CDATA[<p>Software projects are often described through architecture, data models, and technical milestones. Interface design tends to appear later in that story, as if it were simply the visible layer added once the important work is complete. During the development of this personal planning app, I experienced almost the opposite. The design process helped define how <a class="read-more" href="https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/">Designing a Calm Planning Experience: From Wireframes to a Coherent Visual Identity</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">Software projects are often described through architecture, data models, and technical milestones. Interface design tends to appear later in that story, as if it were simply the visible layer added once the important work is complete. During the development of this personal planning app, I experienced almost the opposite. The design process helped define how the product should behave, what kind of relationship it should have with its users, and which parts needed to remain simple as the underlying system became more complex.</p>



<p class="wp-block-paragraph">The project is still in development, and its name, complete concept, and current interface are intentionally not public yet. This article therefore does not present a product reveal. Instead, it focuses on the design process between March and August 2026: how the interface developed from functional wireframes into a more coherent visual system, how collaboration influenced the result, and how repeated feedback changed my understanding of clarity, accessibility, and visual identity.</p>



<p class="wp-block-paragraph">The app was developed during the second semester of the Master Interactive Media program. Its technical foundation is an iOS application written in Swift, but this project was mainly concerned with screen design and brand development. The public scope covers the basic screens already named in the development article: home, calendar and list overviews, related detail pages, and forms for calendar entries, list items, and reminders.</p>



<h2 class="wp-block-heading">Beginning with structure</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-1-1540x800.png" alt="" class="wp-image-15921" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-1-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-1-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">The first design phase consisted of wireframes for these core functions. At that point, the goal was not to decide on colors, fonts, or icon styles. The wireframes were used to understand information hierarchy and navigation: What should appear first on the home screen? How much information belongs in an overview? When does an item need its own detail page? Which actions should be immediately available, and which can remain one level deeper?</p>



<p class="wp-block-paragraph">This phase was deliberately simple. Boxes represented content areas, placeholder text represented labels, and navigation elements were reduced to their basic purpose. It also exposed how quickly a planning interface can become crowded. Even the basic screens combine dates, titles, statuses, categories, actions, navigation, and secondary information. The home screen needed to offer orientation, overviews had to support scanning, and forms required a more guided rhythm.</p>



<p class="wp-block-paragraph">One important lesson from this stage was that visual hierarchy begins before visual styling. If the structure does not make priorities clear, stronger colors and larger headings only make the confusion more visible. The early wireframes therefore became a reference throughout the later process. Whenever a refined screen started to feel overloaded, I could return to the basic structure and ask whether the added visual elements were supporting the original purpose or competing with it.</p>



<h2 class="wp-block-heading">From wireframes to the first design screens</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/firstDesign-1540x800.png" alt="" class="wp-image-15922" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/firstDesign-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/firstDesign-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">The next phase translated the wireframes into the first designed screens. This was the point where the project began to develop a personality. Typography, rounded forms, color relationships, icons, cards, borders, and spacing were introduced. The interface was meant to feel personal and approachable, so the first visual direction leaned strongly toward a playful style.</p>



<p class="wp-block-paragraph">At first, this seemed appropriate. Planning is a daily and personal activity, and a playful interface offered a contrast to the strict appearance of many productivity tools. However, this phase also demonstrated that friendliness and playfulness are not the same thing. As more screens were added, decorative forms, multiple outlines, different icon styles, and expressive typography created too many points of attention. What worked as an isolated detail did not always work as part of a growing system.</p>



<p class="wp-block-paragraph">The first design screens were therefore valuable precisely because they were not final. They made the intended personality visible, but they also revealed where that personality needed more discipline. The project had reached the stage where individual screens could no longer be evaluated only as attractive compositions. They had to work as one product.</p>



<h2 class="wp-block-heading">Collaboration as a design process</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/WhatsApp-Image-2026-08-04-at-16.12.50-1540x800.jpeg" alt="" class="wp-image-15923" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/WhatsApp-Image-2026-08-04-at-16.12.50-1540x800.jpeg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/WhatsApp-Image-2026-08-04-at-16.12.50-770x400.jpeg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">During the visual development, I worked with a graphic design student who was responsible for developing the logo and the custom icons and who also proposed directions for the color concept. She is not named here, but her role in the process was substantial. I acted as the stakeholder for the application: I explained the intended character and requirements, reviewed ideas and intermediate states, and made decisions about how the graphic work should connect to the interface.</p>



<p class="wp-block-paragraph">The collaboration was not organized as a single briefing followed by a finished delivery. She shared sketches, variants, and intermediate states, and we discussed which qualities felt appropriate while the interface itself was evolving. I often approached an element through function: Is the icon understandable? Can the asset be used consistently in Swift? Her perspective added questions of visual rhythm, shape language, balance, and recognition.</p>



<p class="wp-block-paragraph">The logo and icons became important anchors for the emerging identity. Their development introduced more organic forms into a product that still needed a clear structure. This tension became one of the most useful ideas in the project: the interface could be calm and organized without becoming cold, and it could retain distinctive, playful details without allowing every component to become expressive.</p>



<p class="wp-block-paragraph">The color proposals connected the graphic identity to the screen design, but applying a palette to an interface is different from presenting it in a visual study. Colors that look balanced together may not provide enough contrast for text, and a shade that works in an illustration may be too prominent across a large card. The collaboration provided the visual material, while the interface work tested it under practical conditions.</p>



<h2 class="wp-block-heading">Feedback from recurring test users</h2>



<p class="wp-block-paragraph">Alongside the design collaboration, I repeatedly showed the screens to approximately five test users. The group was not statistically representative; its value came from continuity. The same people saw several stages and could react to changes over time.</p>



<p class="wp-block-paragraph">Two issues appeared repeatedly: text was sometimes too small, and the contrast between text and background colors was sometimes too weak. The feedback revealed the difference between designing at full size on a computer and using the result on a phone. A composition can look spacious in a design tool while becoming tiring at actual device size. Because users need to identify dates, items, categories, and actions quickly, readability is part of the core interaction rather than an accessibility layer added later.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="362" height="156" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Calendar-Card.png" alt="" class="wp-image-15924"/></figure>



<p class="wp-block-paragraph">In response, font sizes were reconsidered, text colors were strengthened, and some relationships between foreground and background were simplified. The process also made me more cautious about using color to create hierarchy. If several shades are close in brightness, they may create a harmonious palette but fail to establish a useful reading order. Contrast has to work both aesthetically and functionally.</p>



<p class="wp-block-paragraph">The users also identified screens that felt too busy even when every individual element was understandable. Familiarity reduces perceived complexity: after working on a screen for a long time, I already know where to look, while a test user does not. The central question gradually changed from whether the design looked friendly to whether it helped users feel oriented.</p>



<h2 class="wp-block-heading">Moving from playful to calm</h2>



<p class="wp-block-paragraph">The strongest change between the first designs and the refined screens was the overall design language. The earlier versions were visibly more playful. Over time, the interface became quieter, clearer, and more structured. This did not mean removing all personality. Instead, playful qualities were concentrated in selected places, particularly in organic forms and custom icon details, while the main layout became more restrained.</p>



<p class="wp-block-paragraph">Color was the most challenging part of this transition. The palette had to communicate warmth and individuality without reducing legibility or making the interface visually heavy. Several versions were needed before the relationship between light surfaces, darker functional elements, and accent colors felt balanced. The final direction is less about using many colors and more about giving each color a clear role.</p>



<p class="wp-block-paragraph">The refinement also affected borders, cards, spacing, and typography. Reducing unnecessary boundaries allowed alignment to do more of the organizational work. Headings, secondary information, form labels, and actionable text received clearer roles. The typeface could support personality, but size, weight, spacing, and contrast had to support usability.</p>



<p class="wp-block-paragraph">The same principle applied to iconography. Custom icons helped preserve the organic and personal character of the project, but an icon family also needs internal rules. Stroke weight, level of detail, filled and outlined states, and the relationship between icon and label all affect consistency. The icon work therefore became more than a collection of illustrations. It became the beginning of a visual grammar.</p>



<h2 class="wp-block-heading">Designing a system rather than isolated screens</h2>



<p class="wp-block-paragraph">By the refinement stage, the screen set included the home screen, calendar and list overviews, calendar and list detail pages, and the add forms for calendar entries, list items, and reminders. Although this remains only the basic functional scope, it is already broad enough to expose inconsistencies. A heading that works on the home screen may occupy too much space in a form. A card that works for an upcoming event may not work for a list item. A navigation control that feels obvious on an overview may be ambiguous on a detail page.</p>



<p class="wp-block-paragraph">This encouraged a more systematic approach. Instead of adjusting every screen independently, I began to think in reusable decisions: spacing intervals, text roles, card behavior, icon states, color functions, and recurring navigation patterns. This is also where the design process connected directly to the Swift implementation. Reusable SwiftUI components are easier to create when the visual rules are clear. Conversely, implementing a component across several screens quickly reveals where a design rule is too specific to one mock-up.</p>



<p class="wp-block-paragraph">The relationship between design and development was iterative. Screens informed the component structure, and implementation challenged the screens. Small differences are easy to draw but harder to justify when they require separate code paths. Variation therefore had to become intentional.</p>



<p class="wp-block-paragraph">The brand book developed alongside this consolidation. It brought together the values, personality, tone of voice, typography, colors, icon principles, and product experience guidelines that had emerged through the previous months. Creating it forced decisions that individual screens could postpone and turned visual preferences into shared rules.</p>



<p class="wp-block-paragraph">The brand identity can be summarized through a few qualities: clear, empathetic, and reliable. These qualities function as design criteria rather than promotional adjectives. Clarity requires an understandable hierarchy. Empathy means avoiding language and interactions that create unnecessary pressure. Reliability includes predictable navigation, legible states, and careful treatment of user data. A distinctive visual style is useful only when it supports these qualities.</p>



<h2 class="wp-block-heading">A cautious look toward adaptive interfaces</h2>



<p class="wp-block-paragraph">One future direction being explored is an adaptive interface. It has not yet been implemented, and the details remain intentionally broad. The basic idea is that the presentation could respond to screen size, accessibility preferences, or explicitly chosen modes instead of showing the same density at all times.</p>



<p class="wp-block-paragraph">However, adaptation creates a design risk. An interface that changes too freely can become difficult to learn and may reduce trust. Important navigation should remain predictable, and users should understand why a view has changed. Suggestions should remain reversible, and the full information should still be accessible. For this project, the most promising principle is therefore not an interface that constantly rearranges itself, but a stable structure with carefully limited adaptive areas.</p>



<p class="wp-block-paragraph">If adaptation is intended to reduce cognitive load, it must not create new uncertainty. Sufficient contrast, consistent controls, and user agency remain more important than novelty. The underlying system has to be stable first.</p>



<h2 class="wp-block-heading">What I learned from the process</h2>



<p class="wp-block-paragraph">Looking back at the period from March to August 2026, the design developed through three broad stages. The first established the functional structure through wireframes. The second introduced a strong but comparatively playful visual direction. The third refined that direction through collaboration, implementation, and feedback until the interface became calmer and more coherent.</p>



<p class="wp-block-paragraph">The process showed me that refinement is not simply the act of making a design more polished. It often requires changing the criteria by which the design is judged. Early in the project, I focused strongly on whether the screens had personality. Later, I evaluated whether that personality supported orientation, readability, and trust. The final direction is not less designed than the first one. It is more selective about where design becomes visible.</p>



<p class="wp-block-paragraph">Recurring feedback also proved valuable even with a small test group. The most important findings were fundamental issues such as text size and contrast. Repetition made them harder to dismiss as individual preference and turned them into priorities. The design collaboration added a dialogue between graphic expression and interaction requirements rather than a simple handover between disciplines.</p>



<p class="wp-block-paragraph">The current design should not be understood as a finished public product. More testing will be necessary on real devices and across different display settings. Accessibility checks must become continuous rather than a final review, and the adaptive interface idea will require careful prototyping.</p>



<p class="wp-block-paragraph">For now, the most important result is a clearer design foundation. The project has moved from a collection of functional screens toward a recognizable system with shared principles. It can remain personal without becoming visually noisy, and it can become more structured without losing its organic character.</p>



<p class="wp-block-paragraph">The complete application is not ready to be revealed, but the development process already offers a useful lesson: a calm interface is not created by simply removing elements or choosing quiet colors. It is created by deciding what deserves attention, testing whether users can recognize it, and refining every visual choice until personality and clarity support each other.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/">Designing a Calm Planning Experience: From Wireframes to a Coherent Visual Identity</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mobile.fhstp.ac.at/ux/design/designing-a-calm-planning-experience-from-wireframes-to-a-coherent-visual-identity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Building a Personal Planning App: From Interface Idea to Data-Driven iOS Prototype</title>
		<link>https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/</link>
					<comments>https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/#respond</comments>
		
		<dc:creator><![CDATA[Melanie Maier]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 07:37:26 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[swift]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15909</guid>

					<description><![CDATA[<p>Software projects often begin with a feature list. This one began with a feeling: everyday planning tools are everywhere, and yet personal organization still often feels fragmented. Calendars live in one place, tasks in another, reminders somewhere else, and the mental work of connecting them is left to the user. The goal of this project <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/">Building a Personal Planning App: From Interface Idea to Data-Driven iOS Prototype</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">Software projects often begin with a feature list. This one began with a feeling: everyday planning tools are everywhere, and yet personal organization still often feels fragmented. Calendars live in one place, tasks in another, reminders somewhere else, and the mental work of connecting them is left to the user. The goal of this project was not simply to build another productivity app, but to explore how a planning interface could feel more coherent, calmer, and closer to the way people actually think about their days.</p>



<p class="wp-block-paragraph">The app is still in development, and many of its final ideas are intentionally not public yet. For that reason, this article does not reveal the complete product concept or all planned functionality. Instead, it focuses on the development process so far: how the project evolved from a SwiftUI interface prototype into a more structured iOS application with custom data models, persistent storage, reusable components, and first steps toward external calendar integration.</p>



<p class="wp-block-paragraph">At the beginning, the project was mostly visual and exploratory. The first question was not “Which database should this use?” or “How should synchronization work?” but “What should this feel like on a phone?” Since the app is meant to be used frequently and quickly, the interface had to be approachable without becoming decorative for its own sake. SwiftUI was a natural choice because it allowed fast iteration on layout, navigation, state, and component structure. Early work focused on core screens: a home view, overview pages, detail pages, and small reusable interface elements that could later become the visual language of the app.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-1540x800.png" alt="" class="wp-image-15918" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Wireframes-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">One of the first lessons was that a planning app becomes complex faster than expected. Even if the user-facing idea sounds simple, the underlying structures are not. A calendar item is not just a title and a date. It may have a start and end time, an all-day state, a location, notes, tags, a source, an editability status, and possibly a connection to another system. A task is also more than a checkbox. It can belong to a list, have a due date, include notes, be marked as important, be connected to a reminder, or later need rules for rescheduling. Reminders introduce yet another rhythm, because they are not exactly tasks and not exactly events. They sit somewhere between intention and interruption.</p>



<p class="wp-block-paragraph">Because of that, the project moved relatively early from screen-building into model-building. Separate structures were created for calendars, events, lists, tasks, reminders, external sources, and calendar connections. This was an important shift. Instead of letting the UI define the data informally, the data model started to define what the interface could reliably express. Each object needed an identity, needed to be encodable, and needed to be flexible enough for future features without becoming vague. This part of the process was less visually exciting than building screens, but it made the rest of the application much more stable.</p>



<p class="wp-block-paragraph">The central data layer became an observable store that holds the current calendars, events, lists, tasks, reminders, and external connections. This store is used throughout the SwiftUI views via environment injection, which keeps the individual screens relatively focused. A home screen can ask for visible calendars, upcoming events, or incomplete tasks without owning all the logic itself. Detail pages can receive a selected object and rely on shared update and delete methods. This architecture is still lightweight, but it creates a clear boundary between application state and presentation.</p>



<p class="wp-block-paragraph">A useful turning point was implementing filtering and derived data. Once there were multiple entities in the store, the app needed answers to questions such as: Which events belong to this calendar? Which tasks belong to this list? Which events are upcoming? Which tasks are incomplete and still relevant? These may sound like small helper functions, but they changed how the app could be built. Instead of each screen duplicating filtering code, the store became the place where the application’s understanding of its data lived. That made the UI easier to read and helped reduce inconsistencies between screens.</p>



<p class="wp-block-paragraph">Another major step was persistence. In early prototypes, sample data is enough. It helps with layout and gives the app something to display. But a planning app cannot remain a prototype for long if data disappears every time it restarts. The current version stores a snapshot of the application data as JSON in the app’s documents directory. The snapshot includes the core collections and can be loaded again when the app starts. The saving process also keeps a backup file, so the app has a fallback if the primary file cannot be read.</p>



<p class="wp-block-paragraph">This persistence system is intentionally simple. It is not yet a large database layer, and that is partly deliberate. At this stage, JSON-based persistence makes the app easier to inspect, debug, and evolve. The project is still changing, and a lighter storage approach gives more freedom while the domain model continues to settle. At the same time, the persistence layer is separated from the store, so replacing or extending it later would not require rewriting the entire UI. This is one of the recurring themes of the project: avoid overengineering too early, but create enough structure that future changes do not become painful.</p>



<p class="wp-block-paragraph">Autosave introduced its own design questions. A planning app should not require the user to manually save after every small change. The current approach listens for changes across the main collections and saves the current snapshot after a short debounce. This means the app can react naturally to edits while avoiding excessive file writes. It also means the development process had to account for state changes that are not user edits, such as loading persisted data at launch. Small flags and guard conditions became necessary to prevent the app from immediately saving over freshly loaded state or treating internal setup as user activity.</p>



<p class="wp-block-paragraph">The interface also evolved significantly during this phase. The app now has a clearer structure of pages and components: overview views, detail views, card components, a navigation bar, headers, picker panels, floating action controls, and shared form elements. This componentization was not just about cleaner code. It also helped the app develop a consistent interaction style. Planning tools can easily become cluttered because they contain many object types and many possible actions. Reusable components make it easier to keep the experience predictable.</p>



<p class="wp-block-paragraph">One example is the creation flow. Adding something new should not feel like entering a completely different app. The current implementation uses a shared sheet for creating or editing different item types. It supports modes for events, tasks, and reminders, with separate draft objects and validation. This draft-based approach is important because forms are temporary by nature. A user can open a sheet, make changes, switch context, cancel, or save. Keeping draft state separate from the saved model avoids accidental writes and makes validation clearer.</p>



<p class="wp-block-paragraph">The form system also revealed how much detail is hidden inside “simple” input. Dates, times, optional fields, associations with calendars or lists, tags, icons, and reminder relationships all require careful handling. If these concerns are spread directly across the view code, the form quickly becomes difficult to maintain. By separating drafts, form rows, picker state, and saving logic, the app gained a structure that can grow without turning every new field into a cascade of fragile changes.</p>



<p class="wp-block-paragraph">Design-wise, the project has been moving toward a custom visual identity rather than relying entirely on default iOS components. Custom fonts, color assets, icons, rounded shapes, and card components give the app a more personal tone. This is not only aesthetic. For a planning tool, visual hierarchy matters. The user should be able to distinguish calendars, lists, upcoming items, actions, and details quickly. Colors and cards are not decoration here; they carry information and help reduce cognitive load.</p>



<p class="wp-block-paragraph">At the same time, building a custom interface in SwiftUI requires restraint. It is tempting to make every component unique, especially in a project that has a strong visual direction. But the more custom the interface becomes, the more responsibility the developer takes on for spacing, accessibility, responsiveness, and consistency. This has been one of the practical challenges of the project: finding the balance between a distinctive interface and a maintainable one. The current component structure is an attempt to make that balance explicit.</p>



<p class="wp-block-paragraph">The most technically demanding part so far has been external calendar integration. Local planning data is one thing; synchronizing with external systems is another. The app now contains service layers for Apple Calendar and Google Calendar, as well as a synchronization service that imports events into the app’s own model. This required thinking about authorization, external identifiers, read-only versus editable sources, date ranges, mapping between API objects and local models, and what should happen when external events change or disappear.</p>



<p class="wp-block-paragraph">Apple Calendar integration uses EventKit and must deal with platform-specific permission states. On newer iOS versions, access levels are more precise, so the app has to request and verify the correct kind of calendar access. The service can list available calendars and load events within a selected time range. These events are then mapped into the app’s internal event model, preserving information such as title, location, notes, URL, start and end date, all-day status, external identity, and sync metadata.</p>



<p class="wp-block-paragraph">Google Calendar integration is different because it goes through Google Sign-In and web API requests. This required handling OAuth scopes, restoring previous sign-in sessions, refreshing access tokens, making authenticated requests, decoding calendar lists and event responses, and converting Google’s date formats into local date values. All-day events need special handling because calendar APIs often represent them differently from timed events. These are the kinds of details that are easy to underestimate before implementation begins.</p>



<p class="wp-block-paragraph">The synchronization layer sits above the individual provider services. It loops through configured external calendar connections, loads events for each connection, imports them, tracks which external IDs were seen, updates sync timestamps, and reports failures. The store then upserts imported events instead of blindly appending them. This prevents duplicates and creates a place to handle conflicts. If a local event has pending changes and an external version arrives, the app can mark the situation as a conflict rather than silently overwriting data. Even though the full synchronization story is not finished, the current structure already reflects a key principle: user data should be treated carefully.</p>



<p class="wp-block-paragraph">This was one of the biggest conceptual lessons of the project. Synchronization is not just a technical feature. It is a trust feature. If users put their plans into an app, they need confidence that the app will not lose, duplicate, or unexpectedly modify important information. That means the code has to represent uncertainty. It needs states such as local-only, synced, pending local changes, conflict, or deleted externally. These states are not glamorous, but they are what make the difference between a demo and a tool people might rely on.</p>



<p class="wp-block-paragraph">Another lesson was that the app’s “domain” became clearer through implementation. At first, calendars, lists, tasks, and reminders may seem like familiar categories. But once they are modeled together, their relationships become more interesting. Some items belong to collections. Some can be associated with time. Some can be completed, others can only pass. Some are imported from outside and should not be edited locally. Some may later need richer rules. The development process has therefore been partly technical and partly analytical: understanding what each object means in the system.</p>



<p class="wp-block-paragraph">The current prototype also includes several navigation paths: a home view with upcoming information, calendar overviews and detail views, list overviews and detail views, event and task detail screens, and setup flows. This breadth created a new kind of challenge. Once the app had more than one or two screens, consistency became harder. A change in the model might affect a card, a detail page, a form, and a preview all at once. This is where reusable view components started to pay off. They made the app feel less like a set of separate screens and more like one coherent product.</p>



<p class="wp-block-paragraph">The project is still in an active development stage. There are visible signs of ongoing refactoring: components have been moved into clearer folders, global elements have been separated from list-specific and calendar-specific components, and some older file paths are being replaced by a more organized structure. This is a normal and healthy part of development. Early prototypes often grow organically. At some point, the structure has to catch up with the idea. The important part is not to make the architecture perfect immediately, but to keep improving it when the project’s shape becomes clearer.</p>



<p class="wp-block-paragraph">Looking back, the development so far can be described in phases. The first phase was interface exploration: building enough screens to understand the experience. The second phase was domain modeling: defining the objects the app actually needs. The third phase was state and persistence: making the app remember and update data reliably. The fourth phase was integration: connecting the local world of the app with external calendar systems. The current phase is consolidation: refining components, improving flows, reducing duplication, and preparing the project for more advanced behavior.</p>



<p class="wp-block-paragraph">For a student or early-stage software project, this progression is valuable because it shows how practical software development rarely follows a perfectly linear plan. The app did not begin with a complete architecture diagram and then simply fill in the pieces. Instead, each implementation step revealed the next architectural need. A form revealed the need for drafts. External calendars revealed the need for source metadata and sync states. Autosave revealed the need to distinguish loading from editing. Reusable cards revealed the need for stronger model relationships. The architecture emerged through contact with the problem.</p>



<p class="wp-block-paragraph">There is also a broader lesson about building products that are not ready to be fully disclosed. It can be difficult to talk about a project publicly when the most exciting parts are still private. But not every development story has to reveal the final product. It is possible to discuss the engineering process, the technical decisions, the mistakes avoided, and the problems encountered without giving away the complete concept. In some ways, this is more useful for an informatics audience. The real value is not only in what the app will eventually do, but in how the system is being shaped to make that possible.</p>



<p class="wp-block-paragraph">The next steps will likely focus on stability, refinement, and careful expansion. The persistence system will need to remain reliable as the data model grows. Synchronization will need more testing, especially around conflicts and edge cases. The interface will need continued polishing across different device sizes and user scenarios. Some flows that currently exist as early implementations will need to become more robust. And as the app moves closer to a publishable version, privacy, permissions, error handling, and user trust will become even more important.</p>



<p class="wp-block-paragraph">What makes this project interesting is that it sits at the intersection of design, data modeling, and everyday behavior. A planning app is not just a technical container for events and tasks. It is a tool that asks to be invited into a user’s routine. That creates a high bar: the app has to be useful without being noisy, structured without being rigid, and personal without becoming confusing. Reaching that balance takes iteration.</p>



<p class="wp-block-paragraph">So far, the development has already moved beyond a simple prototype. The app has a working SwiftUI foundation, a growing design system, structured models, persistent local data, reusable creation flows, and initial external calendar synchronization. More importantly, it has a clearer sense of direction. The final product is not ready to be revealed yet, but the development process has already shown what kind of challenge this is: not merely building screens, but building a coherent planning environment one careful layer at a time.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/">Building a Personal Planning App: From Interface Idea to Data-Driven iOS Prototype</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mobile.fhstp.ac.at/allgemein/building-a-personal-planning-app-from-interface-idea-to-data-driven-ios-prototype/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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 loading="lazy" 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="auto, (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 loading="lazy" 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="auto, (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 loading="lazy" 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-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="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>



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



<p class="wp-block-paragraph"><a href="https://swiva.app">Swiva</a> is a mobile app for saving ideas, places, recipes and activities from TikTok, Instagram, Maps and the web, and actually turning them into plans.</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-3 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>



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



<p class="wp-block-paragraph"><a href="https://swiva.app">Swiva</a> is a mobile app for saving ideas, places, recipes and activities from TikTok, Instagram, Maps and the web, and actually turning them into plans.</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;6aabba462f057&quot;}" data-wp-interactive="core/image" data-wp-key="6aabba462f057" 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;6aabba462f512&quot;}" data-wp-interactive="core/image" data-wp-key="6aabba462f512" 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;6aabba462f987&quot;}" data-wp-interactive="core/image" data-wp-key="6aabba462f987" 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>
	</channel>
</rss>
