<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://agora.nasqueron.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ieli</id>
	<title>Nasqueron Agora - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://agora.nasqueron.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ieli"/>
	<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/Special:Contributions/Ieli"/>
	<updated>2026-05-02T13:03:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0-alpha</generator>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/User_stories&amp;diff=2336</id>
		<title>ServPulse/User stories</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/User_stories&amp;diff=2336"/>
		<updated>2026-02-17T15:45:47Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;User stories&#039;&#039;&#039; allow us to define site features.&lt;br /&gt;
&lt;br /&gt;
== Persona ==&lt;br /&gt;
&lt;br /&gt;
Created during 2023-06-02 meeting with Eli, DorianWinty, Dereckson and Fauve.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ServPulse user stories - Persona - Nasqueron member.png|Persona 1 - Nasqueron member&lt;br /&gt;
File:ServPulse user stories - Persona - Nasqueron ops.png|Persona 2 - Nasqueron ops&lt;br /&gt;
File:ServPulse user stories - Persona - Visitor.png|Persona 3 - Visitor&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User stories ==&lt;br /&gt;
&lt;br /&gt;
=== Katherina, the student (Nasqueron member) ===&lt;br /&gt;
&lt;br /&gt;
Katherina is interested in open source and free culture. She has a background in computing but is more into development than operations. She uses Ubuntu but isn&#039;t comfortable with the terminal. She wants to use Nasqueron services without worrying about infrastructure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pain points: &amp;quot;Why DevCentral doesn&#039;t answer?&amp;quot;, &amp;quot;I&#039;d like to connect to IRC but Eglide doesn&#039;t ping&amp;quot;, &amp;quot;Sometimes it&#039;s complicated to know what services we have or on what servers.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* As a member, I want to see at a glance if all services are fine or if something is broken, so I don&#039;t have to guess why a service isn&#039;t responding.&lt;br /&gt;
* As a member, I want to see which specific service is affected and what its current status is, so I know whether the problem is with DevCentral, IRC, or something else.&lt;br /&gt;
* As a member, I want to see what is being done about an ongoing incident, so I know the team is aware and working on it.&lt;br /&gt;
* As a member, I want to subscribe to email notifications, so I&#039;m informed of incidents without having to check the page.&lt;br /&gt;
* As a member, I want to see services organized by group, so I can find the service I care about without knowing the infrastructure details.&lt;br /&gt;
* As a member, I want to see past incidents and how they were resolved, so I can understand what happened while I was away.&lt;br /&gt;
* As a member, I want the page to update automatically, so I don&#039;t have to keep refreshing during an incident.&lt;br /&gt;
&lt;br /&gt;
=== Gourou, the tech-savvy (Nasqueron ops) ===&lt;br /&gt;
&lt;br /&gt;
Gourou knows the Nasqueron infrastructure well. He prefers command-line tools and simple UIs over complex interfaces. He could use either a GUI or a TUI. He wants to manage services easily and detect intermittent downtime.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pain points: &amp;quot;Does all my infrastructure is going well?&amp;quot;, &amp;quot;Do we have some intermittent down time?&amp;quot;, &amp;quot;Does it&#039;s easy to use?&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* As an ops member, I want to manage services (create, edit, delete) from an admin dashboard, so I don&#039;t need direct database access.&lt;br /&gt;
* As an ops member, I want to create incidents and update their status through a lifecycle (investigating → identified → monitoring → resolved), so I can communicate the resolution process.&lt;br /&gt;
* As an ops member, I want to schedule maintenance windows, so visitors are informed in advance.&lt;br /&gt;
* As an ops member, I want monitoring tools to automatically update service status via a webhook, so the page reflects reality without manual action.&lt;br /&gt;
* As an ops member, I want to see historical uptime statistics per service, so I can detect intermittent downtime patterns.&lt;br /&gt;
* As an ops member, I want health checks to run automatically against service URLs, so statuses stay current without manual updates.&lt;br /&gt;
* As an ops member, I want health checks to distinguish between degraded performance and full outage, so the status page is more accurate.&lt;br /&gt;
* As an ops member, I want to generate an admin token via CLI, so I can access the dashboard without a user/password system.&lt;br /&gt;
* As an ops member, I want to link incidents and maintenance to affected services, so visitors see which services are impacted.&lt;br /&gt;
* As an ops member, I want to customize the page title, navigation links, and footer, so the status page matches our branding.&lt;br /&gt;
* As an ops member, I want to deploy the entire application with a single command, so setup is fast and repeatable.&lt;br /&gt;
&lt;br /&gt;
=== Mykel, the artist and writer (Visitor) ===&lt;br /&gt;
&lt;br /&gt;
Mykel identifies as they, is in their 30s, and uses Nasqueron services casually — clicking links, reading wikis, browsing. They are UI-oriented and put off by complexity, too much text, or too much theory. They interact with Nasqueron services randomly and without commitment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pain points: &amp;quot;I&#039;ve just clicked on a link, got an error who told me to check status&amp;quot;, &amp;quot;Complexity?&amp;quot;, &amp;quot;Too much text.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* As a visitor, I want to see an overall status banner immediately, so I know in one second if systems are healthy or not.&lt;br /&gt;
* As a visitor, I want the page to be simple and visual (not walls of text), so I can understand the situation at a glance.&lt;br /&gt;
* As a visitor, I want to see which specific service is down, so I know if the one I care about is affected.&lt;br /&gt;
* As a visitor, I want to subscribe to notifications, so I know when the service I use is back without checking repeatedly.&lt;br /&gt;
* As a visitor, I want a clear page when I land on a broken link, so I&#039;m not confused by a blank screen.&lt;br /&gt;
* As a visitor, I want the page to work well on mobile, so I can check status from my phone.&lt;br /&gt;
* As a visitor, I want dark mode support, so the page is comfortable to read at night.&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2335</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2335"/>
		<updated>2026-02-17T15:37:45Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;Configuration&lt;br /&gt;
