Partners

Product Updates

DatoCMS changelog for new features and general improvements
New
Customizable toolbar for HTML and Markdown editors
August 7th, 2018

We just shipped the ability to customize the toolbar buttons on multi-paragraph HTML and Markdown fields from the Presentation tab:

New
Multiple deployment environments
August 2nd, 2018

In the beginning, a DatoCMS project could only have a deployment environment, the production one. Then, we introduced staging environment. Starting from today, you can setup as many environments as you want and trigger a build of your content on an unlimited number of external services.

This is a great addition for your editorial team, as it can now publish their content on a number of different platforms and let DatoCMS be the unique point where it manages data to be sent everywhere: websites, apps, wearables, you name it.

NewAPI Clients
Webhooks now available!
August 2nd, 2018

You can now be notified when one of these actions occur inside a DatoCMS project:

  • Create/update/delete/publish/unpublish a record

  • Create/update/delete a model

  • Create/update/delete an upload (that is, a file or an image in your Media area)

You can also set some filters, so for example you can be notified just when when a record of a specific model (ie. Article) is updated.

Just to give some examples, webhook enable you to:

  • Integrate/sync DatoCMS data with third-party systems (Snipcart, Shopify, Algolia, etc.);

  • Get Slack/email notifications;

  • Automatically post an update on Facebook/Twitter;

  • Produce an automatic deploy on your staging environment;

If you don't want to write any integration code, you can use Zapier Webhooks to connect a DatoCMS event with hundreads of different external services, creating any kind of complex automation workflow.

You can read all the details regarding this feature in our documentation page.

New
Optional translations now available!
June 28th, 2018

You can now configure a certain model so that you are not forced to insert content for every language your administrative area supports, but just for the primary one, and then manually add additional locales on a per-record basis.

This allows use cases such as multi-language blogs, where some articles can be written only in English, other only in Italian and others in both languages.

You can enable optional translations in your Model settings:

This will be the result for the editor:

API Clients
Released v0.5.4 of JS client
June 27th, 2018

We just rolled version 0.5.4 of our JS client!

The big change is that the methods the client makes available are generated at runtime based on the JSON Schema of our CMA. This means any new API endpoint — or changes to existing ones — will instantly be reflected to the client, without the need to upgrade to the latest client version.

We also added a new deserializeResponse option to every call, that you can use if you want to retrieve the exact payload the DatoCMS returns:

import { SiteClient } from 'datocms-client';
const client = new SiteClient("YOUR-API-KEY")
// `deserializeResponse` is true by default:
const accessToken = client.accessTokens.create({
name: "New token",
role: "34"
})
// {
// id: "312",
// hardcodedType: null,
// name: "New token",
// token: "XXXX",
// role: "34"
// }
// if `deserializeResponse` is false, this will be the result
const accessToken = client.accessTokens.create(
{
name: "New token",
role: "34"
},
{
deserializeResponse: false
}
)
// {
// data: {
// type: "access_token",
// id: "312",
// attributes: {
// name: "New token",
// token: "XXXX",
// hardcoded_type: nil
// },
// relationships: {
// role: {
// data: {
// type: "role",
// id: "34"
// }
// }
// }
// }
// }

In our doc pages we also added some examples for the super-handy allPages option which was already present since v0.3.29:

// if you want to fetch all the pages with just one call:
client.items.all({ "filter[type]" => "44" }, { allPages: true })
API Clients
Released gatsby-source-datocms v1.1.9
June 18th, 2018

We just added support for the new Gatsby v2 fixed and fluid responsive image queries.

Old names (sizes and resolutions) are deprecated but still work.

Docs, Guides and Demos
Custom assets domain documentation page
June 17th, 2018

DatoCMS uses the domain www.datocms-assets.com to serve your project's asset files, but on higher plans, you can choose to use your own S3 account and domain. We just added a specific doc page to describe the whole process.

New
Added ability to destroy your account
June 17th, 2018

You can now decide to completely delete your DatoCMS account from the "My account" section of the dashboard.

Content Delivery API
Query batching
June 12th, 2018

We just enabled query batching support to our GraphQL Content Delivery API.

This means you can combine multiple GraphQL operations into a single HTTP request, reducing HTTP overheads. If you use Apollo Client, you can enable batch queries with the apollo-link-batch-http package:

import { ApolloClient } from 'apollo-client';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { BatchHttpLink } from 'apollo-link-batch-http';
const httpLink = new BatchHttpLink({
uri: 'https://graphql.datocms.com/',
});
const authLink = setContext((_, { headers }) => {
return {
headers: {
...headers,
'Authorization': `Bearer ${process.env.DATO_API_TOKEN}`,
}
}
});
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
export default client;
API ClientsContent Management API
Released v0.6 of Ruby client
June 10th, 2018

We just rolled version 0.6 of our Ruby client!

The big change is that the methods the client makes available are generated at runtime based on the JSON Schema of our CMA. This means any new API endpoint — or changes to existing ones — will instantly be reflected to the client, without the need to upgrade to the latest client version.

We also added a new deserialize_response option to every call, that you can use if you want to retrieve the exact payload the DatoCMS returns:

require "dato"
client = Dato::Site::Client.new("YOUR-API-KEY")
# `deserialize_response` is true by default:
access_token = client.access_tokens.create(name: "New token", role: "34")
# {
# "id" => "312",
# "hardcoded_type" => nil,
# "name" => "New token",
# "token" => "XXXX",
# "role" => "34"
# }
# if `deserialize_response` is false, this will be the result
access_token = client.access_tokens.create(
{ name: "New token", role: "34" },
deserialize_response: false
)
# {
# "data": {
# "type": "access_token",
# "id": "312",
# "attributes": {
# "name": "New token",
# "token": "XXXX",
# "hardcoded_type": nil
# },
# "relationships": {
# "role": {
# "data": {
# "type": "role",
# "id": "34"
# }
# }
# }
# }
# }

In our doc pages we also added some examples for the super-handy all_pages option which was already present since v0.3.29:

# if you want to fetch all the pages with just one call:
client.items.all({ "filter[type]" => "44" }, all_pages: true)