diff --git a/components/admin/admin.vue b/components/admin/admin.vue
index 447523c..f26601f 100644
--- a/components/admin/admin.vue
+++ b/components/admin/admin.vue
@@ -17,6 +17,14 @@
:class="{ active: pageContext.routeParams.section === 'revisions' && pageContext.routeParams.domain === 'actors' }"
>Actor Revisions
+
+
+ Entity Health
+
diff --git a/pages/admin/+Page.vue b/pages/admin/+Page.vue
index e3e4ac0..96bd754 100644
--- a/pages/admin/+Page.vue
+++ b/pages/admin/+Page.vue
@@ -16,6 +16,13 @@
class="link"
>Actor Revisions
+
+
+ Entity Health
+
diff --git a/pages/admin/entities/+Page.vue b/pages/admin/entities/+Page.vue
new file mode 100644
index 0000000..882681a
--- /dev/null
+++ b/pages/admin/entities/+Page.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ entity.name }} |
+ {{ entity.totalReleases }} |
+ {{ entity.latestReleaseDate && format(entity.latestReleaseDate, 'yyyy-MM-dd hh:mm') }} |
+
+
+
+
+
+
+
+
+
diff --git a/pages/admin/entities/+onBeforeRender.js b/pages/admin/entities/+onBeforeRender.js
new file mode 100644
index 0000000..a642d24
--- /dev/null
+++ b/pages/admin/entities/+onBeforeRender.js
@@ -0,0 +1,27 @@
+import { render } from 'vike/abort'; /* eslint-disable-line import/extensions */
+import { fetchEntityHealths } from '#/src/entities.js';
+
+export async function onBeforeRender(pageContext) {
+ if (!pageContext.user || pageContext.user.role === 'user') {
+ throw render(404);
+ }
+
+ const {
+ entities,
+ } = await fetchEntityHealths({
+ sort: pageContext.urlParsed.search.sort || 'releases',
+ order: pageContext.urlParsed.search.order || 'desc',
+ }, pageContext.user);
+
+ return {
+ pageContext: {
+ title: pageContext.routeParams.section,
+ pageProps: {
+ entities,
+ },
+ routeParams: {
+ section: 'entities',
+ },
+ },
+ };
+}
diff --git a/pages/entities/+Page.vue b/pages/entities/+Page.vue
index 51089ac..da77520 100644
--- a/pages/entities/+Page.vue
+++ b/pages/entities/+Page.vue
@@ -61,7 +61,7 @@