:Application-level settings stored in config/app.json and served via the config API.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; navbar.title, navbar.buttons_left (array of {name, link}), footer.line1 (text with %link1%/%link2% placeholders, labels, URLs), footer.line2 (text with %link% placeholder, label, URL).&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/config/getAll (public), PUT /api/config (admin)&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metric&lt;br /&gt;
:Performance data recorded per service, either by the health check service (automatic) or via the API (manual).&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; service_id, uptime (decimal 0-100), response_time (integer, ms), error_rate (decimal 0-100), recorded_at.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; metric (indexed on service_id + recorded_at)&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/metrics (latest per service), GET /api/metrics/service/:id?days=30 (raw), GET /api/metrics/service/:id/daily?days=30 (aggregated)&lt;br /&gt;
&lt;br /&gt;
;Incident&lt;br /&gt;
:An outage, disruption, or degradation reported on the status page. Incidents follow a lifecycle and can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, status (investigating, identified, monitoring, resolved), impact (none, minor, major, critical), start_date, update_date, end_date.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident, incident_update, incident_service&lt;br /&gt;
&lt;br /&gt;
;Incident Update&lt;br /&gt;
:A timestamped status change within an incident, forming the incident timeline.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; incident_id, status, message.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; incident_update&lt;br /&gt;
&lt;br /&gt;
;Authentication&lt;br /&gt;
:Admin access is controlled by JWT tokens signed with JWT_SECRET. There is no user table, no user accounts, and no permissions system. A single admin role exists. Tokens are generated via CLI and pasted into the login page.&lt;br /&gt;
:&#039;&#039;&#039;Token payload:&#039;&#039;&#039; { role: &#039;admin&#039; }&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; POST /api/auth/verify&lt;br /&gt;
&lt;br /&gt;
;Maintenance&lt;br /&gt;
:A scheduled maintenance window that can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, description, scheduled_start, scheduled_end, status (scheduled, in_progress, completed).&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; maintenance, maintenance_service&lt;br /&gt;
&lt;br /&gt;
;Subscriber&lt;br /&gt;
:A user subscribed to status update notifications, either by email or webhook. Email subscribers must confirm via a token link before receiving notifications.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; email (or webhook_url), type (email, webhook), confirmed, confirm_token, unsubscribe_token.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; subscriber (with partial unique indexes on email and webhook_url)&lt;br /&gt;
&lt;br /&gt;
;Group&lt;br /&gt;
:A label used to visually organize services on the status page. Stored as a string field on the service table (not a separate entity). Services with the same group value are displayed together under a shared heading. Services without a group appear under &amp;quot;Uncategorized&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2334</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2334"/>
		<updated>2026-02-17T15:32:56Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;Configuration&lt;br /&gt;
