diff --git a/app/Http/Controllers/Admin/SchoolInformationController.php b/app/Http/Controllers/Admin/SchoolInformationController.php
new file mode 100644
index 0000000..c4c59d9
--- /dev/null
+++ b/app/Http/Controllers/Admin/SchoolInformationController.php
@@ -0,0 +1,61 @@
+with('creator:id,name')
+ ->orderByDesc('event_date')
+ ->orderByDesc('created_at')
+ ->get();
+
+ return view('settings.school-info', compact('items'));
+ }
+
+ public function store(Request $request): RedirectResponse
+ {
+ $validated = $this->validateData($request);
+
+ SchoolInformation::create($validated + ['created_by' => $request->user()->id]);
+
+ return back()->with('success', 'Informasi "' . $validated['title'] . '" berhasil dipublikasikan.');
+ }
+
+ public function update(Request $request, int $id): RedirectResponse
+ {
+ $info = SchoolInformation::findOrFail($id);
+ $validated = $this->validateData($request);
+
+ $info->update($validated);
+
+ return back()->with('success', 'Informasi berhasil diperbarui.');
+ }
+
+ public function destroy(Request $request, int $id): RedirectResponse
+ {
+ $info = SchoolInformation::findOrFail($id);
+ $info->delete();
+
+ return back()->with('success', 'Informasi dihapus.');
+ }
+
+ protected function validateData(Request $request): array
+ {
+ return $request->validate([
+ 'title' => ['required', 'string', 'max:200'],
+ 'content' => ['nullable', 'string'],
+ 'category' => ['required', 'string', 'max:50'],
+ 'event_date' => ['nullable', 'date'],
+ 'is_published' => ['nullable', 'boolean'],
+ ]) + ['is_published' => $request->boolean('is_published')];
+ }
+}
diff --git a/app/Http/Controllers/Api/ParentSchoolInformationController.php b/app/Http/Controllers/Api/ParentSchoolInformationController.php
new file mode 100644
index 0000000..c4d7a60
--- /dev/null
+++ b/app/Http/Controllers/Api/ParentSchoolInformationController.php
@@ -0,0 +1,33 @@
+where('is_published', true)
+ ->orderByDesc('event_date')
+ ->orderByDesc('created_at')
+ ->limit(50)
+ ->get()
+ ->map(fn (SchoolInformation $i) => [
+ 'id' => $i->id,
+ 'title' => $i->title,
+ 'content' => $i->content,
+ 'category' => $i->category,
+ 'event_date' => $i->event_date?->toDateString(),
+ 'created_at' => $i->created_at?->toISOString(),
+ ]);
+
+ return response()->json(['informations' => $items]);
+ }
+}
diff --git a/app/Models/SchoolInformation.php b/app/Models/SchoolInformation.php
new file mode 100644
index 0000000..4e5c53f
--- /dev/null
+++ b/app/Models/SchoolInformation.php
@@ -0,0 +1,28 @@
+ 'date',
+ 'is_published' => 'boolean',
+ 'published_at' => 'datetime',
+ ];
+ }
+
+ public function creator()
+ {
+ return $this->belongsTo(User::class, 'created_by');
+ }
+}
diff --git a/database/migrations/2026_08_05_210750_create_school_informations_table.php b/database/migrations/2026_08_05_210750_create_school_informations_table.php
new file mode 100644
index 0000000..cb46205
--- /dev/null
+++ b/database/migrations/2026_08_05_210750_create_school_informations_table.php
@@ -0,0 +1,55 @@
+id();
+ $table->string('title', 200);
+ $table->text('content')->nullable();
+ $table->string('category', 50)->default('umum')->index(); // umum | akademik | kegiatan | uts | uas | lainnya
+ $table->date('event_date')->nullable()->index(); // tanggal kegiatan (mis. tanggal UTS)
+ $table->boolean('is_published')->default(true)->index();
+ $table->timestamp('published_at')->nullable();
+ $table->unsignedBigInteger('created_by')->nullable();
+ $table->timestamps();
+
+ $table->index(['is_published', 'event_date']);
+ });
+
+ // ===== Permission: kelola Informasi Sekolah =====
+ $now = now();
+ $permId = DB::table('permissions')->insertGetId([
+ 'key' => 'manage-school-info',
+ 'group' => 'sekolah',
+ 'label' => 'Kelola Informasi Sekolah',
+ 'description' => 'Tambah/ubah/hapus informasi & pengumuman sekolah (ditampilkan di aplikasi wali murid)',
+ 'created_at' => $now,
+ 'updated_at' => $now,
+ ]);
+
+ foreach (['admin', 'bk', 'waka_kesiswaan', 'kepala_sekolah', 'ketua_tim'] as $role) {
+ DB::table('role_permissions')->insertOrIgnore([
+ 'role' => $role,
+ 'permission_id' => $permId,
+ 'created_at' => $now,
+ 'updated_at' => $now,
+ ]);
+ }
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('school_informations');
+
+ $ids = DB::table('permissions')->where('key', 'manage-school-info')->pluck('id');
+ DB::table('role_permissions')->whereIn('permission_id', $ids)->delete();
+ DB::table('permissions')->where('key', 'manage-school-info')->delete();
+ }
+};
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
index 90d5687..30fe271 100644
--- a/resources/views/layouts/app.blade.php
+++ b/resources/views/layouts/app.blade.php
@@ -200,6 +200,9 @@
@canPermission('parents-verify')
Pengumuman kegiatan sekolah yang tampil di aplikasi Wali Murid (S1WON DIGI)
+{{ $info->content }}
+ @endif ++ Diposting oleh {{ $info->creator?->name ?? '-' }} ยท {{ $info->created_at->diffForHumans() }} +
+Belum ada informasi
+Tambahkan informasi pertama (UTS, Class Meet, kegiatan, dll) lewat form di samping.
+