Open demo

CSS code

HTML
<div class="audit">
  <h2 class="day">Today</h2>

  <ol class="evs">
    <li class="ev" style="--c:#16a34a"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-15T14:22">14:22</time>
      <span class="chip c-create">Create</span>
      <span class="txt"><b>Rosa M.</b> created board <code>Q4 planning</code></span></li>
    <li class="ev" style="--c:#4f46e5"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-15T13:58">13:58</time>
      <span class="chip c-update">Update</span>
      <span class="txt"><b>Aigars K.</b> changed retention from <code>30d</code> to <code>90d</code></span></li>
    <li class="ev" style="--c:#f59e0b"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-15T11:04">11:04</time>
      <span class="chip c-auth">Auth</span>
      <span class="txt"><b>Tomas P.</b> signed in from a new device (Lisbon)</span></li>
    <li class="ev" style="--c:#dc2626"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-15T09:31">09:31</time>
      <span class="chip c-delete">Delete</span>
      <span class="txt"><b>Priya N.</b> removed 4 archived projects</span></li>
  </ol>

  <h2 class="day">Yesterday</h2>

  <ol class="evs">
    <li class="ev" style="--c:#4f46e5"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-14T18:47">18:47</time>
      <span class="chip c-update">Update</span>
      <span class="txt"><b>Rosa M.</b> invited <code>[email protected]</code> as Reviewer</span></li>
    <li class="ev" style="--c:#f59e0b"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-14T16:12">16:12</time>
      <span class="chip c-auth">Auth</span>
      <span class="txt">SSO enforced for all members by <b>Aigars K.</b></span></li>
    <li class="ev" style="--c:#16a34a"><span class="dot" aria-hidden="true"></span><time datetime="2026-09-14T10:05">10:05</time>
      <span class="chip c-create">Create</span>
      <span class="txt"><b>Tomas P.</b> generated an API key ending <code>·9f2a</code></span></li>
  </ol>
</div>
CSS
/* Dense audit log: a day heading over an <ol> of one-line events. The action is written in each chip,
   so the coloured dot only repeats it. */