:Application-level settings stored in config/app.json and served via the config API.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; navbar.title, navbar.buttons_left (array of {name, link}), footer.line1 (text with %link1%/%link2% placeholders, labels, URLs), footer.line2 (text with %link% placeholder, label, URL).&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/config/getAll (public), PUT /api/config (admin)&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metrics&lt;br /&gt;
:Performance data recorded per service, either by the health check service (automatic) or via the API (manual).&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; service_id, uptime (decimal 0-100), response_time (integer, ms), error_rate (decimal 0-100), recorded_at.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; metric (indexed on service_id + recorded_at)&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/metrics (latest per service), GET /api/metrics/service/:id?days=30 (raw), GET /api/metrics/service/:id/daily?days=30 (aggregated)&lt;br /&gt;
&lt;br /&gt;
;Incidents&lt;br /&gt;
:An outage, disruption, or degradation reported on the status page. Incidents follow a lifecycle and can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, status (investigating, identified, monitoring, resolved), impact (none, minor, major, critical), start_date, update_date, end_date.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident, incident_update, incident_service&lt;br /&gt;
&lt;br /&gt;
;Incident Update&lt;br /&gt;
:A timestamped status change within an incident, forming the incident timeline.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; incident_id, status, message.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident_update&lt;br /&gt;
&lt;br /&gt;
;Users&lt;br /&gt;
:Admin access is controlled by JWT tokens signed with JWT_SECRET. There is no user table, no user accounts, and no permissions system. A single admin role exists. Tokens are generated via CLI and pasted into the login page.&lt;br /&gt;
:&#039;&#039;&#039;Token payload:&#039;&#039;&#039; { role: &#039;admin&#039; }&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; POST /api/auth/verify&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2333</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2333"/>
		<updated>2026-02-17T15:31:11Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;Configuration&lt;br /&gt;
:Application-level settings stored in config/app.json and served via the config API.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; navbar.title, navbar.buttons_left (array of {name, link}), footer.line1 (text with %link1%/%link2% placeholders, labels, URLs), footer.line2 (text with %link% placeholder, label, URL).&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/config/getAll (public), PUT /api/config (admin)&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metrics&lt;br /&gt;
:This concept represents the performance metrics or indicators being measured for each component, such as uptime, response time, error rates, and other relevant metrics.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, value, unit, timestamp.&lt;br /&gt;
&lt;br /&gt;
;Incidents&lt;br /&gt;
:An outage, disruption, or degradation reported on the status page. Incidents follow a lifecycle and can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, status (investigating, identified, monitoring, resolved), impact (none, minor, major, critical), start_date, update_date, end_date.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident, incident_update, incident_service&lt;br /&gt;
&lt;br /&gt;
;Incident Update&lt;br /&gt;
:A timestamped status change within an incident, forming the incident timeline.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; incident_id, status, message.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident_update&lt;br /&gt;
&lt;br /&gt;
;Users&lt;br /&gt;
:Admin access is controlled by JWT tokens signed with JWT_SECRET. There is no user table, no user accounts, and no permissions system. A single admin role exists. Tokens are generated via CLI and pasted into the login page.&lt;br /&gt;
:&#039;&#039;&#039;Token payload:&#039;&#039;&#039; { role: &#039;admin&#039; }&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; POST /api/auth/verify&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2332</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2332"/>
		<updated>2026-02-17T15:29:06Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;Configuration&lt;br /&gt;
