
Security News
PHP Patches Critical RCE Vulnerabilities, Organizations Urged to Take Unpatched Sites Offline
PHP releases emergency patches for two critical RCE vulnerabilities as agencies urge organizations to take unpatched sites offline.
Typed client for the Yatmo API: neighbourhood summaries, points of interest, travel times, isochrones, geocoding, routes and static maps for real estate websites. Zero dependency, Node 18+, browsers and edge runtimes.
Typed client for the Yatmo API: neighbourhood summaries, points of interest, travel times, isochrones, geocoding, routes and static maps for real estate websites, in 25 countries. Zero dependency, ESM and CommonJS, Node 18+, browsers and edge runtimes. API documentation.
npm install @yatmo/sdk
import { createYatmoClient, renderSummaryText } from '@yatmo/sdk';
const yatmo = createYatmoClient({ key: process.env.YATMO_KEY!, country: 'BE', language: 'FR' });
const flat = { latitude: 50.8461, longitude: 4.3664 };
// The neighbourhood text, as HTML to write into the property page (indexable by search engines).
const text = await yatmo.summaryText(flat);
const html = renderSummaryText(text); // <div class="yatmo-text"><h3>Commerces près de la Rue de la Loi</h3><p>...</p>...
// The nearest places by category with travel times.
const summary = await yatmo.summary(flat);
for (const category of summary.categories) {
for (const sub of category.subCategories) {
const place = sub.places[0];
console.log(sub.label, place?.name, place?.travelData.find((t) => t.travelMode === 'walking')?.travelTimeShortLabel);
}
}
const yatmo = createYatmoClient({
key: '...', // required
country: 'BE', // required: the API host is https://be.yatmo.com/
language: 'FR', // labels and texts, default EN
timeoutMs: 15000, // default
fetch: customFetch, // optional, default globalThis.fetch
headers: {}, // optional extra headers
});
| Method | Endpoint | Returns |
|---|---|---|
summary(position) | /summary | Places by category with distances and travel times (walking, bicycling, driving, transit), closest cities, reverse-geocoded place |
summaryText(position, language?) | /Summary/text | The neighbourhood paragraphs in one language (EN fallback), with [STRONG] markers around key places |
summaryTextRaw(position) | /Summary/text | The same in every language of the country, to cache (30 days is reasonable) |
scores(position) | /scores | One 0 to 10 score per category |
enrichment(position) | /enrichment | The nearest place of each category with distances and times, for listing data |
points({ southWest, northEast, poiTypeIds? }) | /points | Points of interest in a bounding box |
simplifiedCategories() | /SimplifiedCategories | Category ids by family, the values of poiTypeIds |
isochrones({ latitude, longitude, mode }) | /Isochrone/GetMultipleTimes | The 5, 10 and 20 minute areas (GeoJSON) |
isochrone({ latitude, longitude, mode, seconds }) | /isochrone | One area for any duration |
route({ from, to, mode }) | /route | Distance, duration and LineString of the route |
geocode(address) | /geolocation | Addresses to coordinates, inside the country |
geocodeNear(position, query) | /Geolocation/GetClose | Address autocomplete around a point |
staticMap(options) | /image | JPEG bytes of the map centred on the property (pin colour, size, style, 3D, borders, custom marker) |
mode is walking, bicycling, driving or transit. Positions are { latitude, longitude }. Every call throws a
YatmoError with the HTTP status (400 point outside the country, 401 unknown key, 403 country or feature not in
the licence, 429 quota, 0 network).
renderSummaryText(text, {
format: 'html', // 'html' (default), 'markdown' or 'plain'
heading: 'h3', // h2 to h6, or null for no titles
titles: 'street-city', // street name in the first title and city in the second (default), 'city' for discreet listings, 'generic'
paragraphs: ['education', 'shopping', 'publictransports', 'transports', 'tourism', 'cities'], // which ones, in this order
strong: true, // key places in <strong> or **
className: 'my-text', // extra class on the wrapper
});
// app/listings/[id]/page.tsx (server component)
import { createYatmoClient, renderSummaryText } from '@yatmo/sdk';
const yatmo = createYatmoClient({ key: process.env.YATMO_KEY!, country: 'FR', language: 'FR' });
export default async function Listing({ params }) {
const listing = await getListing(params.id);
const text = await yatmo.summaryText(listing); // cache this per listing
return (
<article>
<h1>{listing.title}</h1>
<section dangerouslySetInnerHTML={{ __html: renderSummaryText(text) }} />
</article>
);
}
MIT licence. Yatmo is a paid service; a licence key is required.
FAQs
Typed client for the Yatmo API: neighbourhood summaries, points of interest, travel times, isochrones, geocoding, routes and static maps for real estate websites. Zero dependency, Node 18+, browsers and edge runtimes.
We found that @yatmo/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
PHP releases emergency patches for two critical RCE vulnerabilities as agencies urge organizations to take unpatched sites offline.

Threat Research
/Security News
A supply chain attack compromised LiteLLM 1.107.0 on PyPI and Docker, spreading malware that steals cloud credentials, developer secrets, and AI provider keys.

Security News
vlt 1.5.0 links skills from JavaScript dependencies to coding agents, with lockfile versioning and Socket data to filter out known malicious packages.