Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
2dfa33d
docs: draft TinaCMS October month-to-date recap
ianhoffmanx Oct 21, 2026
90958c8
fix: render recent blog cards without an optional author
ianhoffmanx Oct 21, 2026
ceddd67
content: credit October TinaCMS update to Ian Hoffman
ianhoffmanx Oct 21, 2026
8d3a6d7
docs: rewrite October recap in Spit Happens format; drop site code ch…
ianhoffmanx Oct 21, 2026
c5cc743
docs: remove internal-only detail from October recap
ianhoffmanx Oct 21, 2026
84ccf55
docs: link September recap to October recap
ianhoffmanx Oct 22, 2026
28e40a2
docs: qualify October recap against release and implementation evidence
ianhoffmanx Oct 22, 2026
5a65460
docs: complete lockfile upgrade guidance and source qualifications
ianhoffmanx Oct 22, 2026
7d09186
Remove private repo links from the October update
ianhoffmanx Oct 22, 2026
49a7e54
content: export October OG and Instagram images
ianhoffmanx Oct 27, 2026
e27797c
content: credit October roundup to TinaCMS team
ianhoffmanx Oct 27, 2026
8b3e306
content: regenerate October social images for team byline
ianhoffmanx Oct 27, 2026
5d69225
fix: refresh TinaCloud schema indexing after rebase
ianhoffmanx Oct 27, 2026
9242050
Merge branch 'main' into feature/tinacms-october-mtd-20261022
ianhoffmanx Oct 27, 2026
6ad470d
Merge branch 'main' into feature/tinacms-october-mtd-20261022
ianhoffmanx Oct 27, 2026
986f866
Simplify October Spit Happens for a marketing audience
ianhoffmanx Nov 3, 2026
9954d2f
Merge current main and refresh Tina schema index
ianhoffmanx Nov 3, 2026
da0eba8
Include October 27 shipped improvements in Spit Happens
ianhoffmanx Nov 3, 2026
db4b8f3
Keep Tina event schema labels stable across daylight saving
ianhoffmanx Nov 3, 2026
335c2f4
Apply final October Spit Happens wording
ianhoffmanx Nov 3, 2026
11f46b3
Update publication date for October 2026 blog post
ianhoffmanx Nov 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/blog/2026-09-updates.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ date: '2026-09-25T06:06:43.004Z'
last_edited: '2026-10-07T01:21:20.802Z'
author: The TinaCMS Team
prev: content/blog/august-2026-roundup.mdx
next: ''
next: content/blog/2026-10-month-to-date.mdx
---

The herd has been busy again 🦙. In September we merged 112 pull requests across TinaCMS and TinaCloud and shipped 8 releases between them.
Expand Down
68 changes: 68 additions & 0 deletions content/blog/2026-10-month-to-date.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
seo:
title: 'Spit Happens: October 2026 News - Colour and faster indexing'
description: 'October updates: text colour, a 24-hour date picker, better references, faster TinaCloud indexing and easier dashboard navigation on mobile.'
title: 'Spit Happens: October 2026 News - Colour and faster indexing'
date: '2026-11-03T00:00:00.000Z'
author: 'The TinaCMS Team'
prev: content/blog/2026-09-updates.mdx
next: ''
---

The herd has been busy again 🦙. Here's a look at October's editor improvements, reference fixes and TinaCloud updates, including the improvements released on 27 October.

## 📦 TinaCMS Updates

### 🎨 TinaCMS 3.15 brings some handy changes to the everyday editing experience