:Application-level settings stored in config/app.json and served via the config API.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; navbar.title, navbar.buttons_left (array of {name, link}), footer.line1 (text with %link1%/%link2% placeholders, labels, URLs), footer.line2 (text with %link% placeholder, label, URL).&lt;br /&gt;
:&#039;&#039;&#039;Endpoint:&#039;&#039;&#039; GET /api/config/getAll (public), PUT /api/config (admin)&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metrics&lt;br /&gt;
:This concept represents the performance metrics or indicators being measured for each component, such as uptime, response time, error rates, and other relevant metrics.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, value, unit, timestamp.&lt;br /&gt;
&lt;br /&gt;
;Incidents&lt;br /&gt;
:An outage, disruption, or degradation reported on the status page. Incidents follow a lifecycle and can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, status (investigating, identified, monitoring, resolved), impact (none, minor, major, critical), start_date, update_date, end_date.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident, incident_update, incident_service&lt;br /&gt;
&lt;br /&gt;
;Incident Update&lt;br /&gt;
:A timestamped status change within an incident, forming the incident timeline.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; incident_id, status, message.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident_update&lt;br /&gt;
&lt;br /&gt;
;Users&lt;br /&gt;
:This concept represents the users who view or edit the status page.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, role, permissions (permissions could also be defined at role level)&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2331</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2331"/>
		<updated>2026-02-17T15:27:38Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;StatusPage&lt;br /&gt;
:The entity representing the status page itself.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, description, URL&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metrics&lt;br /&gt;
:This concept represents the performance metrics or indicators being measured for each component, such as uptime, response time, error rates, and other relevant metrics.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, value, unit, timestamp.&lt;br /&gt;
&lt;br /&gt;
;Incidents&lt;br /&gt;
:An outage, disruption, or degradation reported on the status page. Incidents follow a lifecycle and can affect multiple services.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, status (investigating, identified, monitoring, resolved), impact (none, minor, major, critical), start_date, update_date, end_date.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident, incident_update, incident_service&lt;br /&gt;
&lt;br /&gt;
;Incident Update&lt;br /&gt;
:A timestamped status change within an incident, forming the incident timeline.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; incident_id, status, message.&lt;br /&gt;
:&#039;&#039;&#039;Database tables:&#039;&#039;&#039; incident_update&lt;br /&gt;
&lt;br /&gt;
;Users&lt;br /&gt;
:This concept represents the users who view or edit the status page.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, role, permissions (permissions could also be defined at role level)&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2330</id>
		<title>ServPulse/Domain</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Domain&amp;diff=2330"/>
		<updated>2026-02-17T15:23:58Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lexicon ==&lt;br /&gt;
&lt;br /&gt;
;StatusPage&lt;br /&gt;
:The entity representing the status page itself.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, description, URL&lt;br /&gt;
&lt;br /&gt;
;Service&lt;br /&gt;
:A monitored entity on the status page (server, application, database, API, etc.). Services can be grouped and ordered.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, group, description, url, auto_status, status (operational, degraded, partial, major, maintenance), order.&lt;br /&gt;
:&#039;&#039;&#039;Database table:&#039;&#039;&#039; service&lt;br /&gt;
&lt;br /&gt;
;Metrics&lt;br /&gt;
:This concept represents the performance metrics or indicators being measured for each component, such as uptime, response time, error rates, and other relevant metrics.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, value, unit, timestamp.&lt;br /&gt;
&lt;br /&gt;
;Incidents&lt;br /&gt;
:This concept represents any incidents, outages, or disruptions that occur and are reported on the status page.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; title, description, status (e.g., resolved, ongoing), severity&lt;br /&gt;
&lt;br /&gt;
;Users&lt;br /&gt;
:This concept represents the users who view or edit the status page.&lt;br /&gt;
:&#039;&#039;&#039;Attributes:&#039;&#039;&#039; name, role, permissions (permissions could also be defined at role level)&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse/Development_guide&amp;diff=2329</id>
		<title>ServPulse/Development guide</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse/Development_guide&amp;diff=2329"/>
		<updated>2026-02-17T15:21:21Z</updated>

		<summary type="html">&lt;p&gt;Ieli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Getting started ==&lt;br /&gt;
&lt;br /&gt;
 git clone http://devcentral.nasqueron.org/source/servpulse.git&lt;br /&gt;
 cd servpulse&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 docker compose up&lt;br /&gt;
