diff --git a/project/dalia/apps.py b/project/dalia/apps.py
index a1402107489a8bd42c3b064972b944bb6a9cee65..87623eb88729bfbae492e5b5dc3c72306e40c986 100644
--- a/project/dalia/apps.py
+++ b/project/dalia/apps.py
@@ -4,3 +4,7 @@ from django.apps import AppConfig
 class DaliaConfig(AppConfig):
     default_auto_field = 'django.db.models.BigAutoField'
     name = 'project.dalia'
+
+    def ready(self):
+        # Implicitly connect signal handlers decorated with @receiver.
+        import project.dalia.signals  # noqa
diff --git a/project/dalia/migrations/0001_initial.py b/project/dalia/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..3eecf5478f68257c56daee8c8fb56001ad63af7f
--- /dev/null
+++ b/project/dalia/migrations/0001_initial.py
@@ -0,0 +1,26 @@
+# Generated by Django 5.1.7 on 2025-03-27 19:31
+
+import django.db.models.deletion
+import uuid
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('auth', '0012_alter_user_first_name_max_length'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='UserProfile',
+            fields=[
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
+                ('dalia_id', models.UUIDField(default=uuid.uuid4, unique=True)),
+                ('orcid', models.CharField(max_length=37)),
+            ],
+        ),
+    ]
diff --git a/project/dalia/models.py b/project/dalia/models.py
index 71a836239075aa6e6e4ecb700e9c42c95c022d91..7615d3f6ec30a54fb9635612520fffc0aca89dcc 100644
--- a/project/dalia/models.py
+++ b/project/dalia/models.py
@@ -1,3 +1,10 @@
+import uuid
+
+from django.conf import settings
 from django.db import models
 
-# Create your models here.
+
+class UserProfile(models.Model):
+    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
+    dalia_id = models.UUIDField(default=uuid.uuid4, unique=True)
+    orcid = models.CharField(max_length=37)  # "https://orcid.org/XXXX-XXXX-XXXX-XXXX"
diff --git a/project/dalia/signals.py b/project/dalia/signals.py
new file mode 100644
index 0000000000000000000000000000000000000000..c01ef14c62bd28ebdf1f7c37f4e28695a095da58
--- /dev/null
+++ b/project/dalia/signals.py
@@ -0,0 +1,12 @@
+from django.conf import settings
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+
+from project.dalia.models import UserProfile
+
+
+@receiver(post_save, sender=settings.AUTH_USER_MODEL)
+def initialize_user_profile_signal(sender, instance, created, **kwargs):
+    if created:
+        UserProfile(user=instance)
+    instance.userprofile.save()
diff --git a/tests/project/dalia/test_signals.py b/tests/project/dalia/test_signals.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd533e183ac97cccf7a215e237a4cd5edbad772b
--- /dev/null
+++ b/tests/project/dalia/test_signals.py
@@ -0,0 +1,34 @@
+from django.contrib.auth import get_user_model
+
+from project.dalia.models import UserProfile
+
+
+def test_initialize_user_profile_signal_initializes_user_profile_after_user_is_created(db):
+    user_model = get_user_model()
+    assert user_model.objects.count() == 0
+
+    user = user_model(username="test")
+    user.save()
+
+    assert user_model.objects.count() == 1
+    assert UserProfile.objects.count() == 1
+    assert user.userprofile.orcid == ""
+    assert user.userprofile.dalia_id
+
+
+def test_initialize_user_profile_signal_does_not_change_profile_after_user_is_changed(db):
+    user_model = get_user_model()
+    user = user_model(username="test")
+    user.save()
+    assert user_model.objects.count() == 1
+    assert UserProfile.objects.count() == 1
+    orcid = user.userprofile.orcid
+    dalia_id = user.userprofile.dalia_id
+
+    user.first_name = "abc"
+    user.save()
+
+    assert user_model.objects.count() == 1
+    assert UserProfile.objects.count() == 1
+    assert user.userprofile.orcid == orcid
+    assert user.userprofile.dalia_id == dalia_id