diff --git a/entries/__init__.py b/entries/__init__.py
new file mode 100644
index 0000000..0b65d99
--- /dev/null
+++ b/entries/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'entries.apps.EntriesConfig'
diff --git a/entries/admin.py b/entries/admin.py
new file mode 100644
index 0000000..3a48189
--- /dev/null
+++ b/entries/admin.py
@@ -0,0 +1,5 @@
+from django.contrib import admin
+from .models import Entry
+
+
+admin.site.register(Entry)
diff --git a/entries/apps.py b/entries/apps.py
new file mode 100644
index 0000000..554d2a6
--- /dev/null
+++ b/entries/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class EntriesConfig(AppConfig):
+ name = 'entries'
diff --git a/entries/kinds.py b/entries/kinds.py
new file mode 100644
index 0000000..fc61491
--- /dev/null
+++ b/entries/kinds.py
@@ -0,0 +1,15 @@
+class Note:
+ id = 'note'
+ icon = 'fa fa-paper-plane'
+ plural = 'notes'
+
+
+class Article:
+ id = 'article'
+ icon = 'fa fa-file-text'
+ plural = 'articles'
+
+
+all = (Note, Article)
+from_id = {k.id: k for k in all}
+from_plural = {k.plural: k for k in all}
diff --git a/entries/migrations/0001_initial.py b/entries/migrations/0001_initial.py
new file mode 100644
index 0000000..1228631
--- /dev/null
+++ b/entries/migrations/0001_initial.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.6 on 2017-10-25 00:50
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Entry',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('kind', models.CharField(choices=[('note', 'Note'), ('article', 'Article')], default='note', max_length=30)),
+ ('name', models.CharField(blank=True, max_length=100)),
+ ('summary', models.TextField(blank=True)),
+ ('content', models.TextField()),
+ ('published', models.DateTimeField()),
+ ('updated', models.DateTimeField()),
+ ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'verbose_name_plural': 'entries',
+ 'ordering': ['-published'],
+ },
+ ),
+ ]
diff --git a/entries/migrations/__init__.py b/entries/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/entries/models.py b/entries/models.py
new file mode 100644
index 0000000..c2f8562
--- /dev/null
+++ b/entries/models.py
@@ -0,0 +1,33 @@
+from django.contrib.auth import get_user_model
+from django.db import models
+
+from . import kinds
+ENTRY_KINDS = [(k.id, k.__name__) for k in kinds.all]
+
+
+class Entry(models.Model):
+ kind = models.CharField(
+ max_length=30,
+ choices=ENTRY_KINDS,
+ default=ENTRY_KINDS[0][0]
+ )
+
+ name = models.CharField(max_length=100, blank=True)
+ summary = models.TextField(blank=True)
+ content = models.TextField()
+
+ author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
+
+ published = models.DateTimeField()
+ updated = models.DateTimeField()
+
+ def __str__(self):
+ return '{kind} {id}: {content}'.format(
+ kind=self.kind,
+ id=self.id,
+ content=self.content
+ )
+
+ class Meta:
+ verbose_name_plural = 'entries'
+ ordering = ['-published']
diff --git a/entries/templates/entries/entry.html b/entries/templates/entries/entry.html
new file mode 100644
index 0000000..395a41e
--- /dev/null
+++ b/entries/templates/entries/entry.html
@@ -0,0 +1,24 @@
+{% load humanize %}{{ entry.name }}
{% endif %}
+