&lt;br /&gt;
The application will be available at:&lt;br /&gt;
* Status page: http://localhost:8080&lt;br /&gt;
* API: http://localhost:3000/api&lt;br /&gt;
&lt;br /&gt;
== Project structure ==&lt;br /&gt;
&lt;br /&gt;
 servpulse/&lt;br /&gt;
 ├── backend/          Express.js API server (MVC pattern)&lt;br /&gt;
 │   ├── controllers/  Request handlers&lt;br /&gt;
 │   ├── models/       Data access layer (raw pg queries)&lt;br /&gt;
 │   ├── routes/       API route definitions&lt;br /&gt;
 │   ├── middleware/    JWT authentication&lt;br /&gt;
 │   ├── services/     Business logic (notifications, health checks)&lt;br /&gt;
 │   ├── config/       App config (app.json) and database connection&lt;br /&gt;
 │   └── __tests__/    Jest unit tests&lt;br /&gt;
 ├── frontend/         Vue.js 3 application&lt;br /&gt;
 │   └── src/&lt;br /&gt;
 │       ├── components/   Reusable UI components&lt;br /&gt;
 │       ├── composables/  Vue 3 composables (useServices, useIncidents, etc.)&lt;br /&gt;
 │       ├── views/        Page views (StatusPage, AdminDashboard, AdminLogin)&lt;br /&gt;
 │       ├── plugins/      API client (Axios)&lt;br /&gt;
 │       ├── utils/        Status helpers and formatters&lt;br /&gt;
 │       └── router/       Vue Router config with auth guards&lt;br /&gt;
 ├── database/         SQL schema (init.sql)&lt;br /&gt;
 └── docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
== Code conventions ==&lt;br /&gt;
&lt;br /&gt;
* [[Code_conventions|Nasqueron conventions]]&lt;br /&gt;
* Single quotes for strings&lt;br /&gt;
* camelCase for variables and functions&lt;br /&gt;
* Vue 3 Composition API (&amp;lt;code&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/code&amp;gt;) for components&lt;br /&gt;
* Tailwind CSS utility classes for styling (no scoped styles)&lt;br /&gt;
* Raw pg queries in models (no ORM)&lt;br /&gt;
&lt;br /&gt;
== How to add a new feature ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a backend resource ===&lt;br /&gt;
&lt;br /&gt;
# Add table to &amp;lt;code&amp;gt;database/init.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create &amp;lt;code&amp;gt;models/resourceModel.js&amp;lt;/code&amp;gt; — raw pg queries&lt;br /&gt;
# Create &amp;lt;code&amp;gt;controllers/resourceController.js&amp;lt;/code&amp;gt; — req/res handlers&lt;br /&gt;
# Create &amp;lt;code&amp;gt;routes/resourceRoutes.js&amp;lt;/code&amp;gt; — Express router with auth where needed&lt;br /&gt;
# Register routes in &amp;lt;code&amp;gt;app.js&amp;lt;/code&amp;gt;&lt;br /&gt;
# Add tests in &amp;lt;code&amp;gt;__tests__/controllers/resourceController.test.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adding a frontend component ===&lt;br /&gt;
&lt;br /&gt;
# Create &amp;lt;code&amp;gt;.vue&amp;lt;/code&amp;gt; file in &amp;lt;code&amp;gt;src/components/&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Use Tailwind classes and existing utilities from &amp;lt;code&amp;gt;@/utils/status&amp;lt;/code&amp;gt;&lt;br /&gt;
# Import composables from &amp;lt;code&amp;gt;@/composables/&amp;lt;/code&amp;gt; for data&lt;br /&gt;
# Add tests in &amp;lt;code&amp;gt;src/components/__tests__/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Axios integration ==&lt;br /&gt;
&lt;br /&gt;
The API client is configured in &amp;lt;code&amp;gt;frontend/src/plugins/api.js&amp;lt;/code&amp;gt;. It uses Axios with a base URL from &amp;lt;code&amp;gt;VITE_API_URL&amp;lt;/code&amp;gt; and automatically attaches JWT tokens from localStorage via a request interceptor.&lt;br /&gt;
&lt;br /&gt;
Composables (&amp;lt;code&amp;gt;useServices&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;useIncidents&amp;lt;/code&amp;gt;, etc.) wrap the API calls and return reactive refs:&lt;br /&gt;
&lt;br /&gt;
 const { services, loading, error, fetchServices } = useServices()&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
 # Backend (Jest)&lt;br /&gt;
 cd backend &amp;amp;&amp;amp; npm test&lt;br /&gt;
&lt;br /&gt;
 # Frontend (Vitest)&lt;br /&gt;
 cd frontend &amp;amp;&amp;amp; npm run test:unit&lt;br /&gt;
