<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=Nextcloud_App_Development_Workshop_260825</id>
	<title>Nextcloud App Development Workshop 260825 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=Nextcloud_App_Development_Workshop_260825"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Nextcloud_App_Development_Workshop_260825&amp;action=history"/>
	<updated>2026-10-03T08:03:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=Nextcloud_App_Development_Workshop_260825&amp;diff=281&amp;oldid=prev</id>
		<title>Justinaquino: Create: Nextcloud app dev beginner workshop 260825 (video BQlm71K1AVM)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=Nextcloud_App_Development_Workshop_260825&amp;diff=281&amp;oldid=prev"/>
		<updated>2026-08-28T15:41:38Z</updated>

		<summary type="html">&lt;p&gt;Create: Nextcloud app dev beginner workshop 260825 (video BQlm71K1AVM)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[https://youtu.be/BQlm71K1AVM &amp;#039;&amp;#039;&amp;#039;Building your first Nextcloud app (beginner workshop)&amp;#039;&amp;#039;&amp;#039; — watch on YouTube] (Nextcloud channel, 2026-08-25, 56 min)&lt;br /&gt;
&lt;br /&gt;
Presented by Anna Larch (Nextcloud Developer Relations, ex-Talk developer; security team), with Marcel Müller answering chat. Foundations of Nextcloud app development: where your code sits, what it may call, and how it talks to the rest of the server. Every example comes from a real app — Nextcloud Talk, Dashboard, Theming, and Files reminders.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Public vs private API&amp;#039;&amp;#039;&amp;#039; — build against &amp;lt;code&amp;gt;OCP\&amp;lt;/code&amp;gt; (stable, documented); &amp;lt;code&amp;gt;OC\&amp;lt;/code&amp;gt; is internal/legacy and can be removed between versions. Breaking changes to public APIs are announced ~5 major versions ahead. If it isn&amp;#039;t in the developer manual, assume it can change.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Request lifecycle&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;index.php → routes → controller → service → mapper/DB → response&amp;lt;/code&amp;gt;. Auth, CSRF, and rate limiting run before the controller; brute-force throttling runs inside it. Controllers translate HTTP; business logic belongs in services.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Dependency injection&amp;#039;&amp;#039;&amp;#039; — type-hint interfaces (&amp;lt;code&amp;gt;private IStorage $storage&amp;lt;/code&amp;gt;); the container resolves what the instance actually uses. The &amp;lt;code&amp;gt;?string $userId&amp;lt;/code&amp;gt; pattern is a nullable, immutable, cheap-to-filter user identifier resolved from the login.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Entities &amp;amp; type casting&amp;#039;&amp;#039;&amp;#039; — cast entity fields explicitly (bool, DateTime) because MariaDB/MySQL/Oracle/PostgreSQL disagree on tinyint/boolean and datetime handling.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Migrations&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;preSchemaChange&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;changeSchema&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;postSchemaChange&amp;lt;/code&amp;gt;. Heavy data work goes into a one-time background job, never inline in an upgrade (her example: a 6–7 hour system-address-book update).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Indices&amp;#039;&amp;#039;&amp;#039; — add at table creation when possible; for existing large tables register a missing-index listener so the admin applies it via &amp;lt;code&amp;gt;occ&amp;lt;/code&amp;gt; in a maintenance window. Debug slow queries with &amp;lt;code&amp;gt;EXPLAIN&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Event system&amp;#039;&amp;#039;&amp;#039; — apps integrate by listening to core events (file created/modified/deleted, node updated), never by calling another app&amp;#039;s code. Files reminders has no dependency on the Files app.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Background jobs&amp;#039;&amp;#039;&amp;#039; — extend &amp;lt;code&amp;gt;TimedJob&amp;lt;/code&amp;gt;; cron flavors are cron / webcron / ajax (ajax gives no time guarantee). Use the maintenance window with time-insensitive jobs for heavy syncs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Scale traps&amp;#039;&amp;#039;&amp;#039; — use folder search with limit/offset instead of full tree loads; chunk &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; queries to 1,000 items (Oracle&amp;#039;s limit); avoid N+1 queries; test on current + previous majors; profile with Blackfire.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;App store&amp;#039;&amp;#039;&amp;#039; — validate info.xml, sign last, tarball = one top-level folder named the app ID, certificate request takes 2–4 days. Common rejections: CN/app-ID mismatch, bad archive structure, files changed after signing, invalid category.&lt;br /&gt;
&lt;br /&gt;
== Key takeaways ==&lt;br /&gt;
# Use only &amp;lt;code&amp;gt;OCP\&amp;lt;/code&amp;gt;; anything not in the developer manual can change.&lt;br /&gt;
# Controllers translate HTTP; services do the work; entities/mappers own the data — with type casting.&lt;br /&gt;
# Heavy work (migrations, tree walks, per-user loops) belongs in background jobs.&lt;br /&gt;
# Integrate via events, never by calling another app&amp;#039;s code.&lt;br /&gt;
# Chunk &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; queries to 1,000 for Oracle; test against the previous major too.&lt;br /&gt;
# Sign last; the tarball must contain exactly one top-level folder named the app ID.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
* Video: https://youtu.be/BQlm71K1AVM&lt;br /&gt;
* Nextcloud developer program and resources: https://nextcloud.com/developer/&lt;br /&gt;
* Developer documentation: https://docs.nextcloud.com&lt;br /&gt;
* Local transcript + study notes: &amp;lt;code&amp;gt;work/comfac-nextcloud/Audio Video/&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;BQlm71K1AVM-structured.md&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BQlm71K1AVM-questions-details-needed.md&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justinaquino</name></author>
	</entry>
</feed>