- **Text colour:** Add colour to rich text with the new Text Color dropdown (next to Highlight). Developers can customise the palette. Check out the [setup guide](https://tina.io/docs/reference/types/rich-text#text-color) for more info. ([#7683](https://github.com/tinacms/tinacms/pull/7683))
- **24-hour time picker:** Date fields follow your chosen time format, including a 24-hour clock. ([#7798](https://github.com/tinacms/tinacms/pull/7798))
- **Readable field descriptions:** Longer descriptions wrap onto another line. ([#7734](https://github.com/tinacms/tinacms/pull/7734))

### 🔗 References that keep up

- **Rename content with confidence:** References inside lists and rich-text components are included when updating links after a rename or delete. ([#7851](https://github.com/tinacms/tinacms/pull/7851))
- **Keep collections working:** Sorted collections handle deleted content without interrupting the rest of the list. ([#7133](https://github.com/tinacms/tinacms/pull/7133))
- **Upgrading?** Reindex after updating to `@tinacms/graphql` 4.0.1 to refresh existing references.

### 🩹 Fewer snags

- **Tidier Markdown lists:** Adjacent lists save without an extra separator comment.
- **Cleaner content files:** Empty optional image fields stay out of saved content.
- **Image lists in rich text:** Lists of images work inside rich-text templates.
- **Clearer messages:** Error dialogs have descriptive titles and help links. ([#7738](https://github.com/tinacms/tinacms/pull/7738))
- **More accessible save status:** Screen readers can identify whether content has been saved. ([#7791](https://github.com/tinacms/tinacms/pull/7791))
- **Better build feedback:** Indexing messages give developers more useful information when troubleshooting. ([#7786](https://github.com/tinacms/tinacms/pull/7786))

**Developer note:** TinaCMS 3.15 requires React 18 or later. Check the [release notes](https://github.com/tinacms/tinacms/releases/tag/tinacms%403.15.0) before upgrading.

## ☁️ TinaCloud Updates

### ⚡ Faster indexing

- Indexing processes more work in parallel to reduce time spent waiting on storage.
- New-branch indexing does less repeated processing behind the scenes.
- **More reliable multi-repo indexing:** Content branches use the right schema when a project spans repositories.

### 📱 A friendlier dashboard

- **Easier navigation on phones:** A dropdown keeps dashboard sections within reach on smaller screens.
- **Clearer indexing feedback:** Developers get more useful status messages when checking a build.
- **Admin safeguards:** Projects retain an admin when roles are changed.
- **Privacy controls:** The dashboard asks for consent before loading tracking in supported regions.

### 🖼️ Better image caching

- Browsers can reuse cached SVG, PNG and WebP assets instead of downloading them again unnecessarily.

## Keep up with socials

Follow along for product updates, tutorials and team news:

- X: [@tinacms](https://x.com/tinacms)
- LinkedIn: [TinaCMS](https://www.linkedin.com/company/tinacms)
- YouTube: [@TinaCMS](https://youtube.com/@TinaCMS)
- Bluesky: [@tina.io](https://bsky.app/profile/tina.io)
- Discord: [Come chat with us!](https://tina.io/discord)

Till next time 👋🦙
Binary file added public/og/2026-10-month-to-date-instagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/og/2026-10-month-to-date-social.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 3 additions & 19 deletions tina/collectionsSchema/eventsSchema.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,11 @@ import React from 'react';
import { LocationField } from 'tina/customTinaFormFields/locationField';
import { TextField, wrapFieldsWithMeta } from 'tinacms';
import majorTimezones from '../../components/componentSuppliedData/EventsTimezones.json';
import { getSchemaUtcOffsetHours } from '../../utils/schemaTimezoneOffset';
import { seoInformation } from './sharedFields/seoInformation';

type offset = { value: any; label: string };

const getUtcOffsetHours = (ianaName: string): number => {
const formatted = new Date().toLocaleString('en-US', {
timeZone: ianaName,
timeZoneName: 'shortOffset',
});
const match = formatted.match(/GMT([+-]?\d+(?::(\d+))?)?$/);
if (!match) {
return 0;
}
if (!match[1]) {
return 0;
} // "GMT" with no offset = UTC
const hours = parseInt(match[1], 10);
const minutes = match[2] ? parseInt(match[2], 10) : 0;
return hours + (hours < 0 ? -minutes : minutes) / 60;
};

const dateFormat = Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'short',
Expand All @@ -48,7 +32,7 @@ const addCitiesAndPrefix = (offsets: number[], _prefix = '+'): offset[] => {
const cityTimezoneMap = new Map();
//Get the timezones of major cities
majorTimezones.forEach((cityOffset) => {
const zone = getUtcOffsetHours(cityOffset.ianaName);
const zone = getSchemaUtcOffsetHours(cityOffset.ianaName);
cityTimezoneMap.set(
zone,
cityTimezoneMap.get(zone)
Expand Down Expand Up @@ -176,7 +160,7 @@ export const eventsCollection = {
label: 'Timezone',
type: 'number',
description:
'Please select the timezone the event is being held in. GMT and UTC are analagous.',
'Select the UTC offset for the event date. City names show January offsets; allow for daylight saving.',
ui: {
parse: (value) => Number(value),
component: 'select',
Expand Down
2 changes: 1 addition & 1 deletion tina/tina-lock.json

Large diffs are not rendered by default.

34 changes: 34 additions & 0 deletions utils/schemaTimezoneOffset.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { getSchemaUtcOffsetHours } from './schemaTimezoneOffset';

describe('schema timezone city hints', () => {
const RealDate = Date;
afterEach(() => {
global.Date = RealDate;
});

it('keeps labels stable across the November daylight-saving transition', () => {
const offsets = ['2026-10-31T12:00:00Z', '2026-11-03T12:00:00Z'].map(
(now) => {
global.Date = jest.fn(
(value?: string) => new RealDate(value ?? now),
) as unknown as DateConstructor;
return [
'America/New_York',
'America/Chicago',
'America/Los_Angeles',
].map(getSchemaUtcOffsetHours);
},
);
expect(offsets).toEqual([
[-5, -6, -8],
[-5, -6, -8],
]);
});

it('preserves UTC, positive and half-hour offsets', () => {
expect(getSchemaUtcOffsetHours('UTC')).toBe(0);
expect(getSchemaUtcOffsetHours('Australia/Sydney')).toBe(11);
expect(getSchemaUtcOffsetHours('Asia/Kolkata')).toBe(5.5);
expect(getSchemaUtcOffsetHours('America/St_Johns')).toBe(-3.5);
});
});
18 changes: 18 additions & 0 deletions utils/schemaTimezoneOffset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Schema labels must not change between indexing and builds across DST transitions.
// City hints use a fixed January reference; event values remain explicit UTC offsets.
export const getSchemaUtcOffsetHours = (ianaName: string): number => {
const formatted = new Date('2026-01-01T00:00:00Z').toLocaleString('en-US', {
timeZone: ianaName,
timeZoneName: 'shortOffset',
});
const match = formatted.match(/GMT([+-]?\d+(?::(\d+))?)?$/);
if (!match) {
return 0;
}
if (!match[1]) {
return 0;
} // "GMT" with no offset = UTC
const hours = parseInt(match[1], 10);
const minutes = match[2] ? parseInt(match[2], 10) : 0;
return hours + (hours < 0 ? -minutes : minutes) / 60;
};
Loading