&lt;br /&gt;
== Git workflow ==&lt;br /&gt;
&lt;br /&gt;
See &amp;lt;code&amp;gt;docs/workflow.md&amp;lt;/code&amp;gt; in the repository for the arc diff workflow.&lt;br /&gt;
&lt;br /&gt;
[[Category:ServPulse|Development guide]]&lt;br /&gt;
[[Category:Developer guide]]&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
	<entry>
		<id>https://agora.nasqueron.org/index.php?title=ServPulse&amp;diff=2328</id>
		<title>ServPulse</title>
		<link rel="alternate" type="text/html" href="https://agora.nasqueron.org/index.php?title=ServPulse&amp;diff=2328"/>
		<updated>2026-02-17T15:17:31Z</updated>

		<summary type="html">&lt;p&gt;Ieli: /* Technology stack */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ServPulse&#039;&#039;&#039; is an open-source status-page platform for publishing the status of services, components, and infrastructure. Its goal is to make it easy to communicate incidents, maintenance, and uptime metrics in a transparent way.&lt;br /&gt;
&lt;br /&gt;
ServPulse is designed to be self-hostable, simple to deploy, and extensible. It provides a foundation for teams and communities to manage status pages, integrate with monitoring tools, and notify users automatically.&lt;br /&gt;
&lt;br /&gt;
The project is community-driven: contributions to the code, documentation, themes, integrations, or translations are all welcome. ServPulse aims to remain open, reliable, and adaptable to different environments, while keeping the setup and use straightforward.&lt;br /&gt;
&lt;br /&gt;
== Technology stack ==&lt;br /&gt;
* &#039;&#039;&#039;Back-end&#039;&#039;&#039;&lt;br /&gt;
    + Express.js (Node.js 20) with MVC architecture&lt;br /&gt;
    + PostgreSQL 16 database (raw pg queries, no ORM)&lt;br /&gt;
    + JWT authentication&lt;br /&gt;
    + Nodemailer for email notifications&lt;br /&gt;
    + Unit tests in Jest&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Front-end&#039;&#039;&#039;&lt;br /&gt;
    + Vue.js 3 (Composition API with &amp;lt;script setup&amp;gt;)&lt;br /&gt;
    + Tailwind CSS for styling&lt;br /&gt;
    + Chart.js for uptime charts&lt;br /&gt;
    + API queried through Axios&lt;br /&gt;
    + Unit tests in Vitest&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Infrastructure&#039;&#039;&#039;&lt;br /&gt;
    + Docker Compose (development and production)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* [https://devcentral.nasqueron.org/p/ieli/ Eli] (lead developer)&lt;br /&gt;
* Amine (developer)&lt;br /&gt;
* [[User:Dereckson|Dereckson]] (technical advisory)&lt;br /&gt;
&lt;br /&gt;
Thanks for help to map stories:&lt;br /&gt;
&lt;br /&gt;
* {{u|DorianWinty}}&lt;br /&gt;
* Fauve&lt;br /&gt;
&lt;br /&gt;
== Discussion spaces ==&lt;br /&gt;
* Report issues: [https://devcentral.nasqueron.org/tag/servpulse/ DevCentral]&lt;br /&gt;
* Team discussions: [https://discord.gg/DZQK8Dd8Xd Discord]&lt;br /&gt;
&lt;br /&gt;
== Activities ==&lt;br /&gt;
; Analysis&lt;br /&gt;
* [[/Note of Intent]]&lt;br /&gt;
* [[/Other existing solutions]]&lt;br /&gt;
* [[/Development guide]]&lt;br /&gt;
* [[/Project identity]]: why ServPulse name&lt;br /&gt;
* [[/Domain]]: names used in the project&lt;br /&gt;
* [[/User stories]]&lt;br /&gt;
&lt;br /&gt;
== Useful links ==&lt;br /&gt;
* [https://devcentral.nasqueron.org/project/view/149/ DevCentral project board]&lt;br /&gt;
* [https://devcentral.nasqueron.org/source/servpulse/ Repository]&lt;br /&gt;
&lt;br /&gt;
[[Category:ServPulse]]&lt;/div&gt;</summary>
		<author><name>Ieli</name></author>
	</entry>
</feed>