diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php
new file mode 100644
index 0000000..16b76fd
--- /dev/null
+++ b/app/Http/Controllers/CategoryController.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\CategoryRequest;
+use App\Models\Category;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+
+class CategoryController extends Controller
+{
+    use AuthorizesRequests;
+
+    public function index()
+    {
+        $this->authorize('viewAny', Category::class);
+
+        return view('categories.index')->with(['categories' => Category::all()]);
+    }
+
+    public function store(CategoryRequest $request)
+    {
+        $this->authorize('create', Category::class);
+
+        return Category::create($request->validated());
+    }
+
+    public function show(Category $category)
+    {
+        $this->authorize('view', $category);
+
+        return $category;
+    }
+
+    public function update(CategoryRequest $request, Category $category)
+    {
+        $this->authorize('update', $category);
+
+        $category->update($request->validated());
+
+        return $category;
+    }
+
+    public function destroy(Category $category)
+    {
+        $this->authorize('delete', $category);
+
+        $category->delete();
+
+        return response()->json();
+    }
+}
diff --git a/app/Http/Requests/CategoryRequest.php b/app/Http/Requests/CategoryRequest.php
new file mode 100644
index 0000000..d78bd68
--- /dev/null
+++ b/app/Http/Requests/CategoryRequest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class CategoryRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'name' => ['required'],
+        ];
+    }
+
+    public function authorize(): bool
+    {
+        return auth()->check();
+    }
+}
diff --git a/app/Models/Category.php b/app/Models/Category.php
index 3dd9712..6d47b1c 100644
--- a/app/Models/Category.php
+++ b/app/Models/Category.php
@@ -4,10 +4,11 @@
 
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 class Category extends Model
 {
-    use HasFactory;
+    use HasFactory, SoftDeletes;
 
     protected $fillable = [
         'name',
diff --git a/app/Policies/CategoryPolicy.php b/app/Policies/CategoryPolicy.php
new file mode 100644
index 0000000..feeb5ef
--- /dev/null
+++ b/app/Policies/CategoryPolicy.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Policies;
+
+use App\Models\Category;
+use App\Models\User;
+use Illuminate\Auth\Access\HandlesAuthorization;
+
+class CategoryPolicy
+{
+    use HandlesAuthorization;
+
+    public function viewAny(User $user): bool
+    {
+        return true;
+    }
+
+    public function view(User $user, Category $category): bool
+    {
+        return true;
+    }
+
+    public function create(User $user): bool
+    {
+        return auth()->check();
+    }
+
+    public function update(User $user, Category $category): bool
+    {
+        return auth()->check();
+    }
+
+    public function delete(User $user, Category $category): bool
+    {
+        return auth()->check();
+    }
+
+    public function restore(User $user, Category $category): bool
+    {
+        return auth()->check();
+    }
+
+    public function forceDelete(User $user, Category $category): bool
+    {
+        return auth()->check();
+    }
+}
diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php
new file mode 100644
index 0000000..0d7ba38
--- /dev/null
+++ b/database/factories/CategoryFactory.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Database\Factories;
+
+use App\Models\Category;
+use Illuminate\Database\Eloquent\Factories\Factory;
+use Illuminate\Support\Carbon;
+
+class CategoryFactory extends Factory
+{
+    protected $model = Category::class;
+
+    public function definition(): array
+    {
+        return [
+            'name'       => $this->faker->word(),
+            'created_at' => Carbon::now(),
+            'updated_at' => Carbon::now(),
+        ];
+    }
+}
diff --git a/database/migrations/2025_02_21_041740_create_categories_table.php b/database/migrations/2025_02_21_041740_create_categories_table.php
new file mode 100644
index 0000000..23dba50
--- /dev/null
+++ b/database/migrations/2025_02_21_041740_create_categories_table.php
@@ -0,0 +1,23 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('categories', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->timestamps();
+            $table->softDeletes();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('categories');
+    }
+};
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index d01a0ef..457bb4a 100755
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -2,10 +2,12 @@
 
 namespace Database\Seeders;
 
+use App\Models\Category;
 use App\Models\User;
-// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
 use Illuminate\Database\Seeder;
 
+// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+
 class DatabaseSeeder extends Seeder
 {
     /**
@@ -16,8 +18,11 @@ public function run(): void
         // User::factory(10)->create();
 
         User::factory()->create([
-            'name' => 'Test User',
-            'email' => 'test@example.com',
+            'name'     => 'Marley',
+            'email'    => 'e@m.ail',
+            'password' => 'password',
         ]);
+
+        Category::factory(20)->create();
     }
 }
diff --git a/resources/views/admin.blade.php b/resources/views/admin.blade.php
index f655f46..a3bb9e1 100644
--- a/resources/views/admin.blade.php
+++ b/resources/views/admin.blade.php
@@ -3,5 +3,7 @@
     <h2>Admin</h2>
   </x-slot>
 
-  <div>You're logged in!</div>
+  <p>You're logged in!</p>
+
+  <a href="{{ route('categories.index') }}">Categories</a>
 </x-app-layout>
diff --git a/resources/views/categories/index.blade.php b/resources/views/categories/index.blade.php
new file mode 100644
index 0000000..94a9c2f
--- /dev/null
+++ b/resources/views/categories/index.blade.php
@@ -0,0 +1,22 @@
+<x-app-layout>
+  <x-slot:title>Categories</x-slot>
+
+  <div class="sunken-panel">
+    <table>
+      <thead>
+        <tr>
+          <th>Category</th>
+          <th>Actions</th>
+        </tr>
+      </thead>
+      <tbody>
+        @foreach ($categories as $category)
+          <tr>
+            <td>{{ $category->name }}</td>
+            <td></td>
+          </tr>
+        @endforeach
+      </tbody>
+    </table>
+  </div>
+</x-app-layout>
diff --git a/routes/web.php b/routes/web.php
index 08c7593..c59939c 100755
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,5 +1,6 @@
 <?php
 
+use App\Http\Controllers\CategoryController;
 use App\Http\Controllers\ProfileController;
 use Illuminate\Support\Facades\Route;
 
@@ -21,3 +22,7 @@
 });
 
 require __DIR__.'/auth.php';
+
+Route::resources([
+    'categories' => CategoryController::class,
+]);