.audit{--au-border:#e3e8f2;--au-line:#eef1f8;--au-text:#4a5570;--au-light:#646f8b;
  width:100%;max-width:660px;background:#fff;border:1px solid var(--au-border);border-radius:13px;padding:8px 0;overflow:hidden}
.audit,.audit *{box-sizing:border-box}
.audit :where(h2,ol,li){margin:0;padding:0;list-style:none}
.audit .ev{display:flex;align-items:baseline;gap:12px;padding:8px 18px;position:relative;font-size:.83rem}
.audit .ev:hover{background:#fafbfe}
.audit .ev::before{content:"";position:absolute;left:29px;top:0;bottom:0;width:2px;background:var(--au-line)}
.audit .ev:first-child::before{top:14px}
.audit .ev:last-child::before{bottom:14px}
.audit .dot{position:relative;z-index:1;width:9px;height:9px;border-radius:50%;flex-shrink:0;
  margin-left:7px;background:var(--c,#98a2bd);box-shadow:0 0 0 3px #fff}
.audit time{font-variant-numeric:tabular-nums;color:var(--au-light);font-size:.77rem;flex-shrink:0;width:52px}
.audit .chip{font-size:.68rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;padding:2px 7px;
  border-radius:5px;flex-shrink:0}
.audit .txt{color:var(--au-text);line-height:1.5;min-width:0;overflow-wrap:anywhere}
.audit .txt b{color:#17203a;font-weight:700}
.audit .txt code{background:#f1f4fa;padding:1px 5px;border-radius:4px;font-size:.9em}
.audit .c-create{background:#e8f8ee;color:#15803d}
.audit .c-update{background:#eef2ff;color:#3730a3}
.audit .c-delete{background:#fdecec;color:#b91c1c}
.audit .c-auth{background:#fff4e5;color:#b45309}
.audit .day{padding:12px 18px 6px;font-size:.71rem;font-weight:800;letter-spacing:.09em;text-transform:uppercase;
  color:var(--au-light)}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="audit card w-100">
  <h2 class="day text-uppercase m-0">Today</h2>

  <ol class="list-group list-group-flush">
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#16a34a"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-15T14:22">14:22</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-create">Create</span>
      <span class="txt"><b>Rosa M.</b> created board <code>Q4 planning</code></span></li>
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#4f46e5"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-15T13:58">13:58</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-update">Update</span>
      <span class="txt"><b>Aigars K.</b> changed retention from <code>30d</code> to <code>90d</code></span></li>
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#f59e0b"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-15T11:04">11:04</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-auth">Auth</span>
      <span class="txt"><b>Tomas P.</b> signed in from a new device (Lisbon)</span></li>
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#dc2626"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-15T09:31">09:31</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-delete">Delete</span>
      <span class="txt"><b>Priya N.</b> removed 4 archived projects</span></li>
  </ol>

  <h2 class="day text-uppercase m-0">Yesterday</h2>

  <ol class="list-group list-group-flush">
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#4f46e5"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-14T18:47">18:47</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-update">Update</span>
      <span class="txt"><b>Rosa M.</b> invited <code>[email protected]</code> as Reviewer</span></li>
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#f59e0b"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-14T16:12">16:12</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-auth">Auth</span>
      <span class="txt">SSO enforced for all members by <b>Aigars K.</b></span></li>
    <li class="ev list-group-item list-group-item-action d-flex align-items-baseline" style="--c:#16a34a"><span class="dot position-relative rounded-circle flex-shrink-0" aria-hidden="true"></span><time class="flex-shrink-0" datetime="2026-09-14T10:05">10:05</time>
      <span class="chip badge text-uppercase flex-shrink-0 c-create">Create</span>
      <span class="txt"><b>Tomas P.</b> generated an API key ending <code>·9f2a</code></span></li>
  </ol>
</div>
CSS
/* Bootstrap .card + flush .list-group with .badge chips; the spine and dots are custom CSS.
   The action is written in each chip, so the coloured dot only repeats it. */
.audit{--au-border:#e3e8f2;--au-line:#eef1f8;--au-text:#4a5570;--au-light:#646f8b;max-width:660px;
  --bs-card-border-color:var(--au-border);--bs-card-border-radius:13px;padding:8px 0;overflow:hidden}
.audit .list-group{--bs-list-group-border-width:0;--bs-list-group-item-padding-x:18px;--bs-list-group-item-padding-y:8px;
  --bs-list-group-action-hover-bg:#fafbfe;--bs-list-group-action-hover-color:inherit;--bs-list-group-action-active-bg:#fafbfe;--bs-list-group-color:#17203a}
.audit>.list-group{border:0}
.audit .ev{gap:12px;font-size:.83rem;line-height:normal;cursor:default}
.audit .ev::before{content:"";position:absolute;left:29px;top:0;bottom:0;width:2px;background:var(--au-line)}
.audit .ev:first-child::before{top:14px}
.audit .ev:last-child::before{bottom:14px}
.audit .dot{z-index:1;width:9px;height:9px;margin-left:7px;background:var(--c,#98a2bd);box-shadow:0 0 0 3px #fff}
.audit time{font-variant-numeric:tabular-nums;color:var(--au-light);font-size:.77rem;width:52px}
.audit .chip{--bs-badge-font-size:.68rem;--bs-badge-font-weight:800;--bs-badge-padding-y:2px;--bs-badge-padding-x:7px;--bs-badge-border-radius:5px;
  letter-spacing:.04em;line-height:normal}
.audit .txt{color:var(--au-text);line-height:1.5;min-width:0;overflow-wrap:anywhere}
.audit .txt b{color:#17203a;font-weight:700}
.audit .txt code{background:#f1f4fa;color:inherit;padding:1px 5px;border-radius:4px;font-size:.9em}
.audit .c-create{background:#e8f8ee;color:#15803d}
.audit .c-update{background:#eef2ff;color:#3730a3}
.audit .c-delete{background:#fdecec;color:#b91c1c}
.audit .c-auth{background:#fff4e5;color:#b45309}
.audit .day{padding:12px 18px 6px;font-size:.71rem;font-weight:800;letter-spacing:.09em;color:var(--au-light);line-height:normal}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="w-full max-w-[660px] overflow-hidden rounded-[13px] border border-au-border bg-white py-2">
  <h2 class="px-[18px] pt-3 pb-1.5 text-[.71rem] font-extrabold tracking-[.09em] text-au-light uppercase">Today</h2>

  <ol>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#16a34a"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-15T14:22">14:22</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#e8f8ee] text-[#15803d]">Create</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Rosa M.</b> created board <code class="rounded bg-[#f1f4fa] px-[5px] py-px text-[.9em]">Q4 planning</code></span></li>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#4f46e5"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-15T13:58">13:58</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#eef2ff] text-[#3730a3]">Update</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Aigars K.</b> changed retention from <code class="rounded bg-[#f1f4fa] px-[5px] py-px text-[.9em]">30d</code> to <code class="rounded bg-[#f1f4fa] px-[5px] py-px text-[.9em]">90d</code></span></li>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#f59e0b"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-15T11:04">11:04</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#fff4e5] text-[#b45309]">Auth</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Tomas P.</b> signed in from a new device (Lisbon)</span></li>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#dc2626"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-15T09:31">09:31</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#fdecec] text-[#b91c1c]">Delete</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Priya N.</b> removed 4 archived projects</span></li>
  </ol>

  <h2 class="px-[18px] pt-3 pb-1.5 text-[.71rem] font-extrabold tracking-[.09em] text-au-light uppercase">Yesterday</h2>

  <ol>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#4f46e5"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-14T18:47">18:47</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#eef2ff] text-[#3730a3]">Update</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Rosa M.</b> invited <code class="rounded bg-[#f1f4fa] px-[5px] py-px text-[.9em]">[email protected]</code> as Reviewer</span></li>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#f59e0b"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-14T16:12">16:12</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#fff4e5] text-[#b45309]">Auth</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]">SSO enforced for all members by <b>Aigars K.</b></span></li>
    <li class="relative flex items-baseline gap-3 px-[18px] py-2 text-[.83rem] hover:bg-[#fafbfe] before:absolute before:top-0 before:bottom-0 before:left-[29px] before:w-0.5 before:bg-au-line first:before:top-3.5 last:before:bottom-3.5" style="--c:#16a34a"><span class="relative z-[1] ml-[7px] size-[9px] shrink-0 rounded-full bg-(--c) shadow-[0_0_0_3px_#fff]" aria-hidden="true"></span><time class="w-[52px] shrink-0 text-[.77rem] text-au-light tabular-nums" datetime="2026-09-14T10:05">10:05</time>
      <span class="shrink-0 rounded-[5px] px-[7px] py-0.5 text-[.68rem] font-extrabold tracking-[.04em] uppercase bg-[#e8f8ee] text-[#15803d]">Create</span>
      <span class="min-w-0 leading-[1.5] [overflow-wrap:anywhere] text-au-text [&_b]:font-bold [&_b]:text-[#17203a]"><b>Tomas P.</b> generated an API key ending <code class="rounded bg-[#f1f4fa] px-[5px] py-px text-[.9em]">·9f2a</code></span></li>
  </ol>
</div>
CSS
@theme {
  --color-au-border: #e3e8f2;
  --color-au-line: #eef1f8;
  --color-au-text: #4a5570;
  --color-au-light: #646f8b;
}

About this set

A dense audit log that fits one event per line, for admin panels and security pages where the list can run to fifty rows. Events are grouped under day headings, Today and Yesterday, and each row has a small coloured dot on a faint spine, a time, an action chip, Create, Update, Auth or Delete, and a sentence naming who did what, with identifiers in inline code. Rows take a light background on hover to help the eye track across. The chip text carries the action and the dot colour only repeats it, so the log reads the same without colour. Each day is an h2 heading followed by an ordered list of events, and every time is a time element with the full ISO date and time, so the short 14:22 still has an exact meaning. Long values such as email addresses wrap instead of pushing the card wider, so it holds at 375 pixels. Use it for account activity, admin audit trails, permission changes or sign-in history. The Bootstrap version builds the rows from a flush .list-group inside a .card with .badge chips, and the Tailwind version uses first: and last: variants to trim the spine.

What’s included

  • One line per event with time, action chip and description
  • Create, Update, Auth and Delete chips with text labels
  • Day headings over ordered lists
  • ISO date and time on every time element
  • Long values wrap so the log never overflows on a phone

Accessibility

Each day is a heading followed by an ordered list, and every event's action is written in its chip, so meaning never rests on the dot colour; the dots are aria-hidden. Times are time elements with full datetime values. Times and day headings were darkened to meet 4.5:1 and the chip colours pass on their tints. Nothing animates.

Customise it

Change --au-border, --au-line, --au-text and --au-light on .audit (plain CSS and Bootstrap) or the --color-au-* theme colours in Tailwind. Chip colours are the .c-create, .c-update, .c-delete and .c-auth rules, and each dot's colour is its inline --c.