<?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>Beiträge von Sander Hahn - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/author/it251511/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/author/it251511/</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:46:03 +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>Beiträge von Sander Hahn - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/author/it251511/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Your AI Text Now Has a Hidden Fingerprint</title>
		<link>https://mobile.fhstp.ac.at/allgemein/your-ai-text-now-has-a-hidden-fingerprint/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:46:03 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[watermark]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15969</guid>

					<description><![CDATA[<p>If you&#8217;ve used Claude recently, your text may carry a signature you cannot see. On August 14, 2026, Anthropic announced that Claude will watermark all the text its generating. But not only Anthropic is implementing watermaks: it&#8217;s one of about 190 companies that signed the EU&#8217;s Code of Practice on AI-generated content. Why now The <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/your-ai-text-now-has-a-hidden-fingerprint/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/your-ai-text-now-has-a-hidden-fingerprint/">Your AI Text Now Has a Hidden Fingerprint</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">If you&#8217;ve used Claude recently, your text may carry a signature you cannot see. On August 14, 2026, Anthropic announced that Claude will watermark all the text its generating. But not only Anthropic is implementing watermaks: it&#8217;s one of about 190 companies that signed the EU&#8217;s Code of Practice on AI-generated content.</p>



<h2 class="wp-block-heading">Why now</h2>



<p class="wp-block-paragraph">The main reason is of course regulation. <strong>Article 50 of the EU AI Act</strong> has applied since <strong>August 2, 2026</strong>. It requires AI providers to mark generated content in a machine-readable way, so it can be decteted more easily. This includes any company with EU users, not just European ones. Fines can reach €15M or 3% of global turnover. Similary, California&#8217;s SB 942 takes effect on the same date and requires hidden disclosures from providers with more than a million users in the state. Because two major markets have the same rule starting on the same day, AI providers now have to comply.</p>



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



<p class="wp-block-paragraph">A language model guesses one word at a time when writing and it often has more than one equally good options for the next word. After <em>&#8220;The weather today was cold and…&#8221;</em>, both &#8220;overcast&#8221; and &#8220;grey&#8221; fit. Normally a random number generator picks between them.</p>



<p class="wp-block-paragraph">Claude uses SynthID-Text, a method developed by Google DeepMind and it replaces that random pick with a rule based system that uses secret key and the words that came just before. With a small text it&#8217;s not as efficient but with over hundreds of words, though, it builds a statistical pattern that a detector with the key can measure.</p>



<p class="wp-block-paragraph">According to Anthropic:</p>



<ul class="wp-block-list">
<li><strong>Quality doesn&#8217;t change.</strong> The model only chooses among options it already rated as equally good and Google DeepMind&#8217;s testing found no significant difference in user ratings.</li>



<li><strong>Users pay nothing extra.</strong> The watermark adds no extra tokens.</li>



<li><strong>The watermark contains nothing about the user.</strong> It can&#8217;t be traced to a person, an organization or a chat.</li>
</ul>



<p class="wp-block-paragraph"><strong>Code</strong> gets very little watermarking, since there&#8217;s rarely a choice between equally good options. <strong>Images</strong> get <strong>C2PA</strong> metadata instead: a signed record that Claude was involved but a screenshot or re-save can strip it and Anthropic is also adding watermarks to older Claude models over the coming months.</p>



<h3 class="wp-block-heading">What it can&#8217;t do</h3>



<ul class="wp-block-list">
<li><strong>Short or factual text</strong> gives a weak signal, because there are few word choices to use the pattern.</li>



<li><strong>Editing weakens it.</strong> Copy paste keeps the watermark of couse but heavy editing weakens it and a full rewrite can even remove it.</li>



<li><strong>It can&#8217;t show authorship.</strong> It can&#8217;t tell whether Claude wrote a piece or only enhanced it.</li>



<li><strong>Common AI detectors can&#8217;t read it.</strong> GPTZero and Turnitin are still guessing from writing style. The real detection API is in private preview for regulators, researchers, media, schools and fact-checkers.</li>
</ul>



<h2 class="wp-block-heading">What to do about it</h2>



<p class="wp-block-paragraph">If you&#8217;re a freelancer or run a studio that uses AI in client work, stop treating AI use as something to hide. Write a clear disclosure policy that says when and how clients learn AI was involved and put it in your contracts. Now that AI involvement can be checked, being open about it costs you nothing and getting caught hiding it can cost a lot.</p>



<p class="wp-block-paragraph">Watermarks won&#8217;t end misinformation and a determined person can still get around them. But they change the default: most AI text will now carry a quiet signal of where it came from.</p>



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



<ul class="wp-block-list">
<li><a href="https://www.layer3labs.io/guides/ai-watermarking">https://www.layer3labs.io/guides/ai-watermarking</a></li>



<li><a href="https://www.anthropic.com/news/claude-text-watermark">https://www.anthropic.com/news/claude-text-watermark</a></li>
</ul>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/your-ai-text-now-has-a-hidden-fingerprint/">Your AI Text Now Has a Hidden Fingerprint</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Designing OnTime V2 with Claude Design</title>
		<link>https://mobile.fhstp.ac.at/allgemein/designing-ontime-v2-with-claude-design/</link>
		
		<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>
					
		
		
			</item>
		<item>
		<title>OnTime V2</title>
		<link>https://mobile.fhstp.ac.at/allgemein/ontime-v2/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:37:09 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[supabase]]></category>
		<category><![CDATA[Typescript]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15971</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" data-id="15988" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-1540x800.png" alt="" class="wp-image-15988" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/09/OnTimeV2-Projects-Light-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>
</figure>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/ontime-v2/">OnTime V2</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Wild Week &#8211; Wyld Interactive Media Player</title>
		<link>https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 07 May 2026 07:02:37 +0000</pubDate>
				<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15824</guid>

					<description><![CDATA[<p>For our Wild Week project, we created WIMP (Wyld Interactive Media Player). WIMP is an engine designed to handle branching, interactive video content similar to Netflix’s interactive specials. But WIMP can not only play videos, but also show other media like pictures, texts and audio in an interactive way. The goal Our goal was to <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">Wild Week &#8211; Wyld Interactive Media Player</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">For our Wild Week project, we created <strong>WIMP</strong> (Wyld Interactive Media Player). WIMP is an engine designed to handle branching, interactive video content similar to Netflix’s interactive specials. But WIMP can not only play videos, but also show other media like pictures, texts and audio in an interactive way. </p>



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



<p class="wp-block-paragraph">Our goal was to create a prototype that plays media that isn&#8217;t just linear. We wanted a way to inject logic, like quizzes, info overlays, and decision points, directly into the media timeline. It doesn&#8217;t matter if it&#8217;s a certain position on a text or a specific time in a video.</p>



<p class="wp-block-paragraph">To make this work across different platforms, we first had to define a standardized data structure. This led to the development of the <strong>WIMP format</strong>.</p>



<p class="wp-block-paragraph">Another important part of this project is a media player that is highly mobile optimized and easy to understand, so that even a five year old can experience a WIMP interactive medium.</p>



<p class="wp-block-paragraph">The project is split into two distinct layers: the data standard and the playback engine.</p>



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



<h3 class="wp-block-heading">1. The Format</h3>



<p class="wp-block-paragraph">Before building the player, we needed a predictable way to describe the media content. For this, we had to design a format that incooperates everything a WIMP user needs and will need in the future. This forward thinking and upgradeability of our format was one of the main challenges that we faced during this Wild Week. We ended up with an open-format JSON schema that defines a graph of &#8220;media nodes.&#8221; Each node can contain:</p>



<ul class="wp-block-list">
<li><strong>Timed Events:</strong> Quizzes, info texts, external links and more that can be triggered at specific timestamps.</li>



<li><strong>Choice Events:</strong> Branching points that tell the player which media node to load next.</li>
</ul>



<p class="wp-block-paragraph">By publishing this as an NPM package, we integrated a validator directly into the workflow, ensuring that any content loaded by the player is structurally sound and free of dead ends.</p>



<p class="wp-block-paragraph">Here&#8217;s an example format:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
{
    &quot;version_number&quot;: &quot;0.0.1&quot;,
    &quot;format_type&quot;: &quot;wimp&quot;,
    &quot;meta_data&quot;: {
        &quot;id&quot;: &quot;7f6b6d2d-8fb7-4bd4-9f2a-5a1e2d7c6b42&quot;,
        &quot;created_at&quot;: &quot;2026-04-23T00:00:00+02:00&quot;,
        &quot;updated_at&quot;: &quot;2026-04-23T00:00:00+02:00&quot;,
        &quot;author&quot;: &quot;Melanie Maier&quot;,
        &quot;title&quot;: &quot;What If Dinosaurs Still Lived Today?&quot;,
        &quot;start_media_id&quot;: &quot;dinosaur_intro_text&quot;,
        &quot;description&quot;: &quot;An interactive documentary exploring the hypothetical scenario of dinosaurs still existing in the modern world.&quot;,
        &quot;tags&quot;: &#x5B;
            &quot;dinosaurs&quot;,
            &quot;interactive documentary&quot;,
            &quot;hypothetical scenario&quot;,
            &quot;modern world&quot;
        ]
    },
    &quot;media&quot;: &#x5B;{
            &quot;id&quot;: &quot;dinosaur_intro_text&quot;,
            &quot;title&quot;: &quot;Introduction&quot;,
            &quot;type&quot;: &quot;text&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaurs_intro.html&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                &quot;type&quot;: &quot;choice&quot;,
                &quot;title&quot;: &quot;Do you want hear about dinosaurs?&quot;,
                &quot;position&quot;: {
                    &quot;type&quot;: &quot;seconds&quot;,
                    &quot;value&quot;: 0
                },
                &quot;event_context&quot;: {
                    &quot;choices&quot;: &#x5B;{
                        &quot;label&quot;: &quot;Start the journey&quot;,
                        &quot;next_media&quot;: &quot;dinosaur_audio1&quot;
                    }]
                }
            }]
        },
        {
            &quot;id&quot;: &quot;dinosaur_audio1&quot;,
            &quot;title&quot;: &quot;Audio 1&quot;,
            &quot;type&quot;: &quot;audio&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaur_1.mp3&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;What would be the most likely immediate response from modern states once the existence of large living dinosaurs was confirmed?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 5
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Opening all affected regions to tourism&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Establishing exclusion zones and interdisciplinary crisis task forces&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Immediately classifying all species as domesticated animals&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Suspending all ongoing scientific research&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Why would the discovery of living dinosaurs be more than just a zoological sensation?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 30
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Because it would automatically replace all existing animal species&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Because modern cities are already designed for giant reptiles &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }, {
                                &quot;label&quot;: &quot;Because it would challenge long-held assumptions about ecology, history, and risk planning&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;Still too high. Fast fashion is often discarded quickly.&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Because dinosaurs could only survive in artificial reserves &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;choice&quot;,
                    &quot;title&quot;: &quot;Do you want to hear more about this scenario?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 60
                    },
                    &quot;event_context&quot;: {
                        &quot;choices&quot;: &#x5B;{
                            &quot;label&quot;: &quot;Yes please&quot;,
                            &quot;next_media&quot;: &quot;dinosaur_audio2&quot;
                        }]
                    }
                }
            ],
            &quot;description&quot;: &quot;Quick cuts of clothing store racks, online shopping scrolls, and factory workers sewing.&quot;,
            &quot;media_length&quot;: 76
        },
        {
            &quot;id&quot;: &quot;dinosaur_audio2&quot;,
            &quot;title&quot;: &quot;Dinosaur 2&quot;,
            &quot;type&quot;: &quot;audio&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaur_2.wav&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Which dinosaur group would likely be the hardest to control in a modern civilization?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 5
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Small to medium-sized, intelligent, highly adaptable predators&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Very large, slow-moving herbivores&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Flightless species living only in remote areas&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Species with strongly territorial but fixed-range behavior&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Which societal conflict would be most likely if humans and dinosaurs had to coexist permanently?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 35
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Whether dinosaurs should be included in school curricula &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;The complete abolition of modern infrastructure&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;A global abandonment of agriculture&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;A conflict between species protection, public safety, and economic use of land&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;choice&quot;,
                    &quot;title&quot;: &quot;Do you want to read more?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 55
                    },
                    &quot;event_context&quot;: {
                        &quot;choices&quot;: &#x5B;{
                            &quot;label&quot;: &quot;Yes please&quot;,
                            &quot;next_media&quot;: &quot;dinosaur_end_text&quot;
                        }]
                    }
                }
            ],
            &quot;description&quot;: &quot;Dinosaur audio&quot;,
            &quot;media_length&quot;: 59
        },
        {
            &quot;id&quot;: &quot;dinosaur_end_text&quot;,
            &quot;title&quot;: &quot;End&quot;,
            &quot;type&quot;: &quot;text&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaurs_end.html&quot;,
            &quot;timeline_events&quot;: &#x5B;]
        }
    ]
}
</pre></div>


<h3 class="wp-block-heading">2. The Frontend: Nuxt &amp; Logic</h3>



<p class="wp-block-paragraph">The player itself is built with <strong>Nuxt</strong>. We chose Nuxt because its reactive framework is ideal for syncing a video’s progress with dynamic UI overlays.</p>



<p class="wp-block-paragraph">For this we split our team into 2 departments: </p>



<ul class="wp-block-list">
<li>The UI/UX of the main page and components</li>



<li>The player with the state machine</li>
</ul>



<h4 class="wp-block-heading">Main Page &amp; Components UI/UX</h4>



<p class="wp-block-paragraph">For prototyping and designing our pages and components, we decided on using Figma with Nuxt&#8217;s components to help us out. Here are some examples of our pages and components:</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-large"><img decoding="async" data-id="15826" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Dahsboard-402x800.png" alt="" class="wp-image-15826"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15840" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Video-1-402x800.png" alt="" class="wp-image-15840"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15836" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Audio-1-402x800.png" alt="" class="wp-image-15836"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15835" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Text-1-402x800.png" alt="" class="wp-image-15835"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15834" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description3-1-402x800.png" alt="" class="wp-image-15834"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15838" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description1-1-402x800.png" alt="" class="wp-image-15838"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15839" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description-1-402x800.png" alt="" class="wp-image-15839"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="15837" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description2-1-402x800.png" alt="" class="wp-image-15837"/></figure>
</figure>



<h4 class="wp-block-heading">State Machine</h4>



<p class="wp-block-paragraph">To manage the complexity of interactive playback, we implemented a <strong>state machine</strong>. The state machine coordinates:</p>



<ul class="wp-block-list">
<li><strong>Syncing Logic:</strong> Monitoring the video’s <code>currentTime</code> to trigger overlays from the WIMP format.</li>



<li><strong>Interaction States:</strong> When a <code>pause: true</code> event occurs, the machine pauses the background media, putting the quiz or choice interface in the foreground.</li>



<li><strong>Dynamic Media Handling:</strong> When a user makes a choice, the machine resolves the <code>next_media</code> ID and updates the Nuxt state to swap the media and move forward in the decission tree.</li>
</ul>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">Wild Week &#8211; Wyld Interactive Media Player</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Language Learning App</title>
		<link>https://mobile.fhstp.ac.at/allgemein/language-learning-app/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Tue, 24 Feb 2026 08:57:56 +0000</pubDate>
				<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15474</guid>

					<description><![CDATA[<p>As my second project for the first semester, I set out to learn more about app development with Kotlin. For this, I used Android Studio to create a language-learning app with a small twist: instead of entering the word you want to learn in your own language, you enter the foreign word. The backend then <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/language-learning-app/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/language-learning-app/">Language Learning App</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">As my second project for the first semester, I set out to learn more about app development with Kotlin. For this, I used Android Studio to create a language-learning app with a small twist: instead of entering the word you want to learn in your own language, you enter the foreign word. The backend then automatically translates the word into your language. The idea behind this is that writing the new word yourself helps memorize it, while also saving a little time by translating it automatically.</p>



<h2 class="wp-block-heading">Tools and Technologies</h2>



<p class="wp-block-paragraph">To achieve this, I used the most recent version of Android Studio in combination with:</p>



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



<p class="wp-block-paragraph">When developing apps in Android Studio, the recommended framework is Android’s Jetpack Compose. It is a modern toolkit for building native UIs and simplifies and accelerates UI development on Android.</p>



<h3 class="wp-block-heading">Backend / Database: Jetpack Room</h3>



<p class="wp-block-paragraph">Jetpack Room is a persistence library introduced as part of the Android Jetpack suite to simplify working with SQLite databases. It provides an abstraction layer over SQLite, allowing more robust database access while still enabling the full power of SQLite.</p>



<h3 class="wp-block-heading">Translation: ML Kit</h3>



<p class="wp-block-paragraph">With Android Studio’s ML Kit Translation API, users can translate text in over 50 different languages without the need for an internet connection, and it is completely free to use for development.</p>



<h2 class="wp-block-heading">Project Scope</h2>



<p class="wp-block-paragraph">My goal is to develop an intuitive app that lets users learn new words in different languages.</p>



<p class="wp-block-paragraph">The app should contain:</p>



<ul class="wp-block-list">
<li>Start Page
<ul class="wp-block-list">
<li>Before users can begin learning, they need to set a name and their nationality so ML Kit knows which language to translate into.</li>
</ul>
</li>



<li>Overview of folders and cards
<ul class="wp-block-list">
<li>Users can create multiple folders with different language settings and visuals. In these folders, they can see their added cards.</li>
</ul>
</li>



<li>Add folders
<ul class="wp-block-list">
<li>Adding folders should be easy, and folders should also be easily distinguishable. To achieve this, users can set a name (e.g., German vocabulary), a color, the foreign language (e.g., German), and change the local language if needed (default is the user’s nationality).</li>
</ul>
</li>



<li>Add cards
<ul class="wp-block-list">
<li>Adding cards is the most important feature of this app. Users add a new word and have two optional fields for example sentences and tags.</li>
</ul>
</li>



<li>Automatic translation
<ul class="wp-block-list">
<li>For ease of use (and to experiment with Android’s APIs), the new word is automatically translated into the user’s language.</li>
</ul>
</li>



<li>Quiz mode
<ul class="wp-block-list">
<li>With quiz mode, users can test their skills using three different modes: Random, Bookmarked, and Recall (a list of incorrectly answered cards).</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Beyond the Initial Scope</h2>



<p class="wp-block-paragraph">Additionally, I implemented several features that further improve the app’s functionality:</p>



<ul class="wp-block-list">
<li>User edit page: Allows users to edit their name, nationality, and app theme.</li>



<li>Light and dark mode: Added for additional customization.</li>
</ul>



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



<p class="wp-block-paragraph">Overall, the implementation of this project during my first semester was very successful and involved learning many new technologies. Both frontend and backend are fully implemented and can be further extended in the upcoming semesters.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/language-learning-app/">Language Learning App</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>State of the Art of AI-Enhanced SLAM</title>
		<link>https://mobile.fhstp.ac.at/allgemein/state-of-the-art-of-ai-enhanced-slam/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Wed, 21 Jan 2026 18:01:37 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[ORB-SLAM]]></category>
		<category><![CDATA[SIFT]]></category>
		<category><![CDATA[Simultaneous Localization And Mapping]]></category>
		<category><![CDATA[slam]]></category>
		<category><![CDATA[VSLAM]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15297</guid>

					<description><![CDATA[<p>Abstract This paper discusses recent developments in Simultaneous Localization and Mapping (SLAM) combined with the use of Artificial Intelligence (AI). SLAM makes it possible for robots to build maps of unknown environments while tracking their position, but with traditional methods robots often struggle in dynamic or unstructured settings due to unclear or moving objects. Recent <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/state-of-the-art-of-ai-enhanced-slam/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/state-of-the-art-of-ai-enhanced-slam/">State of the Art of AI-Enhanced SLAM</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Abstract</h2>



<p class="has-text-align-left wp-block-paragraph">This paper discusses recent developments in Simultaneous Localization and Mapping (SLAM) combined with the use of Artificial Intelligence (AI). SLAM makes it possible for robots to build maps of unknown environments while tracking their position, but with traditional methods robots often struggle in dynamic or unstructured settings due to unclear or moving objects. Recent advances in AI and its integration into SLAM address these issues by improving feature extraction, predictive modeling, and adaptability. Convolutional and Graph Convolutional Networks enhance robustness and scalability, while transformer architectures enable efficient trajectory planning. Obstacle detection and avoidance in real-world scenarios are further reinforced by deep reinforcement learning. AI-driven innovations also introduce multi-modal sensor fusion, semantic mapping, enhanced loop closure detection, and collaborative multi-agent frameworks. Comparative studies reveal that AI-enhanced SLAM shows a higher accuracy and robustness across varied scenarios.</p>



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



<div data-wp-interactive="core/file" class="wp-block-file"><object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://mobile.fhstp.ac.at/wp-content/uploads/2026/01/State-of-the-Art-of-AI-Enhanced-SLAM.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of State of the Art of AI-Enhanced SLAM."></object><a id="wp-block-file--media-a94bbd24-f9c3-4c5e-af6a-968726c47153" href="https://mobile.fhstp.ac.at/wp-content/uploads/2026/01/State-of-the-Art-of-AI-Enhanced-SLAM.pdf">State of the Art of AI-Enhanced SLAM</a><a href="https://mobile.fhstp.ac.at/wp-content/uploads/2026/01/State-of-the-Art-of-AI-Enhanced-SLAM.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-a94bbd24-f9c3-4c5e-af6a-968726c47153">Download</a></div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/state-of-the-art-of-ai-enhanced-slam/">State of the Art of AI-Enhanced SLAM</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What is Supabase and when to use it</title>
		<link>https://mobile.fhstp.ac.at/allgemein/what-is-supabase-and-when-to-use-it/</link>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Wed, 21 Jan 2026 12:02:10 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[compare]]></category>
		<category><![CDATA[comparison]]></category>
		<category><![CDATA[firebase]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[supabase]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15295</guid>

					<description><![CDATA[<p>When you start your Fullstack application, the planning can be difficult. What Programming Language should I use? What Framework should I use? Should I write my own backend? Choosing the right backend is very difficult and can decide everything from your development speed to how much control you have over your data. Firebase has been <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/what-is-supabase-and-when-to-use-it/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/what-is-supabase-and-when-to-use-it/">What is Supabase and when to use it</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 you start your Fullstack application, the planning can be difficult. What Programming Language should I use? What Framework should I use? Should I write my own backend? Choosing the right backend is very difficult and can decide everything from your development speed to how much control you have over your data. Firebase has been a first option for developers who want to have a fast backend with minimal setup for years, but more recently, Supabase has been growing in popularity, making an open-source Postgres database a compelling alternative.</p>



<p class="wp-block-paragraph">Both platforms promise fast and easy development, built-in authentication, real-time data, and scalable infrastructure. But can they deliver on these promises and when should I use what? Both are valid choices for your next project but they have their differences in some fundamental ways: data modeling, query flexibility, pricing transparency, and how much you can customize as your app grows. Those differences matter, especially once you move beyond a prototype. But first: what is Supabase actually and what can it do?</p>



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



<p class="wp-block-paragraph">Supabase is a serverless, open-source backend platform that is designed to help developers build scalable, high-performance applications with minimal setup. It’s built on top of PostgreSQL, it provides a fully managed, production-ready database along with essential backend features such as authentication, storage, and real-time data without relying on other services. This means that you don’t need to configure or maintain a custom backend server, allowing you to move faster and focus on product development.</p>



<p class="wp-block-paragraph">As a serverless solution, Supabase handles infrastructure concerns like provisioning, scaling, and security automatically. It also allows the user to get direct access to a powerful SQL database that uses PostgreSQL for structured data modeling, complex queries, joins, and transactions.</p>



<p class="wp-block-paragraph">With Supabase, you get a managed backend with features like:</p>



<ul class="wp-block-list">
<li>SQL database: PostgreSQL with support for advanced queries, joins, and JSON data.</li>



<li>Authentication: Secure, built-in user management.</li>



<li>Realtime updates: Live data synchronization using WebSockets.</li>



<li>Storage: Easy-to-use storage for files and media.</li>



<li>Edge functions: Custom serverless functions for handling app logic.</li>
</ul>



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



<p class="wp-block-paragraph">Similar to Supabase, Firebase is a backend-as-a-service solution offered by Google, which assists developers in the development of applications without the need for them to handle the infrastructure on their own. Firebase also offers a set of features such as authentication, real-time databases, cloud functions, file storage, and analytics. This solution is designed with the objective of providing ease of use and rapid development.</p>



<p class="wp-block-paragraph">At the heart of the Firebase platform are the NoSQL databases, namely the Realtime Database and the Cloud Firestore, which organize and store the data in the form of documents and collections, unlike traditional relational databases in the form of tables. Although the NoSQL databases provide a degree of flexibility and ease of development, especially when real-time updates and data access patterns are concerned, handling complex relationships and queries in a scaled-up application might be a challenge.</p>



<p class="wp-block-paragraph">Supabase takes a different approach to backend development. Like mentioned above, it’s an open-source, serverless framework that centers around PostgreSQL. Supabase offers its features with just one Postgres database.</p>



<h2 class="wp-block-heading">Supabase vs Firebase</h2>



<h3 class="wp-block-heading">Data model</h3>



<p class="wp-block-paragraph">Firebase supports a NoSQL, document-oriented data structure well-suited for hierarchical or event-oriented data. Supabase supports relational SQL, which provides support for schemas, joins, transactions, and consistency.</p>



<h3 class="wp-block-heading">Querying and logic</h3>



<p class="wp-block-paragraph">It allows complex queries and business logic to be implemented directly in the database through SQL, constraints, and triggers. Firebase uses more client-side logic and Cloud Functions for complex operations.</p>



<h3 class="wp-block-heading">Scalability &amp; Control</h3>



<p class="wp-block-paragraph">Whereas Firebase abstracts infrastructure almost completely, which is easy to set up but makes it difficult to customize, Supabase provides more visibility and flexibility, which includes direct database access and the ability to host it on your own infrastructure.</p>



<h3 class="wp-block-heading">Vendor lock-in</h3>



<p class="wp-block-paragraph">Firebase is highly integrated with Google Cloud. Supabase values portability and focuses on using open standards and tools that make it easy to migrate in and out.</p>



<h3 class="wp-block-heading">Use Cases</h3>



<p class="wp-block-paragraph">Supabase is well suited for:</p>



<ul class="wp-block-list">
<li>SaaS platforms with relational data and role-based access control</li>



<li>Data-intensive applications such as analytics dashboards and internal tools</li>



<li>Projects that require complex queries, transactions, or strong data integrity</li>



<li>Teams that value open source, portability, and long-term flexibility<br></li>
</ul>



<p class="wp-block-paragraph">Firebase is well suited for:</p>



<ul class="wp-block-list">
<li>MVPs and prototypes that need to ship quickly</li>



<li>Real-time applications like chat, presence, or collaborative tools</li>



<li>Frontend-heavy apps with simple data relationships</li>



<li>Teams already invested in the Google Cloud ecosystem<br></li>
</ul>



<h2 class="wp-block-heading">Choosing Between Supabase and Firebase</h2>



<p class="wp-block-paragraph">The choice between Supabase and Firebase ultimately depends on how your application handles data and how much control you want over your backend. Firebase is very good at simplicity and speed, while Supabase shines when structure, scalability, and flexibility become more important over time.</p>



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



<p class="wp-block-paragraph">Choosing a backend platform is one of the most important decisions you’ll make when starting you fullstack application. It decides not only how fast you&#8217;ll progress and deliver your first version, but also how well your application can scale and how complex your data model can become.</p>



<p class="wp-block-paragraph">Firebase and Supabase are both good options to choose from and remove a lot of the traditional backend complexity. Firebase is good for rapid development, especially for real-time, frontend-driven applications. Supabase, on the other hand, offers a more structured and transparent approach, built around the concept of open-source and PostgreSQL, making it a strong choice for applications that need simple data models and long-term flexibility.</p>



<p class="wp-block-paragraph">As always, there is no universally &#8220;better&#8221; option&#8230; Only the better fit for your project. If you need to move fast with minimal setup and simple data relationships, Firebase is a solid choice. If your application relies on relational data, complex queries, and future-proof architecture, Supabase provides a powerful and scalable foundation.</p>



<p class="wp-block-paragraph">Ultimately, the best backend is the one that aligns with your application’s needs today while still supporting where you want it to go tomorrow.</p>



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



<ol class="wp-block-list">
<li><a href="https://bejamas.com/hub/serverless-database/supabase">https://bejamas.com/hub/serverless-database/supabase</a></li>



<li><a href="https://somindadhaniya.medium.com/what-is-supabase-the-open-source-firebase-alternative-developers-love-ef63f15e0e48">https://somindadhaniya.medium.com/what-is-supabase-the-open-source-firebase-alternative-developers-love-ef63f15e0e48</a></li>



<li><a href="https://www.newline.co/@zaoyang/what-is-supabase-and-how-it-can-replace-your-entire-backend--62b84205">https://www.newline.co/@zaoyang/what-is-supabase-and-how-it-can-replace-your-entire-backend&#8211;62b84205</a></li>



<li><a href="https://supabase.com/">https://supabase.com/</a></li>



<li><a href="https://supabase.com/docs/guides/getting-started/architecture">https://supabase.com/docs/guides/getting-started/architecture</a></li>



<li><a href="https://www.postgresql.org/about/">https://www.postgresql.org/about/</a></li>



<li><a href="https://firebase.google.com/">https://firebase.google.com/</a></li>



<li><a href="https://medium.com/firebase-developers/what-is-firebase-the-complete-story-abridged-bcc730c5f2c0">https://medium.com/firebase-developers/what-is-firebase-the-complete-story-abridged-bcc730c5f2c0</a></li>
</ol>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/what-is-supabase-and-when-to-use-it/">What is Supabase and when to use it</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
