diff --git a/app/Http/Controllers/Admin/InstancesController.php b/app/Http/Controllers/Admin/InstancesController.php
new file mode 100644
index 0000000..4cbdf88
--- /dev/null
+++ b/app/Http/Controllers/Admin/InstancesController.php
@@ -0,0 +1,18 @@
+get();
+
+ return view('admin.index', ['instances' => $instances]);
+ }
+}
diff --git a/resources/views/admin/index.blade.php b/resources/views/admin/index.blade.php
new file mode 100644
index 0000000..05d00bf
--- /dev/null
+++ b/resources/views/admin/index.blade.php
@@ -0,0 +1,22 @@
+
+
+
Instances
+
+
+
+
+ | Instance |
+ Last polled at |
+
+
+
+ @foreach($instances as $instance)
+
+ | {{ $instance->url }} |
+ {{ $instance->last_polled_at }} |
+
+ @endforeach
+
+
+
+
diff --git a/resources/views/layouts/layout.blade.php b/resources/views/layouts/layout.blade.php
new file mode 100644
index 0000000..5179da6
--- /dev/null
+++ b/resources/views/layouts/layout.blade.php
@@ -0,0 +1,8 @@
+
+
+ {{ $title ?? 'Trove' }}
+
+
+ {{ $slot }}
+
+
diff --git a/routes/web.php b/routes/web.php
index 6199875..6b7b768 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -2,6 +2,7 @@
declare(strict_types=1);
+use App\Http\Controllers\Admin\InstancesController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
@@ -11,3 +12,5 @@
Route::view('/submit', 'urls.submit');
Route::view('/bot', 'bot');
+
+Route::get('/admin/instances', [InstancesController::class, 'index'])->name('admin.instances');
diff --git a/tests/Feature/Admin/InstancesAdminPageTest.php b/tests/Feature/Admin/InstancesAdminPageTest.php
new file mode 100644
index 0000000..88c7670
--- /dev/null
+++ b/tests/Feature/Admin/InstancesAdminPageTest.php
@@ -0,0 +1,56 @@
+get('/admin/instances');
+
+ $response->assertStatus(200);
+ }
+
+ // -------------------------------------------------------------------------
+ // Test 4 — admin instances page lists each instance's URL and last_polled_at
+ // -------------------------------------------------------------------------
+
+ public function test_admin_instances_page_shows_each_instance_url_and_last_polled_at(): void
+ {
+ $mastodon = Instance::factory()
+ ->type(InstanceType::Mastodon)
+ ->enabled()
+ ->create([
+ 'url' => 'https://mastodon.social',
+ 'last_polled_at' => '2024-06-01 12:00:00',
+ ]);
+
+ $lemmy = Instance::factory()
+ ->type(InstanceType::Lemmy)
+ ->enabled()
+ ->create([
+ 'url' => 'https://lemmy.world',
+ 'last_polled_at' => '2024-06-01 13:00:00',
+ ]);
+
+ $response = $this->get('/admin/instances');
+
+ $response->assertSee($mastodon->url);
+ $response->assertSee($lemmy->url);
+ $response->assertSee($mastodon->last_polled_at->toDateString());
+ $response->assertSee($lemmy->last_polled_at->toDateString());
+ }
+}