<?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>User Experience Archives - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/category/ux/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/category/ux/</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:24 +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>User Experience Archives - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/category/ux/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Designing OnTime V2 with Claude Design</title>
		<link>https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/</link>
					<comments>https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/#respond</comments>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:37:23 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Agents]]></category>
		<category><![CDATA[claude]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[design]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15990</guid>

					<description><![CDATA[<p>When I planned OnTime V2, my planning doc listed Figma as the design tool and I set aside 40 to 60 hours for design alone. In the end I didn&#8217;t open Figma at all. I designed the whole redesign in Claude Design. This article covers why I switched, how it went and where the tool <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/">Designing OnTime V2 with Claude Design</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">When I planned OnTime V2, my planning doc listed Figma as the design tool and I set aside 40 to 60 hours for design alone. In the end I didn&#8217;t open Figma at all. I designed the whole redesign in <strong>Claude Design</strong>. This article covers why I switched, how it went and where the tool reached its limits.</p>



<h2 class="wp-block-heading">Why not Figma or Canva?<br></h2>



<p class="wp-block-paragraph">All three big design tools now have AI. <strong>Figma</strong> puts it inside a professional canvas and coding agents can even design directly in your files. <strong>Canva AI 2.0</strong> creates layered, editable designs from a conversation. It&#8217;s great for marketing material, but it isn&#8217;t built for app UI.</p>



<p class="wp-block-paragraph">For OnTime, the question was simple: <strong>who is the designer on this project?</strong> I&#8217;m a solo developer. I had a design system in Figma to build on but I wanted something new. Claude Design can read images and design or even codebases and extract its colors, typography and components, so it was an easy choice.</p>



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



<p class="wp-block-paragraph">V1 already had parts I wanted to keep, like the week calendar with drag-to-create entries and the live recorder. A new look wasn&#8217;t the only reason I decided to design a new UI. It also needed to fit a much bigger app around that core: workspaces, roles, invoices and bank reconciliation.</p>



<p class="wp-block-paragraph">So I didn&#8217;t start with a blank prompt but I gave Claude Design my previous design and it built a design system from them. Then I asked for the new screens. It made the iteration faster but it also needed a lot of help finding the correct design. It was by far not a single-prompt-execution and it took a lot of trial and error to get to a useable state.</p>



<ul class="wp-block-list">
<li><strong>Overview</strong>: V1&#8217;s overview had bar and pie charts. For V2, the overview got more animated stat cards, an activity heatmap and a project split.</li>



<li><strong>Calendar</strong>: This screen changed the least. The work here was mostly styling it to the new design and adding a new entry design so it&#8217;s more compatible for multi-user support. </li>



<li><strong>Table pages</strong>: The table pages consist (well) just pages, so the main thing was to add the new design layout and archivable entries with a switch.</li>



<li><strong>Notifications</strong>: Funnily enough, this page was the hardest to design because the plain table design didn&#8217;t feel right. I decided to use cards for each notification with views for read and unread messages.</li>



<li><strong>Invoices and payment review</strong>: These screens were new, so there was nothing from V1 to copy. But since it was also one of the last pages I got to, it was easier to find a fitting design.</li>
</ul>



<h2 class="wp-block-heading">From design to code<br></h2>



<p class="wp-block-paragraph">The implementation took the longest to do because I rebuilt everything by hand in React. Claude Design lets you export your website as code but without any framework. I could&#8217;ve moved around it to let Claude generate everything but I wanted to do the programming side on my own. The mobile shell sits behind its own build flag in the app so switching the flag for testing on desktop was easy to do.</p>



<h2 class="wp-block-heading">What worked, what didn&#8217;t<br></h2>



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



<ul class="wp-block-list">
<li>Exploring was nearly free. I tried a lot of directions for the design and the different pages before settling on one.</li>



<li>The design system stayed mostly consistent across screens without me policing it.</li>
</ul>



<p class="wp-block-paragraph"><strong>What didn&#8217;t:</strong></p>



<ul class="wp-block-list">
<li>The spacing not always stayed consistent.</li>



<li>Not explaining your idea in detail leads to disappointing results.</li>



<li>Design may look generic.</li>
</ul>



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



<p class="wp-block-paragraph">For a solo developer, the design phase used to mean switching tools: design in Figma, then translate it into code by hand. With Claude Design, but now you can make Claude do the heavy lifting. Even though I decided to implement the design myself in code, it designing of the actual website was way faster and I was able to test a lot of different directions. The decisions stayed with me: what gets attention first, what stays from V1, what a finished page should look like. Claude did the designing and I made the design decisions.</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 fetchpriority="high" decoding="async" width="1540" height="800" data-id="15997" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211138-1540x800.png" alt="" class="wp-image-15997" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211138-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211138-770x400.png 770w" sizes="(max-width: 1540px) 100vw, 1540px" /></figure>



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



<figure class="wp-block-image size-large"><img decoding="async" width="1540" height="800" data-id="15994" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211211-1540x800.png" alt="" class="wp-image-15994" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211211-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211211-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="15998" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211219-1540x800.png" alt="" class="wp-image-15998" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211219-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211219-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="15995" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211227-1-1540x800.png" alt="" class="wp-image-15995" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211227-1-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/Screenshot-2026-09-16-211227-1-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>
</figure>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/">Designing OnTime V2 with Claude Design</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/designing-ontime-v2-with-claude-design/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>Projekt &#124; Powda Club-Dashboard</title>
		<link>https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/</link>
		
		<dc:creator><![CDATA[David Grünberger]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 01:25:15 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[clerk]]></category>
		<category><![CDATA[convex]]></category>
		<category><![CDATA[Next.js]]></category>
		<category><![CDATA[Semesterprojekt]]></category>
		<category><![CDATA[shadcn]]></category>
		<category><![CDATA[stripe]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[webhooks]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14812</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<li>Wiederverwendbare Komponenten</li>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/projekt-powda-club-dashboard/">Projekt | Powda Club-Dashboard</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TFG &#124; ergo4All Forschungsprojekt</title>
		<link>https://mobile.fhstp.ac.at/allgemein/tfg-ergo4all-forschungsprojekt/</link>
		
		<dc:creator><![CDATA[Andreas Kaiser]]></dc:creator>
		<pubDate>Sun, 31 Aug 2025 21:53:53 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Forschung]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14672</guid>

					<description><![CDATA[<p>Im Rahmen der Lehrveranstaltung Tun, Forschen &#38; Gründen (TFG) im 2. Mastersemester stand die Entscheidung an, entweder eine eigene Gründungsidee zu entwickeln, an einem Projekt aus einer anderen Masterklasse mitzuwirken oder ein Forschungsprojekt aus dem Institut für Creative\Media/Technologies zu unterstützen. Jeweils mit einem Arbeitsaufwand von rund 80 Stunden verbunden. Meine Wahl fiel auf das Forschungsprojekt <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/tfg-ergo4all-forschungsprojekt/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/tfg-ergo4all-forschungsprojekt/">TFG | ergo4All Forschungsprojekt</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Im Rahmen der Lehrveranstaltung <em>Tun, Forschen &amp; Gründen</em> (TFG) im 2. Mastersemester stand die Entscheidung an, entweder eine eigene Gründungsidee zu entwickeln, an einem Projekt aus einer anderen Masterklasse mitzuwirken oder ein Forschungsprojekt aus dem Institut für Creative\Media/Technologies zu unterstützen. Jeweils mit einem Arbeitsaufwand von rund 80 Stunden verbunden. Meine Wahl fiel auf das Forschungsprojekt ergo4All, das ich von April 2025 bis August 2025 tatkräftig unterstützte. Das Team setzt sich aus Leuten einer Forschungsprojektgruppe aus dem Institut für Managementwissenschaften der TU Wien und FH St. Pölten ArbeiterInnen zusammen.</p>



<p class="wp-block-paragraph">Mit ergo4All soll eine digitale Lösung entwickelt werden, die ergonomisches Wissen und konkrete Anpassungsvorschläge allen Menschen zugänglich macht – unabhängig von Alter, körperlichen Voraussetzungen oder digitaler Kompetenz. Innerhalb der App steht dabei das Ziel im Vordergrund, individuelle Empfehlungen für gesundes Arbeiten und Alltagsbewegungen leicht verständlich und barrierearm bereitzustellen.<br>Je nach, welches Szenario (Heben/Tragen, etc.) man in der App wählt, bewertet die KI (gestützt auf maschinelles Sehen und den anerkannten RULA‑Score) Körperhaltungen aus einem kurzen in Echtzeit dokumentierten Video. Anschließend liefert sie dem/der NutzerIn leicht verständliche Hinweise zur Verbesserung der Haltung. Alle Daten werden lokal auf dem Gerät verarbeitet, daher findet keine Cloud‑Speicherung oder Tracking statt.</p>



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



<p class="wp-block-paragraph">Am Anfang meiner Projektmitarbeit umfassten meine Aufgaben das Redesign bestehender App-Screens sowie die Erstellung neuer Screens mit entsprechender Navigation auf Basis des damals erstmalig überabeiteten Figma-Mockups. Dieses ist hier zu sehen:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="451" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/08/image-1540x451.jpg" alt="" class="wp-image-14685"/></figure>



<p class="wp-block-paragraph">Zusätzlich war ich beauftragt die Lokalisierung von Texten, Buttons und co. für Deutsch und Englisch über ein eigenes Lokalisierungsfile vorzunehmen. Im weiteren Verlauf wurde ich gebeten, mir auf einem eigenen GIT-Branch anzuschauen, wie die App für IOS gebuildet werden kann, um lauffähig zu sein. Zum Abschluss lag die Verantwortung für den Aufbau des Onboardings gemäß eines vorab abgestimmten Konzepts bei mir.</p>



<h2 class="wp-block-heading">Durchführung</h2>



<p class="wp-block-paragraph">In ersten Schritten wurde ich von Dipl.-Ing. Ramon Brullo BSc technisch in die App eingeführt. Dabei wurde die klare Code-Struktur der App erklärt. Es handelt sich hierbei um eine Flutter-App, dessen Hauptsprache die Programmiersprache Dart ist </p>



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



<p class="wp-block-paragraph">In den ersten Schritten wurde ich von Dipl.-Ing. Ramon Brullo, BSc technisch in die App eingeführt, wobei insbesondere die klare Code-Struktur einer Flutter-App (Programmiersprache Dart) erläutert wurde. Die Lokalisation erfolgt über ein JSON-File, die Codeverwaltung über GIT mit Sub-Branches und einer regelmäßigen Release-Pipeline. Die Commits orientieren sich am Standard der <a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a>, die wiederum die Release-Pipeline anstößt.<br>Ich nahm bei den fast jeden Dienstag stattfindenden Meetings zwischen unserem Projektteam und TU-KollegInnen teil, in denen Status und Fortschritte abgestimmt wurden. Anfangs lag mein Schwerpunkt auf der App-Lokalisation und dem Verständnis des Codes, bevor ich am Frontend größere Änderungen vornahm und regelmäßig Commits einbrachte. Für design-relevante Themen war Vivian Seidl BSc zuständig, mit der ich mich eng abstimmte.</p>



<p class="wp-block-paragraph">Ein größeres Vor-Ort-Meeting Mitte Juni diente dazu, die Planung bis in den Herbst hinein gemeinsam mit den TU-KollegInnen festzulegen. Zudem habe ich mir in Flutter angeschaut, wie man einen iOS-Build macht und am Onboarding beteiligt. Das Frontend des Onboarding übernahm ich ganz, während Ramon die Backend-Einbindung in den Appflow übernahm.</p>



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



<p class="wp-block-paragraph">Nachdem das Redesign abgeschlossen und alle fehlenden Screens ergänzt wurden, gliedert sich das App-Layout nun folgendermaßen (der Onboarding-Prozess, welche erst vor kurzem in der Form dazu kam, wird unterhalb erläutert):</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/2025/08/Untitled-1540x800.jpg" alt="" class="wp-image-14711" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/08/Untitled-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/08/Untitled-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p class="wp-block-paragraph">Die App startet beim erstmaligen Öffnen mit einem Welcome-Screen samt Sprachwahl, bevor der/die NutzerIn nach einem Onboarding ins Hauptmenü gelangt. Von dort aus lassen sich direkt allgemeine Tipps zur Ergonomie-Themen oder konkrete Szenarien auswählen. Über den Tipps-Selection-Screen geht es in detaillierte Anleitungen zur Körperhaltung. Wählt man ein Szenario, bekommt man eine kurze Szenariobeschreibung und folgt der Aufnahmefunktion, mit der die eigene Haltung erfasst wird. Anschließend werden im Ergebnis-Screen eine Übersicht und Detailbewertungen angezeigt, inklusive spezifischer Analysen einzelner Körperbereiche. Durch das Redesign sind sind alle Texte lokalisiert und das Screen-Layout Großteils einheitlich.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="746" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/08/TFG_ergo4All_Onboarding_Prozess_Copyright_Andreas_Kaiser-1540x746.jpg" alt="" class="wp-image-14707"/><figcaption class="wp-element-caption">Onboarding-Prozess bestehend aus fünf Hauptscreens</figcaption></figure>



<p class="wp-block-paragraph">Nachdem der/die UserIn die Sprache vorselektiert hat, startet in der gewählten Sprache beim erstmaligen Betreten in die App ein durchstrukturiertes Onboarding. Zuerst wird auf die Privatsphäre hingewiesen und erklärt was mit den gesammelten App-Daten passiert. vordem die App kurz und prägnant vorgestellt wird. </p>



<p class="wp-block-paragraph">Nachdem die Sprache ausgewählt wurde, startet beim ersten App-Betreten ein klar strukturierter Onboarding-Prozess in der gewählten Sprache.</p>



<ol class="wp-block-list">
<li><strong>Privatsphäre</strong> – Zunächst wird erklärt, dass die App komplett offline funktioniert, keine Cloud und kein Tracking verwendet und alle Daten lokal am Gerät bleiben.</li>



<li><strong>App-Übersicht</strong> – Danach folgt eine kurze Einführung, die den Zweck der App verständlich darstellt.</li>



<li><strong>AGBs</strong> – Anschließend werden die Nutzungsbedingungen präsentiert, mit einem klaren Hinweis darauf, dass die Ergebnisse nur Informationscharakter haben und keine fachliche Beratung ersetzen.</li>



<li><strong>Was ist Ergonomie?</strong> – Dieser Screen erläutert die Grundidee der Ergonomie und vermittelt, dass nicht das momentane Empfinden, sondern langfristige Gesundheit im Mittelpunkt steht.</li>



<li><strong>Dein Nickname</strong> – Zum Schluss können NutzerInnen optional einen Spitznamen vergeben, um Ergebnisse leichter wiederzufinden.</li>
</ol>



<p class="wp-block-paragraph">Alle Texte der Onboarding-Screens wurden sorgfältig von einem Kollegen der TU Wien entwickelt, um Inhalte sprachlich präzise, leicht verständlich und zugleich den wissenschaftlichen Standard entsprechend.</p>



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



<p class="wp-block-paragraph">Bezugnehmend auf meine Vorkenntnisse im hybriden App-Development mit Flutter stellte sich dieses Projekt als sehr gewinnbringend für mich dar. Ich konnte mein Flutter-Wissen nicht nur auffrischen, sondern auch um neue technische Aspekte erweitern. Darüber hinaus erhielt ich durch meinen Teamkollegen Dipl.-Ing. Ramon Brullo, BSc wertvolle Einblicke in unterschiedliche App-Testansätze, deren Einsatzwahl und deren konkrete Umsetzung in Flutter.</p>



<p class="wp-block-paragraph">Besonders hervorzuheben ist, dass mir Ramon auch das Konzept der Conventional Commits zeigte, das für mich völlig neu war. Ich konnte den Ansatz schnell nachvollziehen und habe diesen im Projekt selbstständig angewendet. Dadurch habe ich nicht nur die Struktur meiner Commits verbessert, sondern auch den Mehrwert von standardisierten Commit-Messages für Teamarbeit und Release-Prozesse erkannt. Ebenso waren die regelmäßigen Meetings und die enge Abstimmung im Team ein Mehrwert für mich. Sei es eine persönliche Weiterentwicklung im Hinblick auf Teamarbeit oder Projektorganisation.<br><br>Im Großen und Ganzen nehme ich aus dem Projekt 80 lehrreiche Stunden mit, in denen ich mein technisches Know-how im Bereich Flutter-Entwicklung erweitern, meine Arbeitsweise im Team verbessern und wertvolle praktische Erfahrungen in der koordinierten App-Entwicklung sammeln konnte.</p>



<p class="wp-block-paragraph">Da es sich noch um ein derzeit laufendes Forschungsprojekt handelt, entspricht die aktuelle App-Version noch nicht der geplanten Veröffentlichung. Im Herbst werden noch einige zusätzliche Usability-Testings in Unternehmen durchgeführt, deren Ergebnisse in die finale Weiterentwicklung einfließen. Eine Veröffentlichung der App in die App-Stores ist noch im heurigen Herbst geplant.<br><br>Mehr zu dem Forschungsprojekt lesen? &#8211; https://research.fhstp.ac.at/projekte/ergo4all-ergonomie-fuer-alle</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/tfg-ergo4all-forschungsprojekt/">TFG | ergo4All Forschungsprojekt</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Blog &#124; MoveMates</title>
		<link>https://mobile.fhstp.ac.at/development/blog-movemates/</link>
		
		<dc:creator><![CDATA[David Grünberger]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 18:34:10 +0000</pubDate>
				<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Tests]]></category>
		<category><![CDATA[Workshop]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Extreme Programming Week]]></category>
		<category><![CDATA[Gitlab]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Sensoren]]></category>
		<category><![CDATA[websockets]]></category>
		<category><![CDATA[Wild Week]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14255</guid>

					<description><![CDATA[<p>Am Anfang des 2. Semesters des Master-Studiengangs Interactive Technologies (Masterklasse Mobile) fand die “Extreme Programming Week” statt (auch “Wild Week” genannt). Für diese Woche bekamen wir die Challenge, als ganze Masterklasse gemeinsam (insgesamt 8 Personen) innerhalb von 5 Tagen (Montag bis Freitag) eine App zu entwickeln. Die konkrete Aufgabenstellung erhielten wir erst am Montag, und <a class="read-more" href="https://mobile.fhstp.ac.at/development/blog-movemates/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/blog-movemates/">Blog | MoveMates</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">Am Anfang des 2. Semesters des Master-Studiengangs Interactive Technologies (Masterklasse Mobile) fand die “Extreme Programming Week” statt (auch “Wild Week” genannt). Für diese Woche bekamen wir die Challenge, als ganze Masterklasse gemeinsam (insgesamt 8 Personen) innerhalb von 5 Tagen (Montag bis Freitag) eine App zu entwickeln. Die konkrete Aufgabenstellung erhielten wir erst am Montag, und am Freitagnachmittag sollte die MVP-Version präsentiert werden.</p>



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



<p class="wp-block-paragraph">Die Aufgabenstellung und das MVP wurde uns größtenteils vorgegeben, wobei wir vor allem bei den optionalen zusätzlichen Features mitreden konnten. Prinzipiell war die Idee, eine App zu entwickeln, über die man gewisse Echtzeitdaten wie Standort, Geschwindigkeit, Herzfrequenz etc. mit einer Gruppe austauscht. Einsatzbereiche gibt es dabei mehrere. Beispielsweise könnte man sich auf den Sport- (Laufen, Radfahren etc.) oder auf den Gesundheitsbereich (inkl. Fallerkennung) fokussieren. Letztendlich haben wir uns für den Bereich &#8220;gegeneinander Laufen&#8221; entschieden.</p>



<h3 class="wp-block-heading">MVP (Minimum Viable Product)</h3>



<p class="wp-block-paragraph">Um am Ende sagen zu können, dass wir die Aufgabe gemeistert haben, wurde ein MVP (Minimum Viable Product) mit den grundlegendsten Funktionen definiert. Was den Client betrifft, waren das Auslesen und sinnvolle Übertragen von Sensor-Daten, Login und Teambildung aber auch eine “coole Darstellung” wichtig. Vor allem beim letzten Punkt sollten wir uns wirklich Gedanken machen, was im Kontext gut funktioniert, anstatt einfach nur alle Daten in Zahlenform anzuzeigen.<br>Serverseitig lag der Fokus auf der Verteilung der Daten in Echtzeit im Team.<br>Außerdem sollte die App auf mindestens einer Plattform nativ im Testmodus verfügbar sein.</p>



<h3 class="wp-block-heading">NTH (Nice to Have)</h3>



<p class="wp-block-paragraph">Neben dem MVP wurden auch optionale Features notiert, genannt “Nice to Haves”, die dann umgesetzt werden sollten, sobald das MVP fertig ist. Diese Liste wurde auch während der Woche erweitert.<br>Dazu gehörte die Distribution auf beiden Plattformen (iOS und Android) oder das Einführen eines Handicaps, welches dazu genutzt werden kann, dass unterschiedlich starke Leute in einer Sportart gegeneinander antreten können. Eine History vergangener Sessions, eine Exportmöglichkeit der Daten, Gamification, das Laufen der App im Hintergrund, Micro-Interactions und Vibration waren ebenso Punkte auf dieser Liste. Andere Ideen waren die Berechnung eines Leistungswerts, Tests oder die Verwendung eines QR-Codes zur Gruppenbildung.</p>



<h2 class="wp-block-heading">Verwendete Technologien</h2>



<p class="wp-block-paragraph">Im Projekt setzten wir auf Technologien, die wir bereits im vorherigen Semester kennenlernen durften bzw. mit denen einige unserer Gruppenmitglieder*innen bereits Erfahrung hatten. Von Anfang an war klar, dass sich eine native Umsetzung unserer App für sowohl Android als auch iOS wohl zeitlich nicht ausgehen würde, weshalb wir im Frontend auf eine Cross-Plattform Technologie setzten.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="5831" height="1080" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/tech_stack_diagram.jpg" alt="" class="wp-image-14288" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/tech_stack_diagram.jpg 5831w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/tech_stack_diagram-1536x284.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/tech_stack_diagram-2048x379.jpg 2048w" sizes="auto, (max-width: 5831px) 100vw, 5831px" /><figcaption class="wp-element-caption"><strong>Zusammenspiel der verwendeten Technologien und Infrastruktur</strong></figcaption></figure>



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



<p class="wp-block-paragraph">Im Frontend arbeiteten wir mit dem Cross-Platform Framework Ionic (Capacitor), in Kombination mit der Frontend-Technologie React &#8211; geschrieben in Typescript. Die Wahl fiel darauf, da wir im 1. Semester unseres Studiums sowohl ein Projekt mit React umsetzen mussten, als auch in unserer Masterklasse mit dem Ionic Framework arbeiteten.</p>



<p class="wp-block-paragraph">Die ersten Screen-Prototypes designten wir mit der Design-Software Figma.</p>



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



<p class="wp-block-paragraph">Im Backend verwendeten wir NestJS, ebenfalls in Kombination mit Typescript, da wir diese Backend-Technologie ebenfalls im 1. Semester unserer Masterklasse in einem Projekt verwendeten und so die Einstiegshürde wegfiel.</p>



<p class="wp-block-paragraph">Da unsere App sehr stark auf Live-Daten angewiesen ist (sowohl das Senden der aktuellen Sensordaten eines Users, als auch das Erhalten der Live-Daten anderer User während einer Aktivität), entschieden wir uns, hierfür auf Websockets zurückzugreifen, welche nahtlos in NestJS unterstützt wurden. Beim Erstellen einer Session für alle Teilnehmer*innen wurde ein Websocket &#8220;Topic&#8221; erstellt, welches in den Apps aller Nutzer*innen subscribed werden konnte und mit welchem immer die aktuellen Live-Daten in einem fest definierten Intervall ausgetauscht wurden.</p>



<h4 class="wp-block-heading">Datenbank</h4>



<p class="wp-block-paragraph">Für die Persistenz unserer Daten setzten wir auf eine PostgreSQL Datenbank, ergänzt durch den Object-Relational Mapper (ORM) TypeORM. Wir wählten PostgreSQL aufgrund seiner Zuverlässigkeit und weiten Verbreitung als relationale Datenbank, was uns eine solide Basis für unsere Anwendung bot und zukünftige Skalierbarkeit ermöglichte. Ein weiterer ausschlaggebender Faktor war die exzellente Kompatibilität mit NestJS und die vorhandene Teamerfahrung mit TypeORM.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1111" height="651" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/06/ER-Modell-Komplett.drawio-1.png" alt="" class="wp-image-14372"/><figcaption class="wp-element-caption"><strong>ER-Diagramm der movemates DB</strong></figcaption></figure>



<p class="wp-block-paragraph">Die Struktur unserer Datenbank wird ist in diesem ER-Diagramm veranschaulicht. Die Kernentitäten bilden  User, Session und Messerwerte. Zwischen :</p>



<ul class="wp-block-list">
<li>User<strong>:</strong> Hier hinterlegen wir alle notwendigen Benutzerinformationen, darunter Id, Vorname, Nachname, Email, Passwort und physiologische Daten wie Geburtsdatum, Groesse, Gewicht und Geschlecht. Diese Informationen sind essenziell, insbesondere das Geburtsdatum für die Berechnung der individuellen Herzfrequenzzonen.</li>



<li>Session<strong>:</strong> Diese Entität verwaltet die Details der Lauf-Sessions, wie Id, Status, Enddatum, Typ und Startdatum.</li>



<li>User_Session<strong>:</strong> Als Verbindungstabelle stellt sie die Beziehung zwischen Benutzern und Sessions dar und speichert die Rolle des Teilnehmers innerhalb einer Session.</li>



<li>Messwerte<strong>:</strong> Diese zentrale Entität ist für die Speicherung der während einer aktiven Session gesammelten Sensordaten zuständig. Dazu gehören Zeitstempel, Geschwindigkeit, Breitengrad, Längengrad, Lage, Richtung, Herzfrequenz und Schrittfrequenz. Diese Daten bilden die Grundlage für unsere Echtzeitanzeigen und potenzielle historische Analysen.</li>
</ul>



<p class="wp-block-paragraph">Mit unserer PostgreSQL DB wird somit das Rückgrat unserer App, indem alle statischen Benutzer- und Sitzungsdaten sowie die dynamischen Sensordaten gespeichert sind, die für die Kernfunktionen und die Visualisierung notwendig sind, gebildet.</p>



<p class="wp-block-paragraph">Um diese DB stabil und einfach zu handhaben, nutzten wir Docker. Das erlaubte uns, die PostgreSQL-Datenbank in einem eigenen, isolierten &#8220;Container&#8221; laufen zu lassen. Dies vereinfacht nicht nur die Einrichtung erheblich, sondern stellt auch sicher, dass die Datenbank immer in einer konsistenten Umgebung läuft und ihre Daten sicher verwahrt bleiben. Dank dieser Docker-Einrichtung konnte sich unser Backend-Service problemlos und zuverlässig mit der Datenbank verbinden, sobald diese bereit war. Die Konfiguration mit TypeORM wiederum sorgte dafür, dass unsere App die Daten korrekt lesen, schreiben und verwalten konnte. Besonders wichtig dabei waren unsere TypeORM Datenbank-Migrationen. Diese funktionieren wie kleine, versionierte Skripte, die es uns ermöglichten, die Struktur der Datenbank (wie z.B. neue Spalten hinzufügen oder bestehende ändern) im Laufe der Entwicklung schrittweise und kontrolliert anzupassen, ohne Daten zu verlieren.</p>



<h4 class="wp-block-heading">OpenAPI</h4>



<p class="wp-block-paragraph">Damit wir in unserem Frontend nicht noch einmal alle Backend Objekte doppelt anführen müssen und um Zeit zu sparen, haben wir uns dazu entscheiden, den OpenAPI Generator zu verwenden. Die grundsätzliche Funktion von diesem ist, dass man im Backend mithilfe eines Decorators, wie Swagger, die Endpunkte definiert und dokumentiert. Mithilfe dieser Dokumentation, kann man dann für das Frontend Client-Funktionen erstellen lassen, welche mit dem Backend konsistent und typensicher sind. In unserem Backend haben wir Swagger verwendet, um per Decorator die Endpoint Spezifikationen anzugeben. Im Frontend haben wir dann die <em>@openapitools/openapi-generator-cli</em> installiert, welche einen Befehl bereitstellt, mit welchem man die API erstellen kann. Davor ist noch eine OpenAPI Spec Datei benötigt, welche openapitool.json heißt, in welcher man die Einstellungen für die API angibt. Danach kann man jederzeit die API generieren lassen und sie verwenden.</p>



<h3 class="wp-block-heading">CI/CD</h3>



<p class="wp-block-paragraph">Für unsere Backend-Applikation wurde uns ein Server auf unserer FH-Cloud zur Verfügung gestellt. Haben wir nun unsere NestJS Applikation per FTP auf diesen Server geladen? Natürlich nicht! Haben wir stattdessen viel Zeit in Continuous Integration und Deployment (CI/CD) investiert? Selbstverständlich! Schon am ersten Tag der Woche haben wir ein docker-compose.yml geschrieben. Damit ließ sich die Backend-Applikation mit einer Postgres Datenbank starten. Mit&nbsp;der Unterstützung unseres Masterklassenleiters Armin haben wir am Morgen des zweiten Tages Docker auf unserem Server installiert. Dann haben wir einen GitLab Runner mit dem Shell Executor eingerichtet und das .gitlab-ci.yml geschrieben. Darin haben wir einen Deploy Job definiert, der bei einem Commit auf den “main” Branch docker-compose ausführt und damit die neueste Version der Anwendung auf unserem Server startet. Ebenfalls haben wir den Build unserer Android-App automatisiert. Dafür brauchte es einen Job um die Dependencies der Ionic App zu installieren, einen Job um die Frontend-Applikation zu bauen, einen um das .apk zu bauen und schließlich einen Job um das .apk zu publishen. Damit wir reproduzierbare Builds und einen sauberen Server haben, wollten wir all diese Jobs in Containern ausführen. Dazu mussten wir einen weiteren GitLab Runner aufsetzen, der dieses Mal den Docker Executor verwendet. Der Build der Android App verwendet das Image alvrme/alpine-android und die anderen ein simples Node.js Image. Continuous Deployment war geschafft, Continuous Integration folgte.</p>



<p class="wp-block-paragraph">Wenn man ein neues NestJS-Projekt startet, werden automatisch <a href="https://eslint.org/">Eslint</a> mit <a href="https://prettier.io/">Prettier</a> und <a href="https://jestjs.io/">Jest</a> eingerichtet. Damit das Code-Linting/Formatting und die Tests auch in der Pipeline ausgeführt werden, haben wir dafür jeweils einen Job in einem “test” Step in unsere Pipeline erstellt. Vorgelagert findet ein Job statt, der die Dependencies installiert. Alle drei Jobs werden in einem Node.js Image ausgeführt. Hätten wir noch mehr Zeit gehabt, hätten wir noch für das Frontend einen Linting- und Test-Job erstellt.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1383" height="158" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/image2.png" alt="" class="wp-image-14285" style="object-fit:cover"/><figcaption class="wp-element-caption"><strong>Visualisierung unserer GitLab CI/CD Pipeline</strong></figcaption></figure>



<p class="wp-block-paragraph">Im Hinblick auf CI war zwar die Basis für Unit Tests im Backend gelegt, aber leider fehlten uns die Tests, um wirklich Nutzen davon zu haben. Der <a href="https://docs.gitlab.com/ci/testing/unit_test_reports/">GitLab Test Reporter</a> zeigt die traurige Situation unserer Unit Tests (siehe folgenden Screenshot). Um das zu kompensieren, haben wir End-To-End-Tests geschrieben, die zumindest einen Teil der User Flows abdecken. Mit <a href="https://www.cypress.io/">Cypress</a> durchlaufen wir den Registrierungs- und Anmeldeprozess und starten einen neuen Gruppenaktivität. Die Cypress Tests werden leider nicht in der Pipeline ausgeführt, da unsere GitLab Runner mit den existierenden Jobs bereits alle Hände voll zu tun hatten. Gegen Ende der Woche, als der Zeitdruck stieg, mussten wir sogar manche Pipeline Steps deaktivieren, um das Deployment zu beschleunigen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="952" height="615" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/image3.png" alt="" class="wp-image-14286"/><figcaption class="wp-element-caption"><strong>Erfolgreich durchgelaufene Pipeline (32 Minuten!)</strong></figcaption></figure>



<h4 class="wp-block-heading">Internes App-Publishing</h4>



<p class="wp-block-paragraph">Eine der Anforderungen unserer Auftraggeber war es, die fertige App auch auf zumindest einer der beiden Plattformen auf eine beliebige Weise öffentlich zur Verfügung zu stellen. Wir entschieden uns dafür Firebase App Distribution zu verwenden, um unsere Android App einer fest definierten Personengruppe ausliefern zu können. Es wurde ein Build Job in unserer GitLab Pipeline eingerichtet, der uns ein APK-File gebaut hat und dieses über die Firebase CLI in einen geschlossenen Test hochgeladen hat, in denen sowohl alle Teammitglieder*innen als auch unsere Dozenten eingeladen wurden. So wurde nach jedem Commit auf unseren master-branch eine neue App-Version veröffentlicht, die mit einem Klick in der Firebase App Distribution App heruntergeladen werden konnte.</p>



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



<p class="wp-block-paragraph">In Bezug auf Sensoren wurden wir mit verschiedenen Heart Rate Monitors (HRMs) wie Wahoo Tickr Fit und einem Modell von Moofit ausgestattet. Um diese Daten auslesen zu können, haben wir das Capacitor Community Plugin “Bluetooth Low Energy” verwendet.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="3024" height="4032" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/hrm-rotated.jpeg" alt="" class="wp-image-14278" style="width:auto;height:400px" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/hrm-rotated.jpeg 3024w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/hrm-1152x1536.jpeg 1152w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/hrm-1536x2048.jpeg 1536w" sizes="auto, (max-width: 3024px) 100vw, 3024px" /><figcaption class="wp-element-caption"><strong>Beispiel: Einer der verwendeten Herzfrequenzsensoren</strong></figcaption></figure>



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



<p class="wp-block-paragraph">Generell haben wir beschlossen, dass wir jeden Tag um 9 Uhr mit der Arbeit beginnen werden. Wir haben auch die gesamte Woche vor Ort gearbeitet, da wir es als die bessere Option empfunden haben und gehört haben, wie schlecht es der Gruppe ging, welche nur im Home Office gearbeitet hat. Um uns besser organisieren zu können, haben wir jeden Tag um 10:00 ein Daily Standup abgehalten, wo wir unseren derzeitigen Stand den Dozenten gezeigt und erklärt haben und wir Feedback auf diesen erhalten haben. Bei diesen Standups haben wir auch unsere Ziele für den Tag festgelegt, damit wir wissen, auf was wir uns fokussieren werden.</p>



<figure class="wp-block-gallery has-nested-images columns-default 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="4624" height="3468" data-id="14281" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup1.jpg" alt="" class="wp-image-14281" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup1.jpg 4624w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup1-1536x1152.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup1-2048x1536.jpg 2048w" sizes="auto, (max-width: 4624px) 100vw, 4624px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="3472" height="4624" data-id="14282" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup2.jpg" alt="" class="wp-image-14282" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup2.jpg 3472w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup2-1153x1536.jpg 1153w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/standup2-1538x2048.jpg 1538w" sizes="auto, (max-width: 3472px) 100vw, 3472px" /></figure>
<figcaption class="blocks-gallery-caption wp-element-caption"><strong>Daily Standup: Zieldefinition für den Arbeitstag</strong></figcaption></figure>



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



<p class="wp-block-paragraph">Ziel des ersten Tages war es, ein Monorepo auf GitLab anzulegen und das Projekt zu initialisieren. Im Frontend beschäftigten wir uns mit den ersten Sensoren, und im Backend wurde die Datenbank aufgesetzt und mit den Websockets begonnen. Weiters richteten wir Firebase App Distribution für die Android Plattform ein.</p>



<p class="wp-block-paragraph">Am Dienstag besprochen wir, wie unsere Entities/Daten aussehen würden. Das Feature “User Registrierung und Login” wurde implementiert, und wir machten uns Gedanken über das UI-Konzept und die Datenvisualisierung. Zusätzlich überlegten wir uns die Verwendung und Berechnung der Rohdaten der Sensoren, und implementierten automatisierte Android Builds.</p>



<p class="wp-block-paragraph">Am Mittwoch, nachdem wir Feedback zu unserem UI-Konzept erhielten, verfeinerten wir dieses und überlegten uns ein bestimmtes Szenario für die Datenvisualisierung. Danach machten wir uns daran, die UI umzusetzen, ClientSDK zu generieren und Endpoints und Services im Backend zu erstellen. Weitere Ziele waren, Sensordaten über Websockets schicken und empfangen zu können, und eine Session sowohl im Frontend als auch im Backend erstellen zu können.</p>



<p class="wp-block-paragraph">In den letzten beiden Tagen ging es darum, alle Features des MVP fertigzustellen und letzte Bugs zu fixen. Dazu gehörten: Auth (Route Guard, Token, …), alles rund um Sessions (Create, Join, End, Leave), die Kommunikation der Daten über Websockets, Edit Profile, Datenvalidierung (null, -1, …), Loading Indicator, und mehr.</p>



<p class="wp-block-paragraph">Am Freitagnachmittag wurde das Endprodukt präsentiert &#8211; mehr dazu etwas später in diesem Blogbeitrag.</p>



<p class="wp-block-paragraph">Neben der Arbeit kam aber auch nicht der Spaß zu kurz. Darum nutzten wir als Team am 4. Tag der Wild Week (Donnerstag) die Möglichkeit, beim FH internen “IMFix” Event vorbeizuschauen. Neben Snacks, Bier und guter Laune konnten wir uns bei mehreren Multiplayer Spielen entspannen, bevor es dann in die heiße Endphase des Projektes ging.</p>



<figure class="wp-block-gallery has-nested-images columns-default 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="1080" height="1920" data-id="14259" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_1.jpg" alt="" class="wp-image-14259" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_1.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_1-864x1536.jpg 864w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="3024" height="4032" data-id="14262" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_2-2-rotated.jpeg" alt="" class="wp-image-14262" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_2-2-rotated.jpeg 3024w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_2-2-1152x1536.jpeg 1152w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/imfix_2-2-1536x2048.jpeg 1536w" sizes="auto, (max-width: 3024px) 100vw, 3024px" /></figure>
<figcaption class="blocks-gallery-caption wp-element-caption"><strong>Kurze Verschnaufpause beim IMFix Event &#8211; <em>&#8220;Don&#8217;t drink and drive&#8221;</em> wurde hier ausnahmsweise mal nicht ganz ernst genommen.</strong></figcaption></figure>



<h2 class="wp-block-heading">Abgeliefertes Endprodukt</h2>



<p class="wp-block-paragraph">Unsere App ist in mehrere übersichtliche Screens unterteilt, die den User Schritt für Schritt durch den gesamten Ablauf führen. Von der Anmeldung über die Erstellung oder Teilnahme an einer Session bis hin zur aktiven Nutzung während eines Laufs sind alle Funktionen klar strukturiert. Im Mittelpunkt stehen dabei das Dashboard als zentrale Steuerzentrale, der WaitingScreen zur Organisation der Teilnehmer*innen, sowie das Userprofil, in dem persönliche Daten verwaltet werden können. Während einer aktiven Session rücken das Leaderboard und die Kartenansicht in den Vordergrund. Hier werden in Echtzeit alle relevanten Informationen der Teilnehmer*innen angezeigt.&nbsp;<br>Bevor jedoch der eigentliche Ablauf startet, erfolgt der Einstieg über den Login oder die Registrierung.</p>



<h3 class="wp-block-heading">Login und Registrierung</h3>



<p class="wp-block-paragraph">Beim ersten Öffnen der App wird der User auf den Login-Screen weitergeleitet. Hier kann man sich entweder mit bestehenden Zugangsdaten anmelden oder sich neu registrieren. Die Registrierung erfolgt über ein kurzes Formular, bei dem grundlegende Daten wie Benutzername, E-Mail-Adresse und Passwort abgefragt werden.</p>



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



<p class="wp-block-paragraph">Sobald der Login oder die Registrierung abgeschlossen ist, gelangt der User auf das Dashboard. Hier stehen zwei Optionen zur Verfügung: Entweder eine neue Session zu erstellen oder einer bestehenden Session beizutreten. Diese Optionen sind jedoch zu Beginn ausgegraut dargestellt und können erst genutzt werden, wenn bestimmte Voraussetzungen erfüllt sind.</p>



<p class="wp-block-paragraph">Auf dem Dashboard befinden sich drei Buttons zur Aktivierung der benötigten Sensoren:</p>



<ul class="wp-block-list">
<li><strong>GPS</strong></li>



<li><strong>Herzfrequenzsensor</strong> (inkl. Bluetooth-Verbindung zu einem Wearable)</li>



<li><strong>Heading-Sensor</strong></li>
</ul>



<p class="wp-block-paragraph">Zu Beginn sind alle drei Buttons rot eingefärbt, um anzuzeigen, dass die jeweiligen Sensoren noch nicht aktiv sind. Nach dem erfolgreichen Aktivieren – sei es durch das Einschalten eines Gerätesensors oder die Herstellung einer Verbindung – wechselt die Farbe auf grün, was visuell signalisiert, dass der jeweilige Sensor nun einsatzbereit ist.</p>



<p class="wp-block-paragraph">Erst wenn entweder das GPS-Signal oder der Herzfrequenzsensor aktiviert wurde, werden die beiden Optionen „Session erstellen“ und „Session beitreten“ freigeschaltet und können ausgewählt werden. Optional kann zusätzlich der Heading-Sensor aktiviert werden, der später auf der Karte eine genauere Bewegungsrichtung ermöglicht.</p>



<p class="wp-block-paragraph">Beim Beitritt zu einer Session muss zuvor die Session-ID, die man über einen QR-Code oder eine Nachricht erhalten hat, in ein Inputfeld eingegeben werden. Danach geht es automatisch weiter zum nächsten Screen.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1170" height="2532" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/dashboard.png" alt="" class="wp-image-14272" style="width:auto;height:400px" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/dashboard.png 1170w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/dashboard-710x1536.png 710w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/dashboard-946x2048.png 946w" sizes="auto, (max-width: 1170px) 100vw, 1170px" /><figcaption class="wp-element-caption"><strong>Screenshot: Dashboard</strong></figcaption></figure>



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



<p class="wp-block-paragraph">Am WaitingScreen wird die aktuelle Teilnehmerliste angezeigt. Dort sieht der User, wer sich bereits angemeldet hat. Die Liste aktualisiert sich automatisch, sobald weitere Personen hinzukommen.</p>



<p class="wp-block-paragraph">Über den Abmelde-Button kann sich der User jederzeit wieder von der Session entfernen. Man wird dabei direkt zurück ins Dashboard geleitet. Sollte jedoch der Host selbst auf „Abmelden“ klicken, wird nicht nur die eigene Verbindung getrennt, sondern die komplette Session gelöscht, inklusive aller Teilnehmerinnen. Auch in diesem Fall gelangen alle automatisch zurück ins Dashboard.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1170" height="2532" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/waitingscreen.jpg" alt="" class="wp-image-14273" style="width:auto;height:400px" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/waitingscreen.jpg 1170w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/waitingscreen-710x1536.jpg 710w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/waitingscreen-946x2048.jpg 946w" sizes="auto, (max-width: 1170px) 100vw, 1170px" /><figcaption class="wp-element-caption"><strong>Screenshot: WaitingScreen</strong></figcaption></figure>



<h3 class="wp-block-heading">QR-Modal</h3>



<p class="wp-block-paragraph">Für den Ersteller der Session gibt es die Möglichkeit, einen QR-Code zu generieren. Dieser Button befindet sich oberhalb der Teilnehmerliste. Nach dem Klick öffnet sich ein Modal, in dem der QR-Code angezeigt wird. Dieser enthält die Session-ID und kann über einen Button ebenso in die Zwischenablage kopiert werden. Zusätzlich gibt es die Möglichkeit, die Session-ID direkt per Nachricht oder Social Media zu teilen. Wenn der Host entscheidet, dass alle bereit sind, kann die Session jederzeit über den Start-Button gestartet werden.</p>



<p class="wp-block-paragraph">Sobald der Host einer Session auf “Start” klickt, kommen alle User*innen einer Session auf das Leaderboard. Dort befindet sich das Grundkonzept unserer App. Ganz oben am Screen findet man zwei Tabs, um zwischen 2 Ansichten zu wechseln: das Leaderboard und die Kartenansicht.</p>



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



<p class="wp-block-paragraph">Oben am Bildschirm findet der*die User*in die Ranganzeige. Der eigene Rang wird ziemlich groß dargestellt, damit man sofort erkennt, wo man sich am Leaderboard befindet. Gleich darunter findet sich das eigentlich wichtigste Feature unserer App, nämlich die visuelle Anzeige der Herzfrequenz und der Geschwindigkeit. Die Herzfrequenz wird bei uns in 3 Zonen eingeteilt. In der mittleren Zone befindet sich die &#8220;ideale Herzfrequenz&#8221; für den*die User*in für die aktuelle Aktivität. Sobald man sich in der linken oder in der rechten Zone befindet, bedeutet das, dass die Herzfrequenz zu niedrig bzw. zu hoch ist. Die &#8220;ideale Herzfrequenz&#8221; berechnet sich aus dem Alter des Users bzw. der Userin, damit die Fairness bei Teilnehmer*innen unterschiedlichen Alters erhalten bleibt. Die visuelle Darstellung wurde als Balken gelöst, da wir so die 3 Zonen in Farben unterteilen konnten und die aktive Herzfrequenz auf diesem Balken hin- und herwandern kann. Innerhalb der Balken befindet sich auch die Anzahl der Punkte, die man bekommt, je nachdem, in welcher Zone man sich befindet. Das Punktesystem für die Herzfrequenz wurde so gelöst, dass nur die mittlere Zone, also Zone 2, die meisten Punkte (+5 Punkte) bekommt. Die anderen zwei Zonen bekommen jeweils +2 Punkte. Somit bekommt der*die Nutzer*in alle 3 Sekunden, je nach Zone, die Punkte gutgeschrieben.&nbsp;</p>



<p class="wp-block-paragraph">Unterhalb des Herzfrequenz-Balkens befindet sich der Geschwindigkeits-Balken, dieser basiert auf dem gleichen Prinzip. Je nach Geschwindigkeit gehen die Punkte nach oben, je schneller desto mehr Punkte. Auch hier wurde der Balken in mehrere Zonen unterteilt, die farblich markiert sind.</p>



<p class="wp-block-paragraph">Unterhalb der beiden Balken befindet sich auch schon das Leaderboard. Dort werden alle Teilnehmer*innen angezeigt, sowie deren Punktzahl. Alle Punkte werden permanent alle 3 Sekunden geupdatet, damit das Board ständig in Bewegung ist. Wenn sich Plätze ändern, passiert dies in einer überlappenden Animation. Außerdem werden Plätze 1-3 in den klassischen Farben Gold, Silber, Bronze dargestellt.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1170" height="2532" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/leaderboard.jpg" alt="" class="wp-image-14274" style="width:185px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/leaderboard.jpg 1170w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/leaderboard-710x1536.jpg 710w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/leaderboard-946x2048.jpg 946w" sizes="auto, (max-width: 1170px) 100vw, 1170px" /><figcaption class="wp-element-caption"><strong>Screenshot: Leaderboard</strong></figcaption></figure>



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



<p class="wp-block-paragraph">Auf dieser Seite befindet sich eine Karte von &#8220;Leaflet&#8221;, die in voller Bildschirmgröße dargestellt wird. Sie dient dazu, dass man jederzeit alle Teilnehmer*innen aktiv auf der Karte verfolgen kann, sollte sich beispielsweise ein*e User*in in einer anderen Stadt befinden. Alle Teilnehmer*innen werden jeweils als Dreieck, in einer individuellen Farbe, dargestellt. Wir haben uns für Dreiecke entschieden, weil wir so die Richtung anzeigen können, in die sich ein*e Nutzer*in bewegt. Aufgrund zeitlicher Begrenzung war das auch schon die Funktion unserer Karte.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1170" height="2532" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/map.jpg" alt="" class="wp-image-14275" style="width:auto;height:400px" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/map.jpg 1170w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/map-710x1536.jpg 710w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/map-946x2048.jpg 946w" sizes="auto, (max-width: 1170px) 100vw, 1170px" /><figcaption class="wp-element-caption"><strong>Screenshot: Kartenansicht</strong></figcaption></figure>



<h3 class="wp-block-heading">User-Profil</h3>



<p class="wp-block-paragraph">Das Userprofile ist sehr simpel gehalten und bietet nur die Möglichkeit, Daten der Nutzer*innen zu ändern, wie zum Beispiel das Alter. Außerdem befindet sich dort der Logout Button.</p>



<h2 class="wp-block-heading">Endpräsentation und Feedback</h2>



<h3 class="wp-block-heading">Ablauf der Präsentation / Abgabe</h3>



<p class="wp-block-paragraph">Am Nachmittag des fünften und letzten Tags der Extreme Programming Week war es soweit: das Produkt der Woche sollte präsentiert werden. Kurz vor dem ausgemachten Termin mit unseren Masterklasseleitern war es noch recht stressig, da noch einige kleine Bugs aufkamen, die gefixt werden mussten. Trotzdem schafften wir es recht pünktlich, mit der App-Demo anzufangen.</p>



<p class="wp-block-paragraph">Zuerst installierten wir die App auf unseren Handys: auf Android via Firebase App Distribution und für iOS direkt von Xcode am Laptop auf das iPhone via USB-Kabel. Danach zeigten wir unseren Masterklasseleitern, wie man sich in der App registrieren und einloggen kann, und wie das Dashboard und die Account-Seite aussehen, sobald man eingeloggt ist. Die Herzfrequenz-Sensoren, welche wir zur Verfügung hatten, wurden unterschiedlichen Personen angelegt und mit Handys verbunden.</p>



<p class="wp-block-paragraph">Schließlich war es Zeit für eine Demonstration der App in einem echten Szenario: eine Person unter uns erstellte eine Session und alle anderen traten dieser bei. Sobald alle drinnen waren, machten wir uns auf den Weg. Während einem Spaziergang rund um das Gebäude (der Rückweg wurde sogar gelaufen!) probierten wir die App aus und beobachteten dabei unsere eigenen Werte (Herzfrequenz, Position, Geschwindigkeit), sowie die Punkte auf dem Leaderboard.</p>



<p class="wp-block-paragraph">Als wir zu dem Raum der Lehrveranstaltung zurückkehrten, gaben unsere Masterklasseleitern ihr Feedback zu unserem Endprodukt. Dadurch, dass wir die Anforderungen des MVP erfüllten, und auch noch einige Nice-To-Have-Funktionalitäten einbauten, war unser Projekt erfolgreich. Wir freuten uns über die positiven Rückmeldungen und über Ideen für mögliche Erweiterungen und Verbesserungen der App.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="4032" height="3024" data-id="14267" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo1.jpg" alt="" class="wp-image-14267" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo1.jpg 4032w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo1-1536x1152.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo1-2048x1536.jpg 2048w" sizes="auto, (max-width: 4032px) 100vw, 4032px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="3024" height="4032" data-id="14268" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo2.jpg" alt="" class="wp-image-14268" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo2.jpg 3024w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo2-1152x1536.jpg 1152w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo2-1536x2048.jpg 1536w" sizes="auto, (max-width: 3024px) 100vw, 3024px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="3024" height="4032" data-id="14269" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo3.jpg" alt="" class="wp-image-14269" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo3.jpg 3024w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo3-1152x1536.jpg 1152w, https://mobile.fhstp.ac.at/wp-content/uploads/2025/05/demo3-1536x2048.jpg 1536w" sizes="auto, (max-width: 3024px) 100vw, 3024px" /></figure>
<figcaption class="blocks-gallery-caption wp-element-caption"><strong>Interaktive Live-Demo am Parkplatz der FH St. Pölten</strong></figcaption></figure>



<h3 class="wp-block-heading">Erhaltenes Feedback: Verbesserungspotenzial</h3>



<p class="wp-block-paragraph">Im Laufe der interaktiven Live-Demo und im Anschluss zur Präsentation erhielten wir folgendes Feedback:</p>



<ul class="wp-block-list">
<li>Die WebSocket-Verbindung bricht öfters ab (z.B. beim Wechsel von WLAN zu Mobilen Daten, und auch nach einer Weile von Inaktivität). Eine Möglichkeit, sich (automatisch) wieder verbinden zu können, sollte implementiert werden.</li>



<li>Die Berechnung der Daten (Punkte für das Leaderboard) wird momentan clientseitig durchgeführt. Die Berechnung sollte serverseitig passieren.</li>



<li>Wenn sowohl die Herzfrequenz, als auch die GPS-Daten, null sind, verschwindet der visuelle Balken dieser Person im Leaderboard.</li>



<li>Der Code, der eingegeben werden muss, um einer Session beizutreten, sollte kürzer sein. Zusätzlich wäre ein eingebauter QR-Code-Reader cool. (Dies hatten wir eigentlich vor, es ist sich zeitlich aber leider nicht ganz ausgegangen)</li>



<li>Es wäre gut, während der Session sehen zu können…
<ul class="wp-block-list">
<li>…wie akkurat die Daten sind (z.B. Position).</li>



<li>…ob eine Person einen Herzfrequenz-Sensor verbunden hat. (Zusätzlich wäre es von Vorteil, sich während der Session auch später noch mit einem Herzfrequenz-Sensor verbinden zu können.)</li>



<li>…ob eine Person momentan disconnected ist.</li>
</ul>
</li>



<li>Ein Nice-To-Have wäre noch, dass man in dem Leaderboard während der Session auf einzelne User*innen draufklicken kann, um Detaildaten zu der Person zu sehen. Eventuell könnten in der View die Daten der anderen Person auch gleich mit den eigenen verglichen werden.</li>
</ul>



<h2 class="wp-block-heading">Fazit aller Teilnehmer*innen</h2>



<p class="wp-block-paragraph">Im folgenden Abschnitt möchten wir noch unser Fazit und unsere Erfahrungen teilen, die wir während der Extreme Programming Week sammeln konnten.</p>



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



<p class="wp-block-paragraph">Ich bin sehr stolz auf das, was wir in diesen fünf Tagen geleistet haben. Die Extreme Programming Week hat nicht nur unsere Zeitmanagement-Skills, sondern auch zum ersten Mal unsere koordinierte Zusammenarbeit als Team auf die Probe gestellt. Ich war positiv überrascht, wie gut dies funktioniert hat &#8211; ich glaube, die täglichen Meetings haben sehr stark zu unserem Erfolg beigetragen.</p>



<p class="wp-block-paragraph">Meine Aufgaben während der Woche waren unter anderem das Leiten der Meetings, das Testen und Debuggen der nativen Funktionalitäten (insbesondere auf dem iPhone) und Frontend Development. Dabei habe ich mich zum Beispiel intensiv mit Device-Daten (Geolocation, Accelerometer, Gyroskop, etc.) beschäftigt, um diese einerseits in der App anzuzeigen, und andererseits, um sie zur Berechnung von Herzfrequenzzonen, Kalorienverbrauch und sogar einem Schrittzähler zu verwenden. Letzteres hat es aus Zeitgründen leider nicht in das Endprodukt geschafft, aber die Erfahrungen, welche ich dabei gesammelt habe, bleiben mir erhalten.</p>



<p class="wp-block-paragraph">Im Laufe der Woche hatte ich auch die Möglichkeit, gemeinsam mit Caro im Pair-Programming-Stil an der Authentifizierung im Frontend zu arbeiten. Diese Art des Arbeitens war recht neu für mich, aber ich muss sagen, dass ich eine sehr positive Erfahrung damit gemacht habe &#8211; wenn zwei kreative Köpfe zusammenkommen, kann so einiges entstehen!</p>



<p class="wp-block-paragraph">Zusammenfassend kann man sagen, dass die Woche recht stressig war, besonders gegen Ende hin, aber ich habe sehr viel dabei gelernt. Vom technischen Know-how bis hin zu Leadership, Zeitmanagement und Team-Skills war alles dabei. Ich wünschte, ich hätte noch mehr Einblick in das Backend und den CI/CD-Prozess bekommen können, aber aus Zeitgründen war das nicht möglich. Alles in allem blicke ich positiv auf die Extreme Programming Week zurück: es war eine spannende Woche voller wertvoller Erfahrungen, welche uns als Team noch enger zusammengeschweißt hat, und aus der ich viel neues Wissen für die Zukunft mitnehme.</p>



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



<p class="wp-block-paragraph">Ich blicke gerne auf die Wild Week zurück und bin stolz auf das Endprodukt, das wir als Team in der Woche geschaffen haben. Es war schön zu sehen, wie jedes Teammitglied seine bisherigen technischen Erfahrungen bei den verschiedenen Teilaufgaben des Projekts einbringen konnte. Durch das Setup (alle Teammitglieder ständig in einem Raum) konnten wir das Know-How auch sehr gut mit allen teilen.</p>



<p class="wp-block-paragraph">Sehr motivierend fand ich auch die Aufteilung in tägliche Sprints mit einem Meeting in der Früh, in dem wir immer die Aufgaben definierten und zwischen den Teammitgliedern verteilten, da man so ein festes Ziel für den Tag vor Augen hatte, auf das man hinarbeiten konnte.</p>



<p class="wp-block-paragraph">Ich konnte auf jeden Fall ein paar persönliche Learnings aus der Wild Week mitnehmen: Da das zu entwickelnde Produkt ja am Freitag zu präsentieren war und dadurch die Zeit ein extrem limitierender Faktor, war es essentiell, sich auf das MVP zu konzentrieren und sich nicht in Details zu verlieren. Das hat im Laufe der Woche mal mehr, mal weniger gut geklappt. Es ist auch gar nicht so leicht, stets den Fokus auf die Grundfunktionalität zu behalten, da man bei Projekten mit kompletter Entscheidungsfreiheit als Entwickler automatisch darüber nachdenkt, welche Features man nicht noch hinzufügen könnte. Gegen Ende der Woche hat sich das Pareto-Prinzip aus meiner Sicht auch wieder zum Teil bewahrheitet. Durch Erfolgsmomente am Anfang des Projekts ist man leicht dazu verleitet anzunehmen, dass die Entwicklungsgeschwindigkeit im selben Tempo bis zum Abschluss beibehalten werden kann &#8211; was sich nicht bewahrheitet hat. In einem zukünftigen Projekt dieser Art wäre es für mich wichtig, mehr Fokus darauf zu legen, wirklich beim MVP zu bleiben und den ganzen Entscheidungsprozess über zusätzliche Features erst gar nicht aufkommen zu lassen.</p>



<p class="wp-block-paragraph">Aus technischer Sicht fand ich super, mich wieder mehr mit React beschäftigen zu können. Hier habe ich einiges an Know-How aus der Woche mitnehmen können. Zusätzlich fand ich die Diskussionen mit meinen TeamkollegInnen über Architekturentscheidungen sehr spannend und fand es super, das ganze Tech Setup inkl. CI/CD für ein Projekt dieser Art von Grund auf einzurichten. Es war auch das erste Mal, dass ich an einer App gearbeitet habe, die hauptsächlich Websockets als Kommunikationskanal verwendet &#8211; es war spannend, mal mit einem anderen Schnittstelle als REST zu arbeiten.</p>



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



<p class="wp-block-paragraph">8 Teammitglieder, fast 5 Tage Entwicklungszeit und eine gemeinsame App-Idee realisieren – das war unser intensives und lehrreiches Projekt am Anfang des 2. Semesters, aus dem ich persönlich viel mitnehmen konnte. Die Woche war geprägt von enger Teamkommunikation, klarer Aufgabenverteilung und vielen kleinen Abstimmungen, die am Ende zu einem funktionierenden Gesamtprodukt geführt haben. Besonders interessant war für mich, wie unterschiedlich einzelne Teammitglieder an Aufgaben herangegangen sind – sowohl inhaltlich als auch methodisch. Dabei habe ich nicht nur verschiedene Denkansätze kennengelernt, sondern auch praktische Coding-Tipps und Lösungsstrategien aufgeschnappt, die mir in Zukunft sicher weiterhelfen werden.</p>



<p class="wp-block-paragraph">Mein Fokus lag zu Beginn auf der Planung unserer Datenbank. Zusammen mit Matthias habe ich verschiedene Datenbanktypen – wie z.B. relationale, NoSQL und Time-Series DBs – hinsichtlich ihrer Eignung für unseren Use Case bewertet. Auf Basis dieser Überlegungen sind wird bei einer klassischen relationalen DB geblieben, für die Matthias und ich ein erstes ER-Diagramm entworfen haben, das wir anschließend im Team besprochen und gemeinsam überarbeitet haben. Auch wenn dieser Prozess Zeit gekostet hat, konnten wir dadurch eine saubere, tragfähige Struktur aufsetzen, die sich später fast vollständig problemlos in NestJS integrieren ließ. Im weiteren Verlauf (nachdem der technische Aufbau der DB gestanden ist) habe ich mich verstärkt dem Frontend gewidmet, insbesondere der Nebenmaske für die User*innendaten, die noch nicht von meinen Kolleg*innen bearbeitet wurden. Dort konnte ich eigenständig erste Komponenten entwickeln, gerade bei Bereichen mit direktem Bezug zur Datenbank. Bei komplexeren Problemen habe ich auf Pair Programming gesetzt, um gemeinsam mit dem gebündelten Stärken meiner Kolleg*innen gezielte Lösungen zu finden.</p>



<p class="wp-block-paragraph">Eine besondere Herausforderung war auch für mich der Umgang mit dem begrenzten Zeitrahmen bei gleichzeitigem Anspruch auf sauberen, wartbaren Code. Ich habe gelernt, wie entscheidend es ist, in der Entwicklung frühzeitig sinnvolle Prioritäten zu setzen – also die „richtige“ Reihenfolge zu finden: Was muss funktionieren, was ist optional, und was kann man notfalls zurückstellen? Diese Balance war nicht immer einfach, aber essenziell, um alle Kernfunktionen zuverlässig umzusetzen. Mein Versuch, am Ende noch die Safe-Area technisch sauber zu integrieren, ist trotz mehrerer Ansätze gescheitert – aber genau daraus habe ich am meisten gelernt: Nicht jede Idee lässt sich unter Zeitdruck noch sinnvoll umsetzen, und pragmatisches Handeln ist oft wichtiger als Perfektion im Detail.<br><br>Um mein Fazit abzurunden, möchte ich gerne festhalten, dass dieses Projekt nicht nur meine technischen Fähigkeiten weiterentwickelt, sondern auch mein Verständnis für effiziente Teamarbeit unter Druck geschärft hat. Besonders der Umgang mit begrenzter Zeit und die bewusste Fokussierung auf das Wesentliche haben mir gezeigt, worauf es in realen Entwicklungsprozessen wirklich ankommt.</p>



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



<p class="wp-block-paragraph">Die Programming Week war für mich auf jeden Fall ein Highlight. In einer relativ großen Gruppe so ein Projekt in nur 5 Tagen umzusetzen war nicht nur super anstrengend, sondern auch spannend und lustig. Ich muss echt sagen, dass ich sehr viel gelernt habe, auch wenn ich leider von manchen Bereichen des Projekts nicht so viel mitbekommen habe, was aber durchaus verständlich ist, wenn man unter diesem Zeitdruck steht.</p>



<p class="wp-block-paragraph">Ich habe viel im Pair-Programming gearbeitet und das vor allem am Frontend. Das war für mich echt nützlich, da ich so schneller in das Projekt und in React reinfinden konnte. Ich habe mit Caro zuallererst begonnen, dass wir den Heart-Rate-Sensor mit Bluetooth verbinden können und die Daten auslesen können, das hat Anfangs ein bisschen schwierig funktioniert, aber dann haben wir zusammen auch schnell eine Lösung gefunden, was gerade am ersten Tag super motivierend war. Auch sonst war das gesamte Projekt sehr gut aufgebaut, weil wir jeden Tag mit einem Meeting begonnen haben, um die heutigen Ziele festzulegen. Anfangs dachte ich, dass wird ja dann echt einfach am Freitag fertig zu werden, wenn alles so schnell weitergeht, aber wie so oft unterschätzt man dann den Stress der letzten Tage. Wie ich schon einmal erwähnt habe, hätte ich noch sehr gerne mehr in das Backend und in die Websockets geschaut, aber leider war das zeitlich nicht mehr ganz möglich, aber dafür konnte ich im Frontend fast überall mitarbeiten, was natürlich auch dort mein Wissen verbessert hat.</p>



<p class="wp-block-paragraph">Das gesamte Projekt haben wir echt gut als Gruppe gemeistert. Wir hatten Spaß, waren gestresst und haben alle glaube ich sehr viel dabei gelernt. Das Endprodukt konnte sich bei der Präsentation auch sehen lassen, außer vielleicht ein paar kleine Bugs. Ich konnte auf jeden Fall sehr viel lernen und würde diese Art von Projekt gerne wiederholen, auch wenn eine Pause nach dieser Woche sehr gut getan hat. </p>



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



<p class="wp-block-paragraph">Es war sehr spannend zu sehen, wie viel man zu acht in einer Woche bzw. 5 Tagen schafft zu entwickeln. Ich habe mich vor allem mit dem Frontend beschäftigt und dabei meist Pair Programming mit verschiedenen Personen betrieben. Dieses Konzept ist mir bereits aus dem Bachelor bekannt und mir persönlich gefällt es sehr gut, da man so schneller Fehler bemerkt.</p>



<p class="wp-block-paragraph">Montags habe ich mich mit Felix um die Verbindung zum Heart Rate Sensor gekümmert. Anfangs gab es ein paar Schwierigkeiten, doch dann folgte das Erfolgserlebnis. Die Verwendung von HRMs und Bluetooth LE war für mich neu, aber sehr interessant. Dienstags habe ich mich vor allem mit dem Login- und Registrierungs-Screen beschäftigt und dafür anfangs Farben und Schriftarten global definiert und Tailwind aufgesetzt. In Bezug auf die Formulare auf den zwei Screens nutze ich React Hook Form, wobei ich die Library zu einem späteren Zeitpunkt ersetzt habe, da der State nicht immer aktualisiert wurde. Nachdem wir am Mittwoch unser UI-Konzept und die Datenvisualisierung überarbeitet hatten, habe ich mit Felix die Umsetzung des LiveActivity-Screens begonnen. Donnerstags war ich mit Katharina für den Authentifizierungscheck beim Aufruf gewisser Routen verantwortlich und habe Andi beim Bearbeiten der Profilinformationen geholfen. Am letzten Tag war Endspurt angesagt und somit auch Bug Fixing. Dabei habe ich einerseits David bei der Verwendung der WebSockets im Frontend unterstützt, andererseits Matthias bei der Session Erstellung/Teilnahme.</p>



<p class="wp-block-paragraph">Ich finde, wir haben das als Gruppe sehr gut gemeistert, mit dem Daily Planning am Anfang war klar definiert, was gemacht wird, und das Endprodukt (bis auf die paar Bugs) kann sich sehen lassen. Vor allem was die Verbindung mit den Sensoren und die Erstellung eigener sogenannter Guarded Routes betrifft, habe ich einiges gelernt, was auch in Zukunft hilfreich sein könnte. Neben den technischen Aspekten habe ich nochmals gesehen, wie wichtig es ist, sich zuerst auf das MVP zu konzentrieren und sicherzustellen, dass das die anderen auch tun, da man sonst Zeit verliert und sich verrennen kann.</p>



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



<p class="wp-block-paragraph">Die Wild Week war ein wirklich interessantes und spannendes Erlebnis. Ein ganzes Projekt in nicht einmal 5 Tagen auf die Beine zu stellen war extremst stressig, aber auch wirklich toll zu sehen, was man eigentlich in so kurzer Zeit auf die Beine stellen kann, wenn man sich wirklich ins Zeug lägt. Auch konnte ich einiges aus dieser Woche mitnehmen.</p>



<p class="wp-block-paragraph">Zum einen hatte ich bisher noch keine Erfahrung mit Ionic in Verbindung mit React. Ich habe nur Ionic und Angular oder React Native verwendet, aber nicht beide zusammen. Auch habe ich einiges über die Verwendung von Herz Sensoren erfahren, auch wenn meine Erfahrung hier etwas kurz gekommen ist, da ich größtenteils im Backend zuständig war. Ich hätte sehr gerne auch andere Bereiche mir angeschaut, aber aufgrund des Zeitstresses ist es verständlich, dass dies nicht wirklich möglich war. In der Woche habe ich manchmal allein gearbeitet, zum Beispiel für die Erforschung, wie das Accelerometer im Handy funktioniert oder im Backend die Datenspeicherung über die passenden Endpoints zu ermöglichen, habe aber auch einiges im Pair Programming gemacht. Auf beiden Seiten. Auch wenn ich diese Technik schon aus dem Bachelor kannte, ist es trotzdem immer interessant zu sehen, wie gut Pair Programming funktioniert. Eine weitere Person neben sich zu haben, die sich nur darauf konzentrieren kann, was geschrieben wird und sofort erkennen kann, wenn man eine Sache vergisst oder welche einem bei Problemen hilft, ist sehr wertvoll, vor allem wenn nicht jede Person im Team an einer eignen Sache arbeiten kann.</p>



<p class="wp-block-paragraph">Im großen und ganzem finde ich das die Wild Week wirklich toll gelaufen ist. Wir haben uns viel vorgenommen, dies aber auch toll hinbekommen. Mit den Daily Stand-ups, welche wir immer in der Früh gemacht haben, konnten wir uns jeden Tag auf unsere Ziele festlegen und auf diese fokussieren. Man konnte auch wirklich gut erkenne, weshalb das Prinzip eines MVPs existiertet. Ich hätte nichts dagegen, einmal wieder so ein Projekt zu wiederholen.</p>



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



<p class="wp-block-paragraph">Es war eine spannende Woche! In fünf Tagen haben wir viel diskutiert, Entscheidungen getroffen und fleißig in die Tasten gehauen. Das Ergebnis ist ein Proof of Concept, der unsere interessante App-Idee greifbar macht. Mit diesem Ergebnis sind wir insgesamt sehr zufrieden. Allerdings schwingt beim „insgesamt“ auch ein kleiner Vorbehalt mit: Hätten wir vielleicht noch mehr aus dieser Woche herausholen können?</p>



<p class="wp-block-paragraph">Viel Zeit hat unser Team zur Konzeption der App aufgewendet. Diese Zeit scheint mir rückblickend gut investiert. Es war wichtig, eine Idee auszuarbeiten, die wir spannend und sinnvoll fanden. Erst mit dieser klaren Vorstellung konnten wir mit Elan loslegen. Unsere Schwächen sehe ich eher bei der Aufteilung und Priorisierung der Arbeit. Die Features der App haben wir in Backend und Frontend unterteilt und zu unabhängig voneinander umgesetzt. Das führte dazu, dass im Backend Funktionen implementiert wurden, die im Frontend letztlich keine Verwendung fanden. Wie im Kapitel zu CI/CD erwähnt, haben wir außerdem zu viel Energie in unsere Pipelines gesteckt. Ein weiteres Problem der Aufteilung war, dass das Zusammenführen der Arbeiten erst spät erfolgte, wodurch wir auch erst spät auf Probleme aufmerksam wurden. Sinnvoller wäre es wohl gewesen, wenn Sub-Teams End-to-End an einzelnen Features gearbeitet hätten, sodass die App schrittweise gewachsen wäre.</p>



<p class="wp-block-paragraph">Insgesamt war es jedoch eine produktive Woche, in der wir als Team nicht nur viel geschafft, sondern auch viel Spaß gehabt haben. Es war wirklich schön, sich fünf Tage lang intensiv in ein völlig neues Thema zu vertiefen – eine willkommene Abwechslung! Die Erfahrungen aus dieser Woche und das gestärkte Teamgefühl werden uns im nächsten Projektsemester mit Sicherheit zugutekommen.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/blog-movemates/">Blog | MoveMates</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Blog &#124; Microinteractions: Kleine Details mit großer Wirkung</title>
		<link>https://mobile.fhstp.ac.at/ux/blog-microinteractions-kleine-details-mit-grosser-wirkung/</link>
		
		<dc:creator><![CDATA[Matthias Frankowski]]></dc:creator>
		<pubDate>Thu, 24 Apr 2025 08:11:09 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Trends]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Blogartikel]]></category>
		<category><![CDATA[microinteractions]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Web-App]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=14092</guid>

					<description><![CDATA[<p>In der heutigen Welt der App- und Webentwicklung spielen kleine Details eine entscheidende Rolle, wenn es darum geht, die User Experience (UX) nachhaltig zu verbessern. Oft sind es genau diese feinen Interaktionen – die sogenannten Microinteractions – die den Unterschied zwischen einer rein funktionalen und einer wirklich mitreißenden Anwendung ausmachen. In diesem Beitrag möchte ich <a class="read-more" href="https://mobile.fhstp.ac.at/ux/blog-microinteractions-kleine-details-mit-grosser-wirkung/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/ux/blog-microinteractions-kleine-details-mit-grosser-wirkung/">Blog | Microinteractions: Kleine Details mit großer Wirkung</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">In der heutigen Welt der App- und Webentwicklung spielen kleine Details eine entscheidende Rolle, wenn es darum geht, die User Experience (UX) nachhaltig zu verbessern. Oft sind es genau diese feinen Interaktionen – die sogenannten Microinteractions – die den Unterschied zwischen einer rein funktionalen und einer wirklich mitreißenden Anwendung ausmachen. In diesem Beitrag möchte ich zeigen, wie Microinteractions nicht nur das Design aufwerten, sondern auch das Engagement der Nutzer signifikant steigern können.</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><strong>Was sind Microinteractions?</strong></h2>



<p class="wp-block-paragraph">Microinteractions sind kleine, intuitive Reaktionen einer Anwendung auf Nutzeraktionen. Sie informieren den Anwender in Echtzeit darüber, was gerade passiert, und tragen dazu bei, dass er sich immer gut abgeholt fühlt. Zu den klassischen Beispielen gehören:</p>



<ul class="wp-block-list">
<li><strong>Animierte Buttons:</strong>&nbsp;Die visuelle Rückmeldung beim Hover oder Klick, die dem Nutzer signalisiert, dass eine Aktion registriert wurde.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Slider:</strong>&nbsp;Dynamische Übergänge und Anpassungen, die eine flüssige Bedienung ermöglichen.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Feedback-Animationen:</strong>&nbsp;Kurze visuelle Effekte, die beispielsweise den erfolgreichen Abschluss einer Aktion bestätigen.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Haptische und auditive Signale:</strong> Vibrationseffekte oder dezente Soundeffekte, die das Feedback multisensorisch verstärken.</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><strong>Warum sind Microinteractions wichtig?</strong></h2>



<p class="wp-block-paragraph">Studien, etwa von der <a href="https://www.nngroup.com/articles/microinteractions/">Nielsen Norman Group</a>, haben gezeigt, dass durchdachte Microinteractions das emotionale Erleben und die Zufriedenheit der Nutzer maßgeblich beeinflussen können. Die Bedeutung von Microinteractions lässt sich an mehreren Punkten festmachen:</p>



<ul class="wp-block-list">
<li><strong>Verbesserung der Usability:</strong>&nbsp;Durch kontinuierliche, intuitive Rückmeldungen fühlt sich der Nutzer sicher und gut betreut.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Erhöhung des User-Engagements:</strong>&nbsp;Kleine Animationen und Effekte machen die Interaktion lebendiger und motivieren den Anwender, sich intensiver mit der Anwendung auseinanderzusetzen.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Stärkung des Nutzervertrauens:</strong>&nbsp;Wenn Nutzer sofort visuelles, haptisches oder auditives Feedback erhalten, steigt das Vertrauen in die Funktionsweise der Anwendung – ein entscheidender Faktor für den Erfolg moderner Softwarelösungen.</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><strong>Umsetzungsmöglichkeiten</strong></h2>



<p class="wp-block-paragraph">Für die Implementierung von Microinteractions stehen zahlreiche Techniken und Bibliotheken zur Verfügung:</p>



<h3 class="wp-block-heading"><strong>1. CSS-Animationen</strong></h3>



<p class="wp-block-paragraph">CSS bietet mit <code>transition</code> und <code>@keyframes</code> eine niedrigschwellige Möglichkeit für viele Standard-Effekte. Diese Technik ist leichtgewichtig und läuft in allen modernen Browsern sehr performant. Beispielsweise kann ein Button durch leichte Veränderungen beim Hover sofort ins Auge fallen:</p>



<pre class="wp-block-code"><code>.button {
  transition: transform 0.2s ease, background-color 0.3s;
}
.button:hover {
  transform: scale(1.05);
  background-color: #007bff;
}
@keyframes pulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.1); }
  100% { transform: scale(1); }
}
.button.active {
  animation: pulse 1s infinite;
}</code></pre>



<p class="wp-block-paragraph">Diese Methode ist besonders effektiv für schnelle Prototypen und statische Webseiten.</p>



<h3 class="wp-block-heading"><strong>2. Framer Motion</strong> (React) <a href="https://motion.dev">https://motion.dev</a></h3>



<p class="wp-block-paragraph">Für React-basierte Projekte bietet Framer Motion eine deklarative API, die das Erstellen flüssiger und komplexer Animationen ermöglicht. Mit wenigen Codezeilen lassen sich reaktive und interaktive Elemente gestalten.</p>



<p class="wp-block-paragraph">Im folgenden Beispiel wird ein React-Button animiert, der beim Hover und Tap skaliert:</p>



<pre class="wp-block-code"><code>import { motion } from "framer-motion";

function AnimatedButton() {
  return (
    &lt;motion.button
      whileHover={{ scale: 1.1 }}
      whileTap={{ scale: 0.9 }}
    >
      Klick mich
    &lt;/motion.button>
  );
}</code></pre>



<p class="wp-block-paragraph">Mit Framer Motion kannst du <strong>Variants</strong> definieren, um verschiedene Zustände zu modellieren, und <strong>Transitions</strong>konfigurieren, um Dauer, Verzögerung und Typ (Spring vs. Tween) zu steuern. Dank <strong>Tree-shaking</strong> bleiben deine Bundles klein. Außerdem funktioniert Framer Motion sowohl client- als auch serverseitig (SSR) und verfügt über eine aktive Community und zahlreiche Beispiele.</p>



<h3 class="wp-block-heading"><strong>3. GSAP (GreenSock Animation Platform)</strong> <a href="https://gsap.com">https://gsap.com</a></h3>



<p class="wp-block-paragraph">GSAP ist eine leistungsstarke JavaScript-Animation-Bibliothek, die besonders für komplexe und präzise gesteuerte Animationen geeignet ist. Sie unterstützt TimeLines, Plugins wie ScrollTrigger für Scroll-basierte Animationen und kann mit DOM-, Canvas- oder SVG-Elementen arbeiten.</p>



<p class="wp-block-paragraph">Folgendes Beispiel demonstriert eine Hover-Animation auf einem Element mit der Klasse <code>.box</code>:</p>



<pre class="wp-block-code"><code>import { gsap } from 'gsap';

document.querySelector('.box').addEventListener('mouseenter', () => {
  gsap.to('.box', { duration: 0.3, scale: 1.1, ease: 'power2.out' });
});
document.querySelector('.box').addEventListener('mouseleave', () => {
  gsap.to('.box', { duration: 0.3, scale: 1, ease: 'power2.in' });
});</code></pre>



<p class="wp-block-paragraph"><strong>Erklärung:</strong></p>



<ol start="1" class="wp-block-list">
<li><code>document.querySelector('.box')</code> wählt das Element mit der Klasse <code>box</code> aus.</li>



<li>Bei <code>mouseenter</code> wird <code>gsap.to(...)</code> ausgeführt und skaliert das Element mit einer weichen Beschleunigung.</li>



<li>Bei <code>mouseleave</code> wird es wieder auf <code>scale: 1</code> zurückgesetzt.</li>
</ol>



<p class="wp-block-paragraph"><strong>Brauche ich GSAP dafür?</strong></p>



<p class="wp-block-paragraph">Für diesen einfachen Effekt genügt auch eine CSS-Lösung ohne zusätzliche Bibliothek:</p>



<pre class="wp-block-code"><code>.box {
  transition: transform 0.3s ease-in-out;
}
.box:hover {
  transform: scale(1.1);
}</code></pre>



<p class="wp-block-paragraph">Mit CSS erhältst du oft ausreichend Performance und musst keine externe Abhängigkeit einbinden. GSAP ist besonders dann sinnvoll, wenn du detaillierte Kontrolle über Sequenzen brauchst oder Animationen orchestrieren willst, die auf Scroll-, Audio- oder anderen externen Events basieren. Die Performance bleibt dabei dank optimierter Rendering-Loops hoch, auch bei vielen gleichzeitig laufenden Animationen.</p>



<h3 class="wp-block-heading"><strong>4. Haptisches Feedback </strong></h3>



<p class="wp-block-paragraph">Haptisches Feedback schafft ein taktiles Erlebnis und verstärkt die Wahrnehmung von Interaktionen. Auf mobilen Geräten kann die Vibration API genutzt werden, um kurze Vibrationseffekte zu erzeugen.</p>



<p class="wp-block-paragraph">So fügst du bei einem Button-Klick auf unterstützten Geräten eine Vibration hinzu: </p>



<p class="wp-block-paragraph"><strong>Browser (Web Vibration API):</strong></p>



<pre class="wp-block-code"><code>if ('vibrate' in navigator) {
  navigator.vibrate(200); // Vibrationsdauer in Millisekunden
}</code></pre>



<p class="wp-block-paragraph"><strong>Native Android (Kotlin):</strong></p>



<pre class="wp-block-code"><code>val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE))</code></pre>



<p class="wp-block-paragraph"><strong>Native iOS (Swift):</strong></p>



<pre class="wp-block-code"><code>let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccurred()</code></pre>



<p class="wp-block-paragraph">Zu beachten wäre dabei, dass haptisches Feedback in den Systemeinstellungen deaktiviert sein kann. Daher sollte vor dem Auslösen solcher Effekte geprüft werden, ob sie gewünscht sind. Haptische Effekte sollten sparsam und nur bei zentralen Interaktionen eingesetzt werden.</p>



<h3 class="wp-block-heading"><strong>4. Auditive Rückmeldungen</strong></h3>



<p class="wp-block-paragraph">Dezente Soundeffekte, beispielsweise bei Bestätigungen, können über HTML5-Audio-Elemente oder spezialisierte JavaScript-Plugins eingebunden werden.</p>



<pre class="wp-block-code"><code>&lt;audio id="clickSound" src="click.mp3">&lt;/audio>
&lt;button onclick="document.getElementById('clickSound').play()">Click me&lt;/button></code></pre>



<p class="wp-block-paragraph">Für komplexere Szenarien bietet die <strong><a href="https://www.w3.org/TR/webaudio-1.1/#audioapi">Web Audio API</a></strong> oder Bibliotheken wie <strong><a href="https://howlerjs.com">Howler.js</a></strong>  fortgeschrittene Features:</p>



<ul class="wp-block-list">
<li><strong>Audio-Sprites:</strong> Laden mehrerer kurzer Sounds in eine Datei, um Ladezeiten zu reduzieren.</li>



<li><strong>Dynamische Steuerung:</strong> Lautstärke, Panning und Effekte in Echtzeit anpassen.</li>
</ul>



<p class="wp-block-paragraph">Auch hier wäre zu beachten, dass Nutzer nicht mit dauerhaftem Audiofeedback überflutet werden. Empfehlenswert ist es, in den Einstellungen eine Option zur Deaktivierung oder Abschwächung von Tönen bereitzustellen.</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



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



<p class="wp-block-paragraph">Microinteractions sind ein mächtiges Mittel, um Nutzererlebnisse zu verfeinern und den Eindruck einer reaktionsschnellen, konsistenten Anwendung zu vermitteln. Durch den Einsatz von visuellen, haptischen und auditiven Feedback-Mechanismen wird die Interaktion intuitiver und ansprechender. Ganz gleich, ob man einfache CSS-Animationen, spezialisierte Bibliotheken wie Framer Motion oder GSAP oder plattformspezifische APIs nutzt — gut gestaltete Microinteractions können mit relativ geringem Entwicklungsaufwand eine große Wirkung erzielen und die User Experience signifikant verbessern.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/ux/blog-microinteractions-kleine-details-mit-grosser-wirkung/">Blog | Microinteractions: Kleine Details mit großer Wirkung</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Blog &#124; NativeWind: Tailwind für Expo React Native Apps</title>
		<link>https://mobile.fhstp.ac.at/development/blog-nativewind-tailwind-fuer-expo-react-native-apps/</link>
		
		<dc:creator><![CDATA[David Grünberger]]></dc:creator>
		<pubDate>Wed, 02 Apr 2025 23:58:06 +0000</pubDate>
				<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Trends]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Expo]]></category>
		<category><![CDATA[nativewind]]></category>
		<category><![CDATA[react native]]></category>
		<category><![CDATA[Tailwind]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14130</guid>

					<description><![CDATA[<p>Die Nutzung von Tailwind CSS in der Webentwicklung hat sich als äußerst effektiv und beliebt erwiesen. Es ermöglicht Entwicklern, schnell und effizient mit einem Utility-First-Ansatz zu arbeiten, der den Code kürzer und übersichtlicher macht. Aber was ist, wenn du eine React Native-App entwickelst? Wie kannst du den gleichen schnellen und flexiblen Ansatz zum Styling nutzen, <a class="read-more" href="https://mobile.fhstp.ac.at/development/blog-nativewind-tailwind-fuer-expo-react-native-apps/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/blog-nativewind-tailwind-fuer-expo-react-native-apps/">Blog | NativeWind: Tailwind für Expo React Native Apps</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">Die Nutzung von <strong>Tailwind CSS</strong> in der Webentwicklung hat sich als äußerst effektiv und beliebt erwiesen. Es ermöglicht Entwicklern, schnell und effizient mit einem <strong>Utility-First-Ansatz</strong> zu arbeiten, der den Code kürzer und übersichtlicher macht. Aber was ist, wenn du eine <strong>React Native</strong>-App entwickelst? Wie kannst du den gleichen schnellen und flexiblen Ansatz zum Styling nutzen, den du von Tailwind kennst? Hier kommt <strong>NativeWind</strong> ins Spiel – eine Tailwind-ähnliche Lösung für <strong>React Native</strong> und <strong>Expo</strong>. In diesem Beitrag werfen wir einen genaueren Blick darauf, was NativeWind ist, wie du es in einem Expo-Projekt einsetzen kannst und welche Vorteile es bietet.</p>



<h2 class="wp-block-heading"><strong>Was ist NativeWind?</strong></h2>



<p class="wp-block-paragraph"><strong>NativeWind</strong> ist eine <strong>Tailwind-inspirierte</strong> Bibliothek für <strong>React Native</strong>. Sie bringt das bewährte <strong>Utility-First-Designprinzip von Tailwind CSS</strong> in die mobile App-Entwicklung. Während Tailwind CSS das Front-End-Web-Design revolutioniert hat, bietet NativeWind eine vergleichbare Lösung für die mobile Entwicklung, die es dir ermöglicht, das Styling direkt in deinem <strong>JSX</strong> mit Tailwind-ähnlichen Utility-Klassen vorzunehmen. Dies bedeutet, dass du <strong>keine komplexen Style-Objekte</strong> oder separaten Stylesheets mehr benötigst, um deine mobile App zu stylen.</p>



<p class="wp-block-paragraph">Mit NativeWind kannst du deine <strong>React Native</strong>-App so schnell und effizient stylen, wie du es von Tailwind auf der Webseite gewohnt bist. Es ist speziell für <strong>Expo</strong> und <strong>React Native</strong> entwickelt und ermöglicht eine saubere und wartbare Codebasis.</p>



<h2 class="wp-block-heading"><strong>Warum NativeWind für Expo und React Native?</strong></h2>



<p class="wp-block-paragraph">React Native ermöglicht es Entwicklern, plattformübergreifende Apps mit <strong>JavaScript</strong> und <strong>React</strong> zu erstellen. Allerdings gestaltet sich das Styling in React Native oft als weniger intuitiv und kann schnell unübersichtlich werden, insbesondere wenn man zwischen verschiedenen Plattformen (iOS und Android) und verschiedenen Styling-Methoden wechselt.</p>



<p class="wp-block-paragraph">Mit <strong>NativeWind</strong> kannst du das gleiche <strong>Utility-First-Styling</strong> anwenden, das in der Webentwicklung so erfolgreich ist. Es eliminiert den Bedarf an komplizierten und umfangreichen Style-Objekten und ermöglicht es dir, das Styling direkt im JSX zu definieren – ähnlich wie bei der Verwendung von <strong>Tailwind CSS</strong> für Webanwendungen. Diese Flexibilität und Benutzerfreundlichkeit machen NativeWind zu einer ausgezeichneten Wahl für <strong>Expo React Native Apps</strong>.</p>



<h2 class="wp-block-heading"><strong>Vorteile von NativeWind</strong></h2>



<h3 class="wp-block-heading"><strong>1. Utility-First-Styling</strong></h3>



<p class="wp-block-paragraph">Der größte Vorteil von NativeWind ist der <strong>Utility-First-Ansatz</strong>, der direkt in den JSX-Komponenten zum Einsatz kommt. Anstatt separate Stylesheets zu erstellen oder Inline-Styles zu verwenden, kannst du die gleichen <strong>Tailwind-ähnlichen Klassen</strong> wie <code>bg-blue-500</code>, <code>text-white</code> oder <code>flex-1</code> direkt in deinem JSX-Code einfügen. Dies spart nicht nur Zeit, sondern macht deinen Code auch kürzer und übersichtlicher.</p>



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


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
import { View, Text } from &#039;react-native&#039;;

export default function App() {
  return (
    &lt;View className=&quot;flex-1 justify-center items-center bg-blue-500&quot;&gt;
      &lt;Text className=&quot;text-white text-lg font-bold&quot;&gt;Hello World&lt;/Text&gt;
    &lt;/View&gt;
  );
}
</pre></div>


<h3 class="wp-block-heading"><strong>2. Weniger Boilerplate-Code</strong></h3>



<p class="wp-block-paragraph">Traditionelles React Native-Styling kann manchmal viel Boilerplate-Code erfordern. Man muss häufig <strong>Style-Objekte</strong> erstellen und sie dann in den Komponenten anwenden. Mit NativeWind entfällt diese Notwendigkeit. Du kannst das Styling direkt im JSX definieren und so eine sehr klare, lesbare Struktur behalten.</p>



<h3 class="wp-block-heading"><strong>3. Bessere Lesbarkeit und Wartbarkeit</strong></h3>



<p class="wp-block-paragraph">Durch die Verwendung von <strong>Utility-Klassen</strong> wird der Code in NativeWind übersichtlicher. Statt komplexe Style-Objekte und lange CSS-Regeln zu schreiben, kannst du durch die einfache Kombination von Utility-Klassen dein Layout definieren. Dies macht den Code nicht nur leichter verständlich, sondern auch einfacher zu warten.</p>



<h3 class="wp-block-heading"><strong>4. Optimierung und Tree-Shaking</strong></h3>



<p class="wp-block-paragraph">Ein weiterer Vorteil von NativeWind ist die Möglichkeit der <strong>Tree-Shaking</strong>. Genau wie bei Web-Tailwind wird im Hintergrund überprüft, welche Klassen tatsächlich verwendet werden. Unbenutzte Klassen werden aus dem endgültigen Bundle entfernt, was deine App schlanker macht und die <strong>Performance</strong> optimiert.</p>



<h3 class="wp-block-heading"><strong>5. Nahtlose Integration in Expo</strong></h3>



<p class="wp-block-paragraph">Da <strong>Expo</strong> eine Sammlung von Tools und Services bietet, die den Entwicklungsprozess von React Native Apps vereinfachen, ist die Integration von NativeWind besonders vorteilhaft. Du kannst eine <strong>Expo-App</strong> schnell aufsetzen und dabei gleichzeitig von den Vorteilen des Utility-First-Ansatzes profitieren. NativeWind funktioniert nahtlos innerhalb des Expo-Ökosystems und sorgt für eine schnelle Entwicklung und einfache Wartung.</p>



<h2 class="wp-block-heading"><strong>Wie installierst du NativeWind in einem Expo-Projekt?</strong></h2>



<p class="wp-block-paragraph">Die Installation von NativeWind in einem Expo-Projekt ist einfach und schnell. Hier ist eine Schritt-für-Schritt-Anleitung:</p>



<h3 class="wp-block-heading"><strong>1. Expo-Projekt erstellen</strong></h3>



<p class="wp-block-paragraph">Falls du noch kein Expo-Projekt erstellt hast, kannst du ein neues Projekt mit folgendem Befehl erstellen:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
npx create-expo-app my-nativewind-app
cd my-nativewind-app
</pre></div>


<h3 class="wp-block-heading"><strong>2. NativeWind installieren</strong></h3>



<p class="wp-block-paragraph">Um NativeWind in deinem Expo-Projekt zu verwenden, installiere es mit folgendem Befehl:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
npm install nativewind
</pre></div>


<h3 class="wp-block-heading"><strong>3. Tailwind-Konfiguration einrichten</strong></h3>



<p class="wp-block-paragraph">Erstelle eine <code>tailwind.config.js</code>-Datei, um NativeWind zu konfigurieren:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
npx tailwindcss init
</pre></div>


<p class="wp-block-paragraph">Passe die Konfiguration so an, dass sie mit deiner App funktioniert:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
module.exports = {
  content: &#x5B;
    &#039;./App.js&#039;,  // Haupt-Dateipfad
    &#039;./src/**/*.{js,jsx,ts,tsx}&#039;  // Alle Verzeichnisse, die React Native-Komponenten enthalten
  ],
  theme: {
    extend: {},
  },
  plugins: &#x5B;],
}
</pre></div>


<h3 class="wp-block-heading"><strong>4. NativeWind in deiner App verwenden</strong></h3>



<p class="wp-block-paragraph">Jetzt kannst du NativeWind in deinem JSX verwenden, um deine App zu stylen. Hier ist ein einfaches Beispiel:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
import { View, Text } from &#039;react-native&#039;;

export default function App() {
  return (
    &lt;View className=&quot;flex-1 justify-center items-center bg-red-500&quot;&gt;
      &lt;Text className=&quot;text-white text-3xl font-bold&quot;&gt;Hello from NativeWind!&lt;/Text&gt;
    &lt;/View&gt;
  );
}
</pre></div>


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



<p class="wp-block-paragraph"><strong>NativeWind</strong> ist eine fantastische Möglichkeit, den beliebten <strong>Tailwind CSS</strong> Utility-First-Ansatz auf <strong>React Native</strong>-Apps anzuwenden. Es ermöglicht dir, dein Styling direkt im JSX zu definieren, wodurch dein Code kürzer, lesbarer und wartbarer wird. In Kombination mit <strong>Expo</strong> bietet NativeWind eine schnelle und effiziente Möglichkeit, mobile Apps zu entwickeln und zu stylen, ohne sich mit traditionellen Style-Objekten oder externen Stylesheets auseinandersetzen zu müssen.</p>



<p class="wp-block-paragraph">Wenn du bereits mit <strong>Tailwind CSS</strong> auf der Webplattform gearbeitet hast, wird dir NativeWind den Übergang zu <strong>React Native</strong> erheblich erleichtern. Es beschleunigt deinen Entwicklungsprozess und verbessert gleichzeitig die <strong>Performance</strong> deiner App.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/blog-nativewind-tailwind-fuer-expo-react-native-apps/">Blog | NativeWind: Tailwind für Expo React Native Apps</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
