From 6aadb2cb2961bdfbaf62c9048752b4ff4807357d Mon Sep 17 00:00:00 2001 From: Rohid Date: Mon, 26 Aug 2024 20:48:28 +0600 Subject: [PATCH 01/18] add try catch around `getHtmlContentByTabId` function call --- src/background.ts | 23 +++++++++++++++++++---- src/utils/user.ts | 5 ++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/background.ts b/src/background.ts index e0c57ab..16b7e4b 100644 --- a/src/background.ts +++ b/src/background.ts @@ -25,7 +25,11 @@ browser.alarms.create('heartbeatAlarm', { periodInMinutes: 2 }); */ browser.tabs.onActivated.addListener(async (activeInfo) => { console.log('recording a heartbeat - active tab changed'); - const html = await getHtmlContentByTabId(activeInfo.tabId); + let html = ''; + try { + html = await getHtmlContentByTabId(activeInfo.tabId); + // eslint-disable-next-line no-empty + } catch (error: unknown) {} await WakaTimeCore.recordHeartbeat(html); }); @@ -43,7 +47,10 @@ browser.windows.onFocusChanged.addListener(async (windowId) => { let html = ''; const tabId = tabs[0]?.id; if (tabId) { - html = await getHtmlContentByTabId(tabId); + try { + html = await getHtmlContentByTabId(tabId); + // eslint-disable-next-line no-empty + } catch (error: unknown) {} } await WakaTimeCore.recordHeartbeat(html); } @@ -62,7 +69,11 @@ browser.tabs.onUpdated.addListener(async (tabId, changeInfo) => { }); // If tab updated is the same as active tab if (tabId == tabs[0]?.id) { - const html = await getHtmlContentByTabId(tabId); + let html = ''; + try { + html = await getHtmlContentByTabId(tabId); + // eslint-disable-next-line no-empty + } catch (error: unknown) {} await WakaTimeCore.recordHeartbeat(html); } } @@ -79,7 +90,11 @@ self.addEventListener('activate', async () => { browser.runtime.onMessage.addListener(async (request: PostHeartbeatMessage, sender) => { if (request.recordHeartbeat === true) { if (sender.tab?.id) { - const html = await getHtmlContentByTabId(sender.tab.id); + let html = ''; + try { + html = await getHtmlContentByTabId(sender.tab.id); + // eslint-disable-next-line no-empty + } catch (error: unknown) {} await WakaTimeCore.recordHeartbeat(html, request.projectDetails); } } diff --git a/src/utils/user.ts b/src/utils/user.ts index 152fc11..7ef7e55 100644 --- a/src/utils/user.ts +++ b/src/utils/user.ts @@ -73,7 +73,10 @@ export const fetchUserData = async ( let html = ''; const tabId = tabs[0]?.id; if (tabId) { - html = await getHtmlContentByTabId(tabId); + try { + html = await getHtmlContentByTabId(tabId); + // eslint-disable-next-line no-empty + } catch (error: unknown) {} } await WakaTimeCore.recordHeartbeat(html); From fcb807f276e52bd8a19b390378dd6805dc390887 Mon Sep 17 00:00:00 2001 From: Rohid Date: Mon, 26 Aug 2024 20:56:44 +0600 Subject: [PATCH 02/18] send heartbeat from google meet --- src/wakatimeScript.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index 3addfde..503ae67 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -40,11 +40,25 @@ const parseFigma = (): DesignProject | undefined => { }; }; +const parseMeet = (): DesignProject | undefined => { + const meetId = document.querySelector('[data-meeting-title]')?.getAttribute('data-meeting-title'); + if (!meetId) { + return; + } + return { + category: 'meeting', + editor: 'Meet', + language: 'Google Meet', + project: meetId, + }; +}; + const getParser: { [key: string]: | (() => { editor: string; language: string; project: string } | undefined) | undefined; } = { + 'meet.google.com': parseMeet, 'www.canva.com': parseCanva, 'www.figma.com': parseFigma, }; @@ -89,3 +103,16 @@ chrome.runtime.onMessage.addListener((request: { message: string }, sender, send sendResponse({ html: document.documentElement.outerHTML }); } }); + +// Google Meet +// https://meet.google.com/jzf-bwrz-djk +if (window.location.href.startsWith('https://meet.google.com/')) { + // In google meet website + // Check every two seconds if the user is in a meeting. + setInterval(() => { + const inMeeting = !!document.querySelector('[data-meeting-title]'); + if (inMeeting) { + debounce(() => init()); + } + }, 2000); +} From 652abc9c6fe4f67a22a634170f79b6461e5234e6 Mon Sep 17 00:00:00 2001 From: Rohid Date: Tue, 27 Aug 2024 10:56:30 +0600 Subject: [PATCH 03/18] use setTimeout and enhance the meeting checking logic --- src/wakatimeScript.ts | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index 503ae67..dfd798f 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -108,11 +108,30 @@ chrome.runtime.onMessage.addListener((request: { message: string }, sender, send // https://meet.google.com/jzf-bwrz-djk if (window.location.href.startsWith('https://meet.google.com/')) { // In google meet website - // Check every two seconds if the user is in a meeting. - setInterval(() => { - const inMeeting = !!document.querySelector('[data-meeting-title]'); - if (inMeeting) { - debounce(() => init()); - } - }, 2000); + + let inMeeting = false; + + const checkIfInAMeeting = (ms: number) => { + setTimeout(() => { + const isMeetingPage = !!document.querySelector('[data-meeting-title]'); + + if (isMeetingPage) { + void init(); + inMeeting = true; + + // If already in a meeting then check again after 2min + checkIfInAMeeting(1000 * 60 * 2); + } else { + if (inMeeting) { + void init(); + inMeeting = false; + } + + // If not in a meeting then check again after 5s + checkIfInAMeeting(1000 * 5); + } + }, ms); + }; + + checkIfInAMeeting(0); } From dfbfc358adfa175bf384942bd901dc3d2b170f5b Mon Sep 17 00:00:00 2001 From: Rohid Date: Tue, 27 Aug 2024 11:23:27 +0600 Subject: [PATCH 04/18] remove the slash --- src/wakatimeScript.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index dfd798f..2d905af 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -105,8 +105,7 @@ chrome.runtime.onMessage.addListener((request: { message: string }, sender, send }); // Google Meet -// https://meet.google.com/jzf-bwrz-djk -if (window.location.href.startsWith('https://meet.google.com/')) { +if (window.location.href.startsWith('https://meet.google.com')) { // In google meet website let inMeeting = false; From 6d77323cb8b1dd3e1aa3fc8b0aff0033ac42b177 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 09:11:33 +0200 Subject: [PATCH 05/18] Send heartbeat once every 5 minutes while in active Google Meets meeting --- src/wakatimeScript.ts | 94 ++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 54 deletions(-) diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index 2d905af..ad22454 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -1,4 +1,5 @@ -const twoMinutes = 120000; +const oneMinute = 60000; +const fiveMinutes = 300000; interface DesignProject { category: string; @@ -63,40 +64,38 @@ const getParser: { 'www.figma.com': parseFigma, }; -const init = async () => { - const { hostname } = document.location; - - const projectDetails = getParser[hostname]?.(); - if (projectDetails) { - chrome.runtime.sendMessage({ projectDetails, recordHeartbeat: true }); - } -}; - -function debounce(func: () => void, timeout = twoMinutes) { +/** + * Debounces the execution of a function. + * + * @param {() => void} func - The function to debounce. + * @param {number} [timeout] - The timeout for the debounce in milliseconds. + * @param {number} [maxWaitTime] - The max time to debounce before forcing execution in milliseconds. + * @returns {() => void} The debounced function. + */ +function debounce(func: () => void, timeout = oneMinute, maxWaitTime = fiveMinutes) { let timer: NodeJS.Timeout | undefined; - return () => { - if (timer) { - return; + let lastExecutionTime: number | undefined; + return (...args: unknown[]) => { + clearTimeout(timer); + if (lastExecutionTime && lastExecutionTime + maxWaitTime < Date.now()) { + lastExecutionTime = Date.now(); + func(...(args as [])); } - func(); timer = setTimeout(() => { - clearTimeout(timer); - timer = undefined; + lastExecutionTime = Date.now(); + func(...(args as [])); }, timeout); }; } -document.body.addEventListener( - 'click', - debounce(() => init()), - true, -); +const sendHeartbeat = debounce(async () => { + const { hostname } = document.location; -document.body.addEventListener( - 'keypress', - debounce(() => init()), - true, -); + const projectDetails = getParser[hostname]?.(); + if (projectDetails) { + chrome.runtime.sendMessage({ projectDetails, recordHeartbeat: true }); + } +}); chrome.runtime.onMessage.addListener((request: { message: string }, sender, sendResponse) => { if (request.message === 'get_html') { @@ -104,33 +103,20 @@ chrome.runtime.onMessage.addListener((request: { message: string }, sender, send } }); +document.body.addEventListener('click', sendHeartbeat, true); + +document.body.addEventListener('keypress', sendHeartbeat, true); + +const checkIfInAMeeting = () => { + const isActiveMeeting = !!document.querySelector('[data-meeting-title]'); + if (isActiveMeeting) { + sendHeartbeat(); + } + + setTimeout(checkIfInAMeeting, oneMinute); +}; + // Google Meet if (window.location.href.startsWith('https://meet.google.com')) { - // In google meet website - - let inMeeting = false; - - const checkIfInAMeeting = (ms: number) => { - setTimeout(() => { - const isMeetingPage = !!document.querySelector('[data-meeting-title]'); - - if (isMeetingPage) { - void init(); - inMeeting = true; - - // If already in a meeting then check again after 2min - checkIfInAMeeting(1000 * 60 * 2); - } else { - if (inMeeting) { - void init(); - inMeeting = false; - } - - // If not in a meeting then check again after 5s - checkIfInAMeeting(1000 * 5); - } - }, ms); - }; - - checkIfInAMeeting(0); + checkIfInAMeeting(); } From d5e94de63c74bbdf9001c8dd6656570353397893 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 13:45:10 +0200 Subject: [PATCH 06/18] start refactor --- src/components/Options.tsx | 164 ++++++++++----------------- src/config/config.test.ts | 8 +- src/config/config.ts | 18 +-- src/core/WakaTimeCore.ts | 179 ++++++++++++------------------ src/html/options.html | 2 +- src/types/heartbeats.ts | 49 ++++---- src/types/summaries.ts | 12 +- src/utils/changeExtensionState.ts | 8 +- src/utils/heartbeat.ts | 158 ++++++++++++++++++++++++++ src/utils/index.ts | 152 +------------------------ src/utils/logging.ts | 16 +++ src/utils/settings.ts | 71 ++++++++++++ src/utils/user.ts | 88 +++++++++++---- src/wakatimeScript.ts | 10 +- tests/utils/contains.spec.ts | 4 +- 15 files changed, 497 insertions(+), 442 deletions(-) create mode 100644 src/utils/heartbeat.ts create mode 100644 src/utils/logging.ts create mode 100644 src/utils/settings.ts diff --git a/src/components/Options.tsx b/src/components/Options.tsx index 156f264..414c32e 100644 --- a/src/components/Options.tsx +++ b/src/components/Options.tsx @@ -2,31 +2,24 @@ import React, { useEffect, useRef, useState } from 'react'; import config, { SuccessOrFailType } from '../config/config'; import { IS_CHROME } from '../utils'; import apiKeyInvalid from '../utils/apiKey'; +import { getSettings, saveSettings, Settings } from '../utils/settings'; import { logUserIn } from '../utils/user'; import SitesList from './SitesList'; -interface State { +interface State extends Settings { alertText: string; alertType: SuccessOrFailType; - apiKey: string; - apiUrl: string; - blacklist: string; - hostname: string; loading: boolean; - loggingStyle: string; - loggingType: string; - socialMediaSites: string[]; - theme: string; - trackSocialMedia: boolean; - whitelist: string; } + export default function Options(): JSX.Element { const [state, setState] = useState({ alertText: config.alert.success.text, alertType: config.alert.success.type, + allowList: [], apiKey: '', apiUrl: config.apiUrl, - blacklist: '', + denyList: [], hostname: '', loading: false, loggingStyle: config.loggingStyle, @@ -34,45 +27,15 @@ export default function Options(): JSX.Element { socialMediaSites: config.socialMediaSites, theme: config.theme, trackSocialMedia: config.trackSocialMedia, - whitelist: '', }); const loggingStyleRef = useRef(null); const restoreSettings = async (): Promise => { - const items = await browser.storage.sync.get({ - apiKey: config.apiKey, - apiUrl: config.apiUrl, - blacklist: '', - hostname: config.hostname, - loggingStyle: config.loggingStyle, - loggingType: config.loggingType, - socialMediaSites: config.socialMediaSites, - theme: config.theme, - trackSocialMedia: true, - whitelist: '', - }); - - // Handle prod accounts with old social media stored as string - if (typeof items.socialMediaSites === 'string') { - await browser.storage.sync.set({ - socialMediaSites: items.socialMediaSites.split('\n'), - }); - items.socialMediaSites = items.socialMediaSites.split('\n'); - } - + const settings = await getSettings(); setState({ ...state, - apiKey: items.apiKey as string, - apiUrl: items.apiUrl as string, - blacklist: items.blacklist as string, - hostname: items.hostname as string, - loggingStyle: items.loggingStyle as string, - loggingType: items.loggingType as string, - socialMediaSites: items.socialMediaSites as string[], - theme: items.theme as string, - trackSocialMedia: items.trackSocialMedia as boolean, - whitelist: items.whitelist as string, + ...settings, }); }; @@ -83,68 +46,60 @@ export default function Options(): JSX.Element { const handleSubmit = async () => { if (state.loading) return; setState({ ...state, loading: true }); - - const apiKey = state.apiKey; - const theme = state.theme; - const hostname = state.hostname; - const loggingType = state.loggingType; - const loggingStyle = state.loggingStyle; - const trackSocialMedia = state.trackSocialMedia; - const socialMediaSites = state.socialMediaSites; - // Trimming blacklist and whitelist removes blank lines and spaces. - const blacklist = state.blacklist.trim(); - const whitelist = state.whitelist.trim(); - let apiUrl = state.apiUrl; - - if (apiUrl.endsWith('/')) { - apiUrl = apiUrl.slice(0, -1); + if (state.apiUrl.endsWith('/')) { + state.apiUrl = state.apiUrl.slice(0, -1); } + await saveSettings({ + allowList: state.allowList, + apiKey: state.apiKey, + apiUrl: state.apiUrl, + denyList: state.denyList, + hostname: state.hostname, + loggingStyle: state.loggingStyle, + loggingType: state.loggingType, + socialMediaSites: state.socialMediaSites, + theme: state.theme, + trackSocialMedia: state.trackSocialMedia, + }); + setState(state); + await logUserIn(state.apiKey); + if (IS_CHROME) { + window.close(); + } + }; - // Sync options with google storage. - await browser.storage.sync.set({ - apiKey, - apiUrl, - blacklist, - hostname, - loggingStyle, - loggingType, - socialMediaSites, - theme, - trackSocialMedia, - whitelist, + const updateDenyListState = (sites: string) => { + setState({ + ...state, + denyList: sites.trim().split('\n'), }); + }; - // Set state to be newly entered values. + const updateAllowListState = (sites: string) => { setState({ ...state, - apiKey, - apiUrl, - blacklist, - hostname, - loggingStyle, - loggingType, - socialMediaSites, - theme, - trackSocialMedia, - whitelist, + allowList: sites.trim().split('\n'), }); - await logUserIn(state.apiKey); - if (IS_CHROME) { - window.close(); - } }; - const updateBlacklistState = (sites: string) => { + const updateLoggingStyle = (style: string) => { setState({ ...state, - blacklist: sites, + loggingStyle: style === 'allow' ? 'allow' : 'deny', }); }; - const updateWhitelistState = (sites: string) => { + const updateLoggingType = (type: string) => { setState({ ...state, - whitelist: sites, + loggingType: type === 'url' ? 'url' : 'domain', + }); + }; + + const updateTheme = (theme: string) => { + setState({ + ...state, + theme: theme === 'light' ? 'light' : 'dark', }); }; @@ -153,24 +108,25 @@ export default function Options(): JSX.Element { }; const loggingStyle = function () { - if (state.loggingStyle == 'blacklist') { + // TODO: rewrite SitesList to be structured inputs instead of textarea + + if (state.loggingStyle == 'deny') { return ( ); } - return ( ); }; @@ -206,10 +162,10 @@ export default function Options(): JSX.Element { ref={loggingStyleRef} className="form-control" value={state.loggingStyle} - onChange={(e) => setState({ ...state, loggingStyle: e.target.value })} + onChange={(e) => updateLoggingStyle(e.target.value)} > - - + + @@ -223,7 +179,7 @@ export default function Options(): JSX.Element { id="loggingType" className="form-control" value={state.loggingType} - onChange={(e) => setState({ ...state, loggingType: e.target.value })} + onChange={(e) => updateLoggingType(e.target.value)} > @@ -238,7 +194,7 @@ export default function Options(): JSX.Element { id="selectTheme" className="form-control" value={state.theme} - onChange={(e) => setState({ ...state, theme: e.target.value })} + onChange={(e) => updateTheme(e.target.value)} > diff --git a/src/config/config.test.ts b/src/config/config.test.ts index 7d357eb..6fc1980 100644 --- a/src/config/config.test.ts +++ b/src/config/config.test.ts @@ -49,7 +49,7 @@ describe('wakatime config', () => { "heartbeatApiEndPoint": "/users/current/heartbeats", "hostname": "", "loggingEnabled": true, - "loggingStyle": "blacklist", + "loggingStyle": "deny", "loggingType": "domain", "logoutUserUrl": "https://wakatime.com/logout", "name": "WakaTime", @@ -73,17 +73,15 @@ describe('wakatime config', () => { "allGood", "notLogging", "notSignedIn", - "blacklisted", - "whitelisted", + "ignored", ], "summariesApiEndPoint": "/users/current/summaries", "theme": "light", "tooltips": { "allGood": "", - "blacklisted": "This URL is blacklisted", + "ignored": "This URL is ignored", "notLogging": "Not logging", "notSignedIn": "Not signed In", - "whitelisted": "This URL is not on your whitelist", }, "trackSocialMedia": true, "version": "test-version", diff --git a/src/config/config.ts b/src/config/config.ts index f10f19c..02af5b6 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -3,16 +3,18 @@ import browser from 'webextension-polyfill'; /** * Logging */ -export type ApiStates = 'allGood' | 'notLogging' | 'notSignedIn' | 'blacklisted' | 'whitelisted'; +export type ApiStates = 'allGood' | 'notLogging' | 'notSignedIn' | 'ignored'; /** * Supported logging style */ -export type LoggingStyle = 'whitelist' | 'blacklist'; +export type LoggingStyle = 'allow' | 'deny'; + /** * Logging type */ export type LoggingType = 'domain' | 'url'; export type SuccessOrFailType = 'success' | 'danger'; +export type Theme = 'light' | 'dark'; /** * Predefined alert type and text for success and failure. */ @@ -41,10 +43,9 @@ interface Colors { */ interface Tooltips { allGood: string; - blacklisted: string; + ignored: string; notLogging: string; notSignedIn: string; - whitelisted: string; } export interface Config { @@ -97,7 +98,7 @@ export interface Config { /** * Options for theme */ - theme: 'light'; + theme: Theme; tooltips: Tooltips; trackSocialMedia: boolean; /** @@ -152,7 +153,7 @@ const config: Config = { loggingEnabled: true, - loggingStyle: 'blacklist', + loggingStyle: 'deny', loggingType: 'domain', @@ -175,7 +176,7 @@ const config: Config = { 'youtube.com', ], - states: ['allGood', 'notLogging', 'notSignedIn', 'blacklisted', 'whitelisted'], + states: ['allGood', 'notLogging', 'notSignedIn', 'ignored'], summariesApiEndPoint: process.env.SUMMARIES_API_URL ?? '/users/current/summaries', @@ -183,10 +184,9 @@ const config: Config = { tooltips: { allGood: '', - blacklisted: 'This URL is blacklisted', + ignored: 'This URL is ignored', notLogging: 'Not logging', notSignedIn: 'Not signed In', - whitelisted: 'This URL is not on your whitelist', }, trackSocialMedia: true, diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index 9c6f4f8..b66fde1 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -1,21 +1,23 @@ -/* eslint-disable no-fallthrough */ -/* eslint-disable default-case */ -import axios, { AxiosResponse } from 'axios'; import { IDBPDatabase, openDB } from 'idb'; import moment from 'moment'; import browser, { Tabs } from 'webextension-polyfill'; +import { IS_EDGE, IS_FIREFOX, getOperatingSystem, isCodeReviewing } from '../utils'; +import { getHeartbeatFromPage } from '../utils/heartbeat'; +/* eslint-disable no-fallthrough */ +/* eslint-disable default-case */ +import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; + import config from '../config/config'; -import { SendHeartbeat } from '../types/heartbeats'; -import { GrandTotal, SummariesPayload } from '../types/summaries'; -import { ApiKeyPayload, AxiosUserResponse, User } from '../types/user'; -import { IS_EDGE, IS_FIREFOX, generateProjectFromDevSites, isCodeReviewing } from '../utils'; +import { Heartbeat } from '../types/heartbeats'; import { getApiKey } from '../utils/apiKey'; import changeExtensionState from '../utils/changeExtensionState'; import contains from '../utils/contains'; -import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; +import { getLoggingType } from '../utils/logging'; class WakaTimeCore { tabsWithDevtoolsOpen: Tabs.Tab[]; + lastHeartbeat: Heartbeat | undefined; + lastHeartbeatSentAt = 0; db: IDBPDatabase | undefined; constructor() { this.tabsWithDevtoolsOpen = []; @@ -46,68 +48,57 @@ class WakaTimeCore { this.db = dbConnection; } - setTabsWithDevtoolsOpen(tabs: Tabs.Tab[]): void { - this.tabsWithDevtoolsOpen = tabs; + shouldSendHeartbeat(heartbeat: Heartbeat): boolean { + if (!this.lastHeartbeat) return true; + if (this.lastHeartbeat.entity !== heartbeat.entity) return true; + if (this.lastHeartbeatSentAt + 120000 < Date.now()) return true; + return false; } - async getTotalTimeLoggedToday(api_key = ''): Promise { - const items = await browser.storage.sync.get({ - apiUrl: config.apiUrl, - summariesApiEndPoint: config.summariesApiEndPoint, - }); - - const today = moment().format('YYYY-MM-DD'); - const summariesAxiosPayload: AxiosResponse = await axios.get( - `${items.apiUrl}${items.summariesApiEndPoint}`, - { - params: { - api_key, - end: today, - start: today, - }, - }, - ); - return summariesAxiosPayload.data.data[0].grand_total; - } - - /** - * Fetches the api token for logged users in wakatime website - * - * @returns {*} - */ - async fetchApiKey(): Promise { - try { - const items = await browser.storage.sync.get({ - apiUrl: config.apiUrl, - currentUserApiEndPoint: config.currentUserApiEndPoint, - }); - - const apiKeyResponse: AxiosResponse = await axios.post( - `${items.apiUrl}${items.currentUserApiEndPoint}/get_api_key`, - ); - return apiKeyResponse.data.data.api_key; - } catch (err: unknown) { - return ''; + async processHeartbeat(heartbeat: Heartbeat) { + const apiKey = await getApiKey(); + if (!apiKey) return changeExtensionState('notLogging'); + + if (!this.shouldSendHeartbeat(heartbeat)) return; + + if (items.loggingStyle == 'deny') { + if (!contains(url, items.denyList as string)) { + await this.sendHeartbeat( + { + branch: null, + hostname: items.hostname as string, + project, + url, + }, + apiKey, + payload, + ); + } else { + await changeExtensionState('ignored'); + console.log(`${url} is on denyList.`); + } + } else if (items.loggingStyle == 'allow') { + const heartbeat = this.getHeartbeat(url, items.allowList as string); + if (heartbeat.url) { + await this.sendHeartbeat( + { + ...heartbeat, + branch: null, + hostname: items.hostname as string, + project: heartbeat.project ?? project, + }, + apiKey, + payload, + ); + } else { + await changeExtensionState('ignored'); + console.log(`${url} is not on allowList.`); + } + } else { + throw Error(`Unknown logging styel: ${items.loggingStyle}`); } } - /** - * Checks if the user is logged in. - * - * @returns {*} - */ - async checkAuth(api_key = ''): Promise { - const items = await browser.storage.sync.get({ - apiUrl: config.apiUrl, - currentUserApiEndPoint: config.currentUserApiEndPoint, - }); - const userPayload: AxiosResponse = await axios.get( - `${items.apiUrl}${items.currentUserApiEndPoint}`, - { params: { api_key } }, - ); - return userPayload.data.data; - } - /** * Depending on various factors detects the current active tab URL or domain, * and sends it to WakaTime for logging. @@ -118,13 +109,13 @@ class WakaTimeCore { return changeExtensionState('notLogging'); } const items = await browser.storage.sync.get({ - blacklist: '', + allowList: '', + denyList: '', hostname: config.hostname, loggingEnabled: config.loggingEnabled, loggingStyle: config.loggingStyle, socialMediaSites: config.socialMediaSites, trackSocialMedia: config.trackSocialMedia, - whitelist: '', }); if (items.loggingEnabled === true) { await changeExtensionState('allGood'); @@ -159,12 +150,12 @@ class WakaTimeCore { const hostname = getDomain(url); if (!items.trackSocialMedia) { if ((items.socialMediaSites as string[]).includes(hostname)) { - return changeExtensionState('blacklisted'); + return changeExtensionState('ignored'); } } // Checks dev websites - const project = generateProjectFromDevSites(url, html); + const project = getHeartbeatFromPage(url, html); // Check if code reviewing const codeReviewing = isCodeReviewing(url); @@ -172,8 +163,8 @@ class WakaTimeCore { payload.category = 'code reviewing'; } - if (items.loggingStyle == 'blacklist') { - if (!contains(url, items.blacklist as string)) { + if (items.loggingStyle == 'deny') { + if (!contains(url, items.denyList as string)) { await this.sendHeartbeat( { branch: null, @@ -185,13 +176,11 @@ class WakaTimeCore { payload, ); } else { - await changeExtensionState('blacklisted'); - console.log(`${url} is on a blacklist.`); + await changeExtensionState('ignored'); + console.log(`${url} is on denyList.`); } - } - - if (items.loggingStyle == 'whitelist') { - const heartbeat = this.getHeartbeat(url, items.whitelist as string); + } else if (items.loggingStyle == 'allow') { + const heartbeat = this.getHeartbeat(url, items.allowList as string); if (heartbeat.url) { await this.sendHeartbeat( { @@ -204,9 +193,11 @@ class WakaTimeCore { payload, ); } else { - await changeExtensionState('whitelisted'); - console.log(`${url} is not on a whitelist.`); + await changeExtensionState('ignored'); + console.log(`${url} is not on allowList.`); } + } else { + throw Error(`Unknown logging styel: ${items.loggingStyle}`); } } } @@ -280,14 +271,14 @@ class WakaTimeCore { * @param debug */ async sendHeartbeat( - heartbeat: SendHeartbeat, + heartbeat: Heartbeat, apiKey: string, navigationPayload: Record, ): Promise { console.log('Sending Heartbeat', heartbeat); let payload; - const loggingType = await this.getLoggingType(); + const loggingType = await getLoggingType(); // Get only the domain from the entity. // And send that in heartbeat if (loggingType == 'domain') { @@ -310,20 +301,6 @@ class WakaTimeCore { } } - /** - * Returns a promise with logging type variable. - * - * @returns {*} - * @private - */ - async getLoggingType(): Promise { - const items = await browser.storage.sync.get({ - loggingType: config.loggingType, - }); - - return items.loggingType; - } - /** * Creates payload for the heartbeat and returns it as JSON. * @@ -333,8 +310,8 @@ class WakaTimeCore { * @returns {*} * @private */ - async preparePayload(heartbeat: SendHeartbeat, type: string): Promise> { - const os = await this.getOperatingSystem(); + async preparePayload(heartbeat: Heartbeat, type: string): Promise> { + const os = await getOperatingSystem(); let browserName = 'chrome'; let userAgent; if (IS_FIREFOX) { @@ -359,14 +336,6 @@ class WakaTimeCore { return payload; } - getOperatingSystem(): Promise { - return new Promise((resolve) => { - chrome.runtime.getPlatformInfo(function (info) { - resolve(`${info.os}_${info.arch}`); - }); - }); - } - /** * Sends AJAX request with payload to the heartbeat API as JSON. * diff --git a/src/html/options.html b/src/html/options.html index 81043e6..cf040be 100644 --- a/src/html/options.html +++ b/src/html/options.html @@ -4,7 +4,7 @@ - WakaTime options + WakaTime Options diff --git a/src/types/heartbeats.ts b/src/types/heartbeats.ts index 21fbac2..5ef38a6 100644 --- a/src/types/heartbeats.ts +++ b/src/types/heartbeats.ts @@ -1,37 +1,26 @@ -// Generated by https://quicktype.io - -export interface HeartBeatsPayload { - data: Datum[]; - end: string; - start: string; - timezone: string; +export interface Heartbeat { + branch?: string | null; + category?: Category | null; + entity: string; + entityType: EntityType; + language?: string | null; + project?: string | null; } -export interface Datum { - branch: string; - category: string; - created_at: string; - cursorpos: null; - dependencies: string; - entity: string; - id: string; - is_write: boolean; - language: string; - lineno: null; - lines: number; - machine_name_id: string; - project: string; - time: number; - type: string; - user_agent_id: string; - user_id: string; +export enum Category { + browsing = 'browsing', + code_reviewing = 'code reviewing', + coding = 'coding', + debugging = 'debugging', + designing = 'designing', + meeting = 'meeting', } -export interface SendHeartbeat { - branch?: string | null; - hostname: string; - project?: string | null; - url: string; +export enum EntityType { + app = 'app', + domain = 'domain', + file = 'file', + url = 'url', } export interface ProjectDetails { diff --git a/src/types/summaries.ts b/src/types/summaries.ts index 100569f..c711fa7 100644 --- a/src/types/summaries.ts +++ b/src/types/summaries.ts @@ -1,12 +1,10 @@ -// Generated by https://quicktype.io - -export interface SummariesPayload { - data: Datum[]; +export interface Summaries { + data: Summary[]; end: string; start: string; } -export interface Datum { +interface Summary { categories: Category[]; dependencies: Category[]; editors: Category[]; @@ -18,7 +16,7 @@ export interface Datum { range: Range; } -export interface Category { +interface Category { digital: string; hours: number; machine_name_id?: string; @@ -38,7 +36,7 @@ export interface GrandTotal { total_seconds: number; } -export interface Range { +interface Range { date: string; end: string; start: string; diff --git a/src/utils/changeExtensionState.ts b/src/utils/changeExtensionState.ts index cc40397..19c4aaa 100644 --- a/src/utils/changeExtensionState.ts +++ b/src/utils/changeExtensionState.ts @@ -20,13 +20,9 @@ export default async function changeExtensionState(state: ApiStates): Promise string | null; + +const GitHub: ProjectNameExtractor = (url: string, html: string): string | null => { + const { hostname } = new URL(url); + const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); + + if (match) { + if (hostname.endsWith('.com')) { + const root = parse(html); + const repoName = root + .querySelector('meta[name=octolytics-dimension-repository_nwo]') + ?.getAttribute('content'); + if (!repoName || repoName.split('/')[1] !== match[0]) { + return null; + } + } + return match[0]; + } + + return null; +}; + +const GitLab: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + const repoName = root.querySelector('body')?.getAttribute('data-project-full-path'); + if (!repoName || repoName.split('/')[1] !== match[0]) { + return null; + } + return match[0]; + } + + return null; +}; + +const BitBucket: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + // this regex extracts the project name from the title + // eg. title: jhondoe / my-test-repo — Bitbucket + const match2 = root.querySelector('title')?.textContent.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); + if (match2 && match2[0] === match[0]) { + return match[0]; + } + } + + return null; +}; + +const TravisCI: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + const projectName = root.querySelector('#ember737')?.textContent; + if (projectName === match[0]) { + return match[0]; + } + } + + return null; +}; + +const CircleCI: ProjectNameExtractor = (url: string, html: string): string | null => { + const projectPageMatch = url.match( + /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + + if (projectPageMatch) { + const root = parse(html); + const seconndBreadcrumbLabel = root.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', + )?.textContent; + const seconndBreadcrumbValue = root.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', + )?.textContent; + if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { + return projectPageMatch[0]; + } + } + + const settingsPageMatch = url.match( + /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + if (settingsPageMatch) { + const root = parse(html); + const pageTitle = root.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', + )?.textContent; + const pageSubtitle = root.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', + )?.textContent; + if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { + return settingsPageMatch[0]; + } + } + + return null; +}; + +const Vercel: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + // this regex extracts the project name from the title + // eg. title: test-website - Overview – Vercel + const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); + if (match2 && match2[0] === match[0]) { + return match[0]; + } + } + + return null; +}; + +const ProjectNameExtractors: ProjectNameExtractor[] = [ + GitHub, + GitLab, + BitBucket, + TravisCI, + CircleCI, + Vercel, +]; + +export const getHeartbeatFromPage = (): string | null => { + for (const projectNameExtractor of ProjectNameExtractors) { + const projectName = projectNameExtractor(url, html); + if (projectName) { + return projectName; + } + } + return null; +}; + +const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; + +export const isCodeReviewing = (url: string): boolean => { + for (const reg of CODE_REVIEW_URL_REG_LIST) { + if (url.match(reg)) { + return true; + } + } + return false; +}; + +export const getHtmlContentByTabId = async (tabId: number): Promise => { + const response = (await browser.tabs.sendMessage(tabId, { message: 'get_html' })) as { + html: string; + }; + return response.html; +}; diff --git a/src/utils/index.ts b/src/utils/index.ts index 0be4a51..cb3cbbe 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,148 +1,7 @@ -import { parse } from 'node-html-parser'; - export const IS_EDGE = navigator.userAgent.includes('Edg'); export const IS_FIREFOX = navigator.userAgent.includes('Firefox'); export const IS_CHROME = IS_EDGE === false && IS_FIREFOX === false; -type ProjectNameExtractor = (url: string, html: string) => string | null; - -const GitHub: ProjectNameExtractor = (url: string, html: string): string | null => { - const { hostname } = new URL(url); - const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); - - if (match) { - if (hostname.endsWith('.com')) { - const root = parse(html); - const repoName = root - .querySelector('meta[name=octolytics-dimension-repository_nwo]') - ?.getAttribute('content'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - } - return match[0]; - } - - return null; -}; - -const GitLab: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const repoName = root.querySelector('body')?.getAttribute('data-project-full-path'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - return match[0]; - } - - return null; -}; - -const BitBucket: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: jhondoe / my-test-repo — Bitbucket - const match2 = root.querySelector('title')?.textContent.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const TravisCI: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const projectName = root.querySelector('#ember737')?.textContent; - if (projectName === match[0]) { - return match[0]; - } - } - - return null; -}; - -const CircleCI: ProjectNameExtractor = (url: string, html: string): string | null => { - const projectPageMatch = url.match( - /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - - if (projectPageMatch) { - const root = parse(html); - const seconndBreadcrumbLabel = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', - )?.textContent; - const seconndBreadcrumbValue = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', - )?.textContent; - if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { - return projectPageMatch[0]; - } - } - - const settingsPageMatch = url.match( - /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - if (settingsPageMatch) { - const root = parse(html); - const pageTitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', - )?.textContent; - const pageSubtitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', - )?.textContent; - if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { - return settingsPageMatch[0]; - } - } - - return null; -}; - -const Vercel: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: test-website - Overview – Vercel - const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const ProjectNameExtractors: ProjectNameExtractor[] = [ - GitHub, - GitLab, - BitBucket, - TravisCI, - CircleCI, - Vercel, -]; - -export const generateProjectFromDevSites = (url: string, html: string): string | null => { - for (const projectNameExtractor of ProjectNameExtractors) { - const projectName = projectNameExtractor(url, html); - if (projectName) { - return projectName; - } - } - return null; -}; - const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; export const isCodeReviewing = (url: string): boolean => { @@ -154,9 +13,10 @@ export const isCodeReviewing = (url: string): boolean => { return false; }; -export const getHtmlContentByTabId = async (tabId: number): Promise => { - const response = (await browser.tabs.sendMessage(tabId, { message: 'get_html' })) as { - html: string; - }; - return response.html; +export const getOperatingSystem = (): Promise => { + return new Promise((resolve) => { + chrome.runtime.getPlatformInfo(function (info) { + resolve(`${info.os}_${info.arch}`); + }); + }); }; diff --git a/src/utils/logging.ts b/src/utils/logging.ts new file mode 100644 index 0000000..8340f2a --- /dev/null +++ b/src/utils/logging.ts @@ -0,0 +1,16 @@ +import browser from 'webextension-polyfill'; +import config from '../config/config'; + +/** + * Returns a promise with logging type variable. + * + * @returns {*} + * @private + */ +export const getLoggingType = async (): Promise => { + const items = await browser.storage.sync.get({ + loggingType: config.loggingType, + }); + + return items.loggingType; +}; diff --git a/src/utils/settings.ts b/src/utils/settings.ts new file mode 100644 index 0000000..95a0ea2 --- /dev/null +++ b/src/utils/settings.ts @@ -0,0 +1,71 @@ +import browser from 'webextension-polyfill'; +import config, { LoggingStyle, LoggingType, Theme } from '../config/config'; + +export interface Settings { + allowList: string[]; + apiKey: string; + apiUrl: string; + denyList: string[]; + hostname: string; + loggingStyle: LoggingStyle; + loggingType: LoggingType; + socialMediaSites: string[]; + theme: Theme; + trackSocialMedia: boolean; +} + +export const getSettings = async (): Promise => { + const settings = (await browser.storage.sync.get({ + allowList: [], + apiKey: config.apiKey, + apiUrl: config.apiUrl, + blacklist: null, + denyList: [], + hostname: config.hostname, + loggingStyle: config.loggingStyle, + loggingType: config.loggingType, + socialMediaSites: config.socialMediaSites, + theme: config.theme, + trackSocialMedia: true, + whitelist: null, + })) as Omit & { + blacklist?: string; + socialMediaSites: string[] | string; + whitelist?: string; + }; + + // backwards compatibility + if (typeof settings.whitelist === 'string') { + settings.allowList = settings.whitelist.trim().split('\n'); + await browser.storage.sync.set({ allowList: settings.allowList }); + await browser.storage.sync.remove('whitelist'); + } + if (typeof settings.blacklist === 'string') { + settings.denyList = settings.blacklist.trim().split('\n'); + await browser.storage.sync.set({ denyList: settings.denyList }); + await browser.storage.sync.remove('blacklist'); + } + if (typeof settings.socialMediaSites === 'string') { + settings.socialMediaSites = settings.socialMediaSites.trim().split('\n'); + await browser.storage.sync.set({ + socialMediaSites: settings.socialMediaSites, + }); + } + + return { + allowList: settings.allowList, + apiKey: settings.apiKey, + apiUrl: settings.apiUrl, + denyList: settings.denyList, + hostname: settings.hostname, + loggingStyle: settings.loggingStyle, + loggingType: settings.loggingType, + socialMediaSites: settings.socialMediaSites, + theme: settings.theme, + trackSocialMedia: settings.trackSocialMedia, + }; +}; + +export const saveSettings = async (settings: Settings): Promise => { + return browser.storage.sync.set(settings); +}; diff --git a/src/utils/user.ts b/src/utils/user.ts index 7ef7e55..c95c681 100644 --- a/src/utils/user.ts +++ b/src/utils/user.ts @@ -1,11 +1,31 @@ import { AnyAction, Dispatch } from '@reduxjs/toolkit'; +import axios, { AxiosResponse } from 'axios'; + +import moment from 'moment'; import config from '../config/config'; -import WakaTimeCore from '../core/WakaTimeCore'; import { setApiKey, setLoggingEnabled, setTotalTimeLoggedToday } from '../reducers/configReducer'; import { setUser } from '../reducers/currentUser'; -import { getHtmlContentByTabId } from '.'; +import { GrandTotal, Summaries } from '../types/summaries'; +import { ApiKeyPayload, AxiosUserResponse, User } from '../types/user'; import changeExtensionState from './changeExtensionState'; +/** + * Checks if the user is logged in. + * + * @returns {*} + */ +const checkAuth = async (api_key = ''): Promise => { + const items = await browser.storage.sync.get({ + apiUrl: config.apiUrl, + currentUserApiEndPoint: config.currentUserApiEndPoint, + }); + const userPayload: AxiosResponse = await axios.get( + `${items.apiUrl}${items.currentUserApiEndPoint}`, + { params: { api_key } }, + ); + return userPayload.data.data; +}; + export const logUserIn = async (apiKey: string): Promise => { if (!apiKey) { await changeExtensionState('notSignedIn'); @@ -13,7 +33,7 @@ export const logUserIn = async (apiKey: string): Promise => { } try { - await WakaTimeCore.checkAuth(apiKey); + await checkAuth(apiKey); const items = await browser.storage.sync.get({ loggingEnabled: config.loggingEnabled }); if (items.loggingEnabled === true) { @@ -26,6 +46,47 @@ export const logUserIn = async (apiKey: string): Promise => { } }; +/** + * Fetches the api token for logged users in wakatime website + * + * @returns {*} + */ +const fetchApiKey = async (): Promise => { + try { + const items = await browser.storage.sync.get({ + apiUrl: config.apiUrl, + currentUserApiEndPoint: config.currentUserApiEndPoint, + }); + + const apiKeyResponse: AxiosResponse = await axios.post( + `${items.apiUrl}${items.currentUserApiEndPoint}/get_api_key`, + ); + return apiKeyResponse.data.data.api_key; + } catch (err: unknown) { + return ''; + } +}; + +const getTotalTimeLoggedToday = async (api_key = ''): Promise => { + const items = await browser.storage.sync.get({ + apiUrl: config.apiUrl, + summariesApiEndPoint: config.summariesApiEndPoint, + }); + + const today = moment().format('YYYY-MM-DD'); + const summariesAxiosPayload: AxiosResponse = await axios.get( + `${items.apiUrl}${items.summariesApiEndPoint}`, + { + params: { + api_key, + end: today, + start: today, + }, + }, + ); + return summariesAxiosPayload.data.data[0].grand_total; +}; + export const fetchUserData = async ( apiKey: string, dispatch: Dispatch, @@ -36,7 +97,7 @@ export const fetchUserData = async ( }); apiKey = storage.apiKey as string; if (!apiKey) { - apiKey = await WakaTimeCore.fetchApiKey(); + apiKey = await fetchApiKey(); if (apiKey) { await browser.storage.sync.set({ apiKey }); } @@ -51,8 +112,8 @@ export const fetchUserData = async ( try { const [data, totalTimeLoggedTodayResponse, items] = await Promise.all([ - WakaTimeCore.checkAuth(apiKey), - WakaTimeCore.getTotalTimeLoggedToday(apiKey), + checkAuth(apiKey), + getTotalTimeLoggedToday(apiKey), browser.storage.sync.get({ loggingEnabled: config.loggingEnabled }), ]); dispatch(setUser(data)); @@ -65,21 +126,6 @@ export const fetchUserData = async ( dispatch(setLoggingEnabled(items.loggingEnabled as boolean)); dispatch(setTotalTimeLoggedToday(totalTimeLoggedTodayResponse.text)); - - const tabs = await browser.tabs.query({ - active: true, - currentWindow: true, - }); - let html = ''; - const tabId = tabs[0]?.id; - if (tabId) { - try { - html = await getHtmlContentByTabId(tabId); - // eslint-disable-next-line no-empty - } catch (error: unknown) {} - } - - await WakaTimeCore.recordHeartbeat(html); } catch (err: unknown) { await changeExtensionState('notSignedIn'); } diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index ad22454..f661eea 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -1,3 +1,5 @@ +import { getHeartbeatFromPage } from './utils/heartbeat'; + const oneMinute = 60000; const fiveMinutes = 300000; @@ -89,12 +91,8 @@ function debounce(func: () => void, timeout = oneMinute, maxWaitTime = fiveMinut } const sendHeartbeat = debounce(async () => { - const { hostname } = document.location; - - const projectDetails = getParser[hostname]?.(); - if (projectDetails) { - chrome.runtime.sendMessage({ projectDetails, recordHeartbeat: true }); - } + const heartbeat = getHeartbeatFromPage(); + chrome.runtime.sendMessage({ heartbeat: heartbeat, task: 'sendHeartbeat' }); }); chrome.runtime.onMessage.addListener((request: { message: string }, sender, sendResponse) => { diff --git a/tests/utils/contains.spec.ts b/tests/utils/contains.spec.ts index b319869..926e78a 100644 --- a/tests/utils/contains.spec.ts +++ b/tests/utils/contains.spec.ts @@ -8,14 +8,14 @@ describe('contains', function () { expect(contains).to.be.a('function'); }); - it('should match url against blacklist and return true', function () { + it('should match url against denyList and return true', function () { const list = 'localhost\ntest.com'; const url = 'http://localhost/fooapp'; expect(contains(url, list)).to.equal(true); }); - it('should not match url against blacklist and return false', function () { + it('should not match url against denyList and return false', function () { const list = 'localhost2\ntest.com'; const url = 'http://localhost/fooapp'; From d34c8ca347370a0210fd659851382cf7c18497f7 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 14:48:22 +0200 Subject: [PATCH 07/18] half way through refactor --- src/components/MainList.tsx | 2 +- src/components/Options.tsx | 4 + src/components/WakaTime.tsx | 8 +- src/config/config.ts | 4 +- src/core/WakaTimeCore.ts | 111 +++++++++------- src/utils/changeExtensionIcon.ts | 30 ----- src/utils/changeExtensionState.ts | 31 ----- src/utils/changeExtensionStatus.ts | 76 +++++++++++ src/utils/changeExtensionTooltip.ts | 22 ---- src/utils/settings.ts | 6 +- src/utils/sites.ts | 158 +++++++++++++++++++++++ src/utils/user.ts | 2 +- tests/utils/changeExtensionState.spec.ts | 2 +- 13 files changed, 313 insertions(+), 143 deletions(-) delete mode 100644 src/utils/changeExtensionIcon.ts delete mode 100644 src/utils/changeExtensionState.ts create mode 100644 src/utils/changeExtensionStatus.ts delete mode 100644 src/utils/changeExtensionTooltip.ts create mode 100644 src/utils/sites.ts diff --git a/src/components/MainList.tsx b/src/components/MainList.tsx index 2f447d8..92ba5e4 100644 --- a/src/components/MainList.tsx +++ b/src/components/MainList.tsx @@ -4,7 +4,7 @@ import { configLogout, setLoggingEnabled } from '../reducers/configReducer'; import { userLogout } from '../reducers/currentUser'; import { ReduxSelector } from '../types/store'; import { User } from '../types/user'; -import changeExtensionState from '../utils/changeExtensionState'; +import changeExtensionState from '../utils/changeExtensionStatus'; export interface MainListProps { loggingEnabled: boolean; diff --git a/src/components/Options.tsx b/src/components/Options.tsx index 414c32e..15de2ca 100644 --- a/src/components/Options.tsx +++ b/src/components/Options.tsx @@ -20,8 +20,10 @@ export default function Options(): JSX.Element { apiKey: '', apiUrl: config.apiUrl, denyList: [], + extensionStatus: 'allGood', hostname: '', loading: false, + loggingEnabled: true, loggingStyle: config.loggingStyle, loggingType: config.loggingType, socialMediaSites: config.socialMediaSites, @@ -54,7 +56,9 @@ export default function Options(): JSX.Element { apiKey: state.apiKey, apiUrl: state.apiUrl, denyList: state.denyList, + extensionStatus: state.extensionStatus, hostname: state.hostname, + loggingEnabled: state.loggingEnabled, loggingStyle: state.loggingStyle, loggingType: state.loggingType, socialMediaSites: state.socialMediaSites, diff --git a/src/components/WakaTime.tsx b/src/components/WakaTime.tsx index 23010e7..ff30c79 100644 --- a/src/components/WakaTime.tsx +++ b/src/components/WakaTime.tsx @@ -10,7 +10,7 @@ import NavBar from './NavBar'; export default function WakaTime(): JSX.Element { const dispatch = useDispatch(); - const [extensionState, setExtensionState] = useState(''); + const [extensionStatus, setExtensionStatus] = useState(''); const { apiKey: apiKeyFromRedux, @@ -21,8 +21,8 @@ export default function WakaTime(): JSX.Element { useEffect(() => { const fetchData = async () => { await fetchUserData(apiKeyFromRedux, dispatch); - const items = await browser.storage.sync.get({ extensionState: '' }); - setExtensionState(items.extensionState as string); + const items = await browser.storage.sync.get({ extensionStatus: '' }); + setExtensionStatus(items.extensionStatus as string); }; void fetchData(); }, []); @@ -32,7 +32,7 @@ export default function WakaTime(): JSX.Element { return (
- {isApiKeyValid && extensionState === 'notSignedIn' && ( + {isApiKeyValid && extensionStatus === 'notSignedIn' && ( { + const re = new RegExp(pattern.replace(/\*/g, '.*')); + return re.test(domain); + }) !== undefined + ) { + return false; + } + } + + if (settings.loggingStyle === 'deny') { + return ( + settings.denyList.find((pattern) => { + const re = new RegExp(pattern.replace(/\*/g, '.*')); + return re.test(url); + }) == undefined + ); + } + return ( + settings.allowList.find((pattern) => { + const re = new RegExp(pattern.replace(/\*/g, '.*')); + return re.test(url); + }) !== undefined + ); + } + + async handleActivity(url: string, heartbeat: Heartbeat) { + const settings = await getSettings(); + if (!settings.loggingEnabled) { + await changeExtensionStatus('notLogging'); + return; + } if (!this.shouldSendHeartbeat(heartbeat)) return; - if (items.loggingStyle == 'deny') { - if (!contains(url, items.denyList as string)) { - await this.sendHeartbeat( - { - branch: null, - hostname: items.hostname as string, - project, - url, - }, - apiKey, - payload, - ); - } else { - await changeExtensionState('ignored'); - console.log(`${url} is on denyList.`); - } - } else if (items.loggingStyle == 'allow') { - const heartbeat = this.getHeartbeat(url, items.allowList as string); - if (heartbeat.url) { - await this.sendHeartbeat( - { - ...heartbeat, - branch: null, - hostname: items.hostname as string, - project: heartbeat.project ?? project, - }, - apiKey, - payload, - ); - } else { - await changeExtensionState('ignored'); - console.log(`${url} is not on allowList.`); + if (!this.canSendHeartbeat(url, settings)) { + await changeExtensionStatus('ignored'); + return; + } + + if (this.db) { + // append heartbeat to queue + await this.db.add('cacheHeartbeats', heartbeat); + + if (settings.extensionStatus !== 'notSignedIn') { + await changeExtensionStatus('allGood'); } - } else { - throw Error(`Unknown logging styel: ${items.loggingStyle}`); } } @@ -106,7 +117,7 @@ class WakaTimeCore { async recordHeartbeat(html: string, payload: Record = {}): Promise { const apiKey = await getApiKey(); if (!apiKey) { - return changeExtensionState('notLogging'); + return changeExtensionStatus('notLogging'); } const items = await browser.storage.sync.get({ allowList: '', @@ -118,14 +129,14 @@ class WakaTimeCore { trackSocialMedia: config.trackSocialMedia, }); if (items.loggingEnabled === true) { - await changeExtensionState('allGood'); + await changeExtensionStatus('allGood'); let newState = ''; // Detects we are running this code in the extension scope if (browser.idle as browser.Idle.Static | undefined) { newState = await browser.idle.queryState(config.detectionIntervalInSeconds); if (newState !== 'active') { - return changeExtensionState('notLogging'); + return changeExtensionStatus('notLogging'); } } @@ -150,7 +161,7 @@ class WakaTimeCore { const hostname = getDomain(url); if (!items.trackSocialMedia) { if ((items.socialMediaSites as string[]).includes(hostname)) { - return changeExtensionState('ignored'); + return changeExtensionStatus('ignored'); } } @@ -176,7 +187,7 @@ class WakaTimeCore { payload, ); } else { - await changeExtensionState('ignored'); + await changeExtensionStatus('ignored'); console.log(`${url} is on denyList.`); } } else if (items.loggingStyle == 'allow') { @@ -193,7 +204,7 @@ class WakaTimeCore { payload, ); } else { - await changeExtensionState('ignored'); + await changeExtensionStatus('ignored'); console.log(`${url} is not on allowList.`); } } else { @@ -374,7 +385,7 @@ class WakaTimeCore { await this.db.add('cacheHeartbeats', payload); } - await changeExtensionState('notSignedIn'); + await changeExtensionStatus('notSignedIn'); } } @@ -385,7 +396,7 @@ class WakaTimeCore { async sendCachedHeartbeatsRequest(): Promise { const apiKey = await getApiKey(); if (!apiKey) { - return changeExtensionState('notLogging'); + return changeExtensionStatus('notLogging'); } if (this.db) { diff --git a/src/utils/changeExtensionIcon.ts b/src/utils/changeExtensionIcon.ts deleted file mode 100644 index 2821908..0000000 --- a/src/utils/changeExtensionIcon.ts +++ /dev/null @@ -1,30 +0,0 @@ -import browser from 'webextension-polyfill'; -import config from '../config/config'; -import { IS_FIREFOX } from '.'; - -type ColorIconTypes = 'gray' | 'red' | 'white' | ''; - -/** - * It changes the extension icon color. - */ -export default async function changeExtensionIcon(color?: ColorIconTypes): Promise { - let path; - if (color) { - path = `./graphics/wakatime-logo-38-${color}.png`; - } else { - const { theme } = await browser.storage.sync.get({ - theme: config.theme, - }); - path = - theme === config.theme - ? './graphics/wakatime-logo-38.png' - : './graphics/wakatime-logo-38-white.png'; - } - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (IS_FIREFOX && browser.browserAction) { - await browser.browserAction.setIcon({ path: path }); // Support for FF with manifest V2 - } else if ((browser.action as browser.Action.Static | undefined) !== undefined) { - await browser.action.setIcon({ path: path }); // Support for Chrome with manifest V3 - } -} diff --git a/src/utils/changeExtensionState.ts b/src/utils/changeExtensionState.ts deleted file mode 100644 index 19c4aaa..0000000 --- a/src/utils/changeExtensionState.ts +++ /dev/null @@ -1,31 +0,0 @@ -import browser from 'webextension-polyfill'; -import config, { ApiStates } from '../config/config'; -import changeExtensionIcon from './changeExtensionIcon'; -import changeExtensionTooltip from './changeExtensionTooltip'; - -/** - * Sets the current state of the extension. - */ -export default async function changeExtensionState(state: ApiStates): Promise { - switch (state) { - case 'allGood': - await changeExtensionIcon(config.colors.allGood); - await changeExtensionTooltip(config.tooltips.allGood); - break; - case 'notLogging': - await changeExtensionIcon(config.colors.notLogging); - await changeExtensionTooltip(config.tooltips.notLogging); - break; - case 'notSignedIn': - await changeExtensionIcon(config.colors.notSignedIn); - await changeExtensionTooltip(config.tooltips.notSignedIn); - break; - case 'ignored': - await changeExtensionIcon(config.colors.notLogging); - await changeExtensionTooltip(config.tooltips.ignored); - break; - default: - break; - } - await browser.storage.sync.set({ extensionState: state }); -} diff --git a/src/utils/changeExtensionStatus.ts b/src/utils/changeExtensionStatus.ts new file mode 100644 index 0000000..8ffd9e1 --- /dev/null +++ b/src/utils/changeExtensionStatus.ts @@ -0,0 +1,76 @@ +import browser from 'webextension-polyfill'; +import config, { ExtensionStatus } from '../config/config'; +import { IS_FIREFOX } from '.'; + +type ColorIconTypes = 'gray' | 'red' | 'white' | ''; + +/** + * Sets status of the extension. + */ +export async function changeExtensionStatus(status: ExtensionStatus): Promise { + switch (status) { + case 'allGood': + await changeExtensionIcon(config.colors.allGood); + await changeExtensionTooltip(config.tooltips.allGood); + break; + case 'notLogging': + await changeExtensionIcon(config.colors.notLogging); + await changeExtensionTooltip(config.tooltips.notLogging); + break; + case 'notSignedIn': + await changeExtensionIcon(config.colors.notSignedIn); + await changeExtensionTooltip(config.tooltips.notSignedIn); + break; + case 'ignored': + await changeExtensionIcon(config.colors.notLogging); + await changeExtensionTooltip(config.tooltips.ignored); + break; + default: + break; + } + await browser.storage.sync.set({ extensionStatus: status }); +} + +/** + * Changes the extension icon color. + */ +export async function changeExtensionIcon(color?: ColorIconTypes): Promise { + let path; + if (color) { + path = `./graphics/wakatime-logo-38-${color}.png`; + } else { + const { theme } = await browser.storage.sync.get({ + theme: config.theme, + }); + path = + theme === config.theme + ? './graphics/wakatime-logo-38.png' + : './graphics/wakatime-logo-38-white.png'; + } + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (IS_FIREFOX && browser.browserAction) { + await browser.browserAction.setIcon({ path: path }); // Support for FF with manifest V2 + } else if ((browser.action as browser.Action.Static | undefined) !== undefined) { + await browser.action.setIcon({ path: path }); // Support for Chrome with manifest V3 + } +} + +/** + * It changes the extension title + * + */ +export default async function changeExtensionTooltip(text: string): Promise { + if (text === '') { + text = config.name; + } else { + text = `${config.name} - ${text}`; + } + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (IS_FIREFOX && browser.browserAction) { + await browser.browserAction.setTitle({ title: text }); // Support for FF with manifest V2 + } else if ((browser.action as browser.Action.Static | undefined) !== undefined) { + await browser.action.setTitle({ title: text }); // Support for Chrome with manifest V3 + } +} diff --git a/src/utils/changeExtensionTooltip.ts b/src/utils/changeExtensionTooltip.ts deleted file mode 100644 index e9e3187..0000000 --- a/src/utils/changeExtensionTooltip.ts +++ /dev/null @@ -1,22 +0,0 @@ -import browser from 'webextension-polyfill'; -import config from '../config/config'; -import { IS_FIREFOX } from '.'; - -/** - * It changes the extension title - * - */ -export default async function changeExtensionTooltip(text: string): Promise { - if (text === '') { - text = config.name; - } else { - text = `${config.name} - ${text}`; - } - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (IS_FIREFOX && browser.browserAction) { - await browser.browserAction.setTitle({ title: text }); // Support for FF with manifest V2 - } else if ((browser.action as browser.Action.Static | undefined) !== undefined) { - await browser.action.setTitle({ title: text }); // Support for Chrome with manifest V3 - } -} diff --git a/src/utils/settings.ts b/src/utils/settings.ts index 95a0ea2..ccef201 100644 --- a/src/utils/settings.ts +++ b/src/utils/settings.ts @@ -1,12 +1,14 @@ import browser from 'webextension-polyfill'; -import config, { LoggingStyle, LoggingType, Theme } from '../config/config'; +import config, { ExtensionStatus, LoggingStyle, LoggingType, Theme } from '../config/config'; export interface Settings { allowList: string[]; apiKey: string; apiUrl: string; denyList: string[]; + extensionStatus: ExtensionStatus; hostname: string; + loggingEnabled: boolean; loggingStyle: LoggingStyle; loggingType: LoggingType; socialMediaSites: string[]; @@ -57,7 +59,9 @@ export const getSettings = async (): Promise => { apiKey: settings.apiKey, apiUrl: settings.apiUrl, denyList: settings.denyList, + extensionStatus: settings.extensionStatus, hostname: settings.hostname, + loggingEnabled: settings.loggingEnabled, loggingStyle: settings.loggingStyle, loggingType: settings.loggingType, socialMediaSites: settings.socialMediaSites, diff --git a/src/utils/sites.ts b/src/utils/sites.ts new file mode 100644 index 0000000..d383015 --- /dev/null +++ b/src/utils/sites.ts @@ -0,0 +1,158 @@ +import { parse } from 'node-html-parser'; + +type ProjectNameExtractor = (url: string, html: string) => string | null; + +const GitHub: ProjectNameExtractor = (url: string, html: string): string | null => { + const { hostname } = new URL(url); + const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); + + if (match) { + if (hostname.endsWith('.com')) { + const root = parse(html); + const repoName = root + .querySelector('meta[name=octolytics-dimension-repository_nwo]') + ?.getAttribute('content'); + if (!repoName || repoName.split('/')[1] !== match[0]) { + return null; + } + } + return match[0]; + } + + return null; +}; + +const GitLab: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + const repoName = root.querySelector('body')?.getAttribute('data-project-full-path'); + if (!repoName || repoName.split('/')[1] !== match[0]) { + return null; + } + return match[0]; + } + + return null; +}; + +const BitBucket: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + // this regex extracts the project name from the title + // eg. title: jhondoe / my-test-repo — Bitbucket + const match2 = root.querySelector('title')?.textContent.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); + if (match2 && match2[0] === match[0]) { + return match[0]; + } + } + + return null; +}; + +const TravisCI: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + const projectName = root.querySelector('#ember737')?.textContent; + if (projectName === match[0]) { + return match[0]; + } + } + + return null; +}; + +const CircleCI: ProjectNameExtractor = (url: string, html: string): string | null => { + const projectPageMatch = url.match( + /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + + if (projectPageMatch) { + const root = parse(html); + const seconndBreadcrumbLabel = root.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', + )?.textContent; + const seconndBreadcrumbValue = root.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', + )?.textContent; + if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { + return projectPageMatch[0]; + } + } + + const settingsPageMatch = url.match( + /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + if (settingsPageMatch) { + const root = parse(html); + const pageTitle = root.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', + )?.textContent; + const pageSubtitle = root.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', + )?.textContent; + if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { + return settingsPageMatch[0]; + } + } + + return null; +}; + +const Vercel: ProjectNameExtractor = (url: string, html: string): string | null => { + const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + // this regex extracts the project name from the title + // eg. title: test-website - Overview – Vercel + const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); + if (match2 && match2[0] === match[0]) { + return match[0]; + } + } + + return null; +}; + +const ProjectNameExtractors: ProjectNameExtractor[] = [ + GitHub, + GitLab, + BitBucket, + TravisCI, + CircleCI, + Vercel, +]; + +export const getHeartbeatFromPage = (): string | null => { + for (const projectNameExtractor of ProjectNameExtractors) { + const projectName = projectNameExtractor(url, html); + if (projectName) { + return projectName; + } + } + return null; +}; + +const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; + +export const isCodeReviewing = (url: string): boolean => { + for (const reg of CODE_REVIEW_URL_REG_LIST) { + if (url.match(reg)) { + return true; + } + } + return false; +}; + +export const getHtmlContentByTabId = async (tabId: number): Promise => { + const response = (await browser.tabs.sendMessage(tabId, { message: 'get_html' })) as { + html: string; + }; + return response.html; +}; diff --git a/src/utils/user.ts b/src/utils/user.ts index c95c681..29857aa 100644 --- a/src/utils/user.ts +++ b/src/utils/user.ts @@ -7,7 +7,7 @@ import { setApiKey, setLoggingEnabled, setTotalTimeLoggedToday } from '../reduce import { setUser } from '../reducers/currentUser'; import { GrandTotal, Summaries } from '../types/summaries'; import { ApiKeyPayload, AxiosUserResponse, User } from '../types/user'; -import changeExtensionState from './changeExtensionState'; +import changeExtensionState from './changeExtensionStatus'; /** * Checks if the user is logged in. diff --git a/tests/utils/changeExtensionState.spec.ts b/tests/utils/changeExtensionState.spec.ts index 17b3340..d829143 100644 --- a/tests/utils/changeExtensionState.spec.ts +++ b/tests/utils/changeExtensionState.spec.ts @@ -1,5 +1,5 @@ import chai from 'chai'; -import changeExtensionState from '../../src/utils/changeExtensionState'; +import changeExtensionState from '../../src/utils/changeExtensionStatus'; const expect = chai.expect; From d66b1b55ba49855b64cc2447cb31f625867ef0d0 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 14:50:15 +0200 Subject: [PATCH 08/18] keep extension icon status correct --- src/core/WakaTimeCore.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index 48a442f..3819ad9 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -93,21 +93,19 @@ class WakaTimeCore { return; } - if (!this.shouldSendHeartbeat(heartbeat)) return; - if (!this.canSendHeartbeat(url, settings)) { await changeExtensionStatus('ignored'); return; } - if (this.db) { - // append heartbeat to queue - await this.db.add('cacheHeartbeats', heartbeat); - - if (settings.extensionStatus !== 'notSignedIn') { - await changeExtensionStatus('allGood'); - } + if (settings.extensionStatus !== 'notSignedIn') { + await changeExtensionStatus('allGood'); } + + if (!this.shouldSendHeartbeat(heartbeat)) return; + + // append heartbeat to queue + await this.db?.add('cacheHeartbeats', heartbeat); } /** From 115789dc6ea3bfe80955219e2df0718b45276d71 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 16:35:35 +0200 Subject: [PATCH 09/18] over the hump --- src/background.ts | 38 +- src/core/WakaTimeCore.ts | 198 +- src/types/heartbeats.ts | 5 - src/types/sites.ts | 50 + src/utils/heartbeat.ts | 120 +- src/utils/sites.ts | 158 - src/utils/stackexchange-sites.ts | 11605 +++++++++++++++++++++++++++++ src/wakatimeScript.ts | 33 +- 8 files changed, 11814 insertions(+), 393 deletions(-) create mode 100644 src/types/sites.ts delete mode 100644 src/utils/sites.ts create mode 100644 src/utils/stackexchange-sites.ts diff --git a/src/background.ts b/src/background.ts index 16b7e4b..d357d63 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,7 +1,5 @@ import browser from 'webextension-polyfill'; import WakaTimeCore from './core/WakaTimeCore'; -import { PostHeartbeatMessage } from './types/heartbeats'; -import { getHtmlContentByTabId } from './utils'; // Add a listener to resolve alarms browser.alarms.onAlarm.addListener(async (alarm) => { @@ -24,13 +22,7 @@ browser.alarms.create('heartbeatAlarm', { periodInMinutes: 2 }); * Whenever a active tab is changed it records a heartbeat with that tab url. */ browser.tabs.onActivated.addListener(async (activeInfo) => { - console.log('recording a heartbeat - active tab changed'); - let html = ''; - try { - html = await getHtmlContentByTabId(activeInfo.tabId); - // eslint-disable-next-line no-empty - } catch (error: unknown) {} - await WakaTimeCore.recordHeartbeat(html); + await WakaTimeCore.handleActivity(activeInfo.tabId); }); /** @@ -44,15 +36,10 @@ browser.windows.onFocusChanged.addListener(async (windowId) => { currentWindow: true, }); - let html = ''; const tabId = tabs[0]?.id; if (tabId) { - try { - html = await getHtmlContentByTabId(tabId); - // eslint-disable-next-line no-empty - } catch (error: unknown) {} + await WakaTimeCore.handleActivity(tabId); } - await WakaTimeCore.recordHeartbeat(html); } }); @@ -69,12 +56,7 @@ browser.tabs.onUpdated.addListener(async (tabId, changeInfo) => { }); // If tab updated is the same as active tab if (tabId == tabs[0]?.id) { - let html = ''; - try { - html = await getHtmlContentByTabId(tabId); - // eslint-disable-next-line no-empty - } catch (error: unknown) {} - await WakaTimeCore.recordHeartbeat(html); + await WakaTimeCore.handleActivity(tabs[0].id); } } }); @@ -87,16 +69,10 @@ self.addEventListener('activate', async () => { await WakaTimeCore.createDB(); }); -browser.runtime.onMessage.addListener(async (request: PostHeartbeatMessage, sender) => { - if (request.recordHeartbeat === true) { - if (sender.tab?.id) { - let html = ''; - try { - html = await getHtmlContentByTabId(sender.tab.id); - // eslint-disable-next-line no-empty - } catch (error: unknown) {} - await WakaTimeCore.recordHeartbeat(html, request.projectDetails); - } +browser.runtime.onMessage.addListener(async (request: { task: string }, sender) => { + if (request.task === 'handleActivity') { + if (!sender.tab?.id) return; + await WakaTimeCore.handleActivity(sender.tab.id); } }); diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index 3819ad9..fab016a 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -3,16 +3,15 @@ import browser, { Tabs } from 'webextension-polyfill'; /* eslint-disable no-fallthrough */ /* eslint-disable default-case */ import moment from 'moment'; -import { getOperatingSystem, isCodeReviewing } from '../utils'; +import { SiteInfo } from 'src/types/sites'; +import { getOperatingSystem } from '../utils'; import { changeExtensionStatus } from '../utils/changeExtensionStatus'; import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; import { getSettings, Settings } from '../utils/settings'; import config, { ExtensionStatus } from '../config/config'; -import { Heartbeat } from '../types/heartbeats'; +import { EntityType, Heartbeat } from '../types/heartbeats'; import { getApiKey } from '../utils/apiKey'; -import contains from '../utils/contains'; -import { getHeartbeatFromPage } from '../utils/heartbeat'; import { getLoggingType } from '../utils/logging'; class WakaTimeCore { @@ -58,6 +57,13 @@ class WakaTimeCore { } canSendHeartbeat(url: string, settings: Settings): boolean { + for (const site of config.nonTrackableSites) { + if (url.startsWith(site)) { + // Don't send a heartbeat on sites like 'chrome://newtab/' or 'about:newtab' + return false; + } + } + if (!settings.trackSocialMedia) { const domain = getDomain(url); if ( @@ -86,13 +92,18 @@ class WakaTimeCore { ); } - async handleActivity(url: string, heartbeat: Heartbeat) { + async handleActivity(tabId: number) { const settings = await getSettings(); if (!settings.loggingEnabled) { await changeExtensionStatus('notLogging'); return; } + const activeTab = await this.getCurrentTab(tabId); + if (!activeTab) return; + + const url = activeTab.url as string; + if (!this.canSendHeartbeat(url, settings)) { await changeExtensionStatus('ignored'); return; @@ -102,173 +113,44 @@ class WakaTimeCore { await changeExtensionStatus('allGood'); } + const heartbeat = await this.buildHeartbeat(url, settings, activeTab); + if (!this.shouldSendHeartbeat(heartbeat)) return; // append heartbeat to queue await this.db?.add('cacheHeartbeats', heartbeat); } - /** - * Depending on various factors detects the current active tab URL or domain, - * and sends it to WakaTime for logging. - */ - async recordHeartbeat(html: string, payload: Record = {}): Promise { - const apiKey = await getApiKey(); - if (!apiKey) { - return changeExtensionStatus('notLogging'); - } - const items = await browser.storage.sync.get({ - allowList: '', - denyList: '', - hostname: config.hostname, - loggingEnabled: config.loggingEnabled, - loggingStyle: config.loggingStyle, - socialMediaSites: config.socialMediaSites, - trackSocialMedia: config.trackSocialMedia, + async getCurrentTab(tabId: number): Promise { + const tabs: browser.Tabs.Tab[] = await browser.tabs.query({ + active: true, + currentWindow: true, }); - if (items.loggingEnabled === true) { - await changeExtensionStatus('allGood'); - - let newState = ''; - // Detects we are running this code in the extension scope - if (browser.idle as browser.Idle.Static | undefined) { - newState = await browser.idle.queryState(config.detectionIntervalInSeconds); - if (newState !== 'active') { - return changeExtensionStatus('notLogging'); - } - } - - // Get current tab URL. - let url = ''; - if (browser.tabs as browser.Tabs.Static | undefined) { - const tabs = await browser.tabs.query({ active: true, currentWindow: true }); - if (tabs.length == 0) return; - const currentActiveTab = tabs[0]; - url = currentActiveTab.url as string; - } else { - url = document.URL; - } - - for (const site of config.nonTrackableSites) { - if (url.startsWith(site)) { - // Don't send a heartbeat on sites like 'chrome://newtab/' or 'about:newtab' - return; - } - } + const activeTab = tabs[0]; + if (tabId !== activeTab.id) return; - const hostname = getDomain(url); - if (!items.trackSocialMedia) { - if ((items.socialMediaSites as string[]).includes(hostname)) { - return changeExtensionStatus('ignored'); - } - } - - // Checks dev websites - const project = getHeartbeatFromPage(url, html); - - // Check if code reviewing - const codeReviewing = isCodeReviewing(url); - if (codeReviewing) { - payload.category = 'code reviewing'; - } - - if (items.loggingStyle == 'deny') { - if (!contains(url, items.denyList as string)) { - await this.sendHeartbeat( - { - branch: null, - hostname: items.hostname as string, - project, - url, - }, - apiKey, - payload, - ); - } else { - await changeExtensionStatus('ignored'); - console.log(`${url} is on denyList.`); - } - } else if (items.loggingStyle == 'allow') { - const heartbeat = this.getHeartbeat(url, items.allowList as string); - if (heartbeat.url) { - await this.sendHeartbeat( - { - ...heartbeat, - branch: null, - hostname: items.hostname as string, - project: heartbeat.project ?? project, - }, - apiKey, - payload, - ); - } else { - await changeExtensionStatus('ignored'); - console.log(`${url} is not on allowList.`); - } - } else { - throw Error(`Unknown logging styel: ${items.loggingStyle}`); - } - } + return activeTab; } - /** - * Creates an array from list using \n as delimiter - * and checks if any element in list is contained in the url. - * Also checks if element is assigned to a project using @@ as delimiter - * - * @param url - * @param list - * @returns {object} - */ - getHeartbeat(url: string, list: string) { - const projectIndicatorCharacters = '@@'; - - const lines = list.split('\n'); - for (let i = 0; i < lines.length; i++) { - // strip (http:// or https://) and trailing (`/` or `@@`) - const cleanLine = lines[i] - .trim() - .replace(/(\/|@@)$/, '') - .replace(/^(?:https?:\/\/)?/i, ''); - if (cleanLine === '') continue; - - const projectIndicatorIndex = cleanLine.lastIndexOf(projectIndicatorCharacters); - const projectIndicatorExists = projectIndicatorIndex > -1; - let projectName = null; - let urlFromLine = cleanLine; - if (projectIndicatorExists) { - const start = projectIndicatorIndex + projectIndicatorCharacters.length; - projectName = cleanLine.substring(start); - urlFromLine = cleanLine - .replace(cleanLine.substring(projectIndicatorIndex), '') - .replace(/\/$/, ''); - } - const cleanUrl = url - .trim() - .replace(/(\/|@@)$/, '') - .replace(/^(?:https?:\/\/)?/i, ''); - const startsWithUrl = cleanUrl.toLowerCase().includes(urlFromLine.toLowerCase()); - if (startsWithUrl) { - return { - project: projectName, - url, - }; - } - - const lineRe = new RegExp(cleanLine.replace('.', '.').replace('*', '.*')); + async buildHeartbeat(url: string, settings: Settings, tab: browser.Tabs.Tab): Promise { + if (!tab.id) { + throw Error('Missing tab id.'); + } - // If url matches the current line return true - if (lineRe.test(url)) { - return { - project: null, - url, - }; + const heartbeat = ( + (await browser.tabs.sendMessage(tab.id, { task: 'getHeartbeatFromPage', url })) as { + heartbeat?: SiteInfo; } - } + ).heartbeat; + const entity = settings.loggingType === 'domain' ? getDomainFromUrl(url) : url; return { - project: null, - url: null, + branch: heartbeat?.branch, + category: heartbeat?.category, + entity: heartbeat?.entity ?? entity, + entityType: heartbeat?.entityType ?? (settings.loggingType as EntityType), + language: heartbeat?.language, + project: heartbeat?.project, }; } diff --git a/src/types/heartbeats.ts b/src/types/heartbeats.ts index 5ef38a6..e39e6c9 100644 --- a/src/types/heartbeats.ts +++ b/src/types/heartbeats.ts @@ -30,8 +30,3 @@ export interface ProjectDetails { language: string; project: string; } - -export interface PostHeartbeatMessage { - projectDetails?: ProjectDetails; - recordHeartbeat: boolean; -} diff --git a/src/types/sites.ts b/src/types/sites.ts new file mode 100644 index 0000000..a2d2cb1 --- /dev/null +++ b/src/types/sites.ts @@ -0,0 +1,50 @@ +import { Category, EntityType } from './heartbeats'; + +export enum KnownSite { + bitbucket = 'bitbucket', + canva = 'canva', + circleci = 'circleci', + figma = 'figma', + github = 'github', + gitlab = 'gitlab', + googlemeet = 'googlemeet', + stackoverflow = 'stackoverflow', + travisci = 'travisci', + vercel = 'vercel', + zoom = 'zoom', +} + +export interface SiteInfo { + branch?: string | null; + category?: Category | null; + entity?: string; + entityType?: EntityType; + language?: string | null; + project?: string | null; +} + +export type HeartbeatParser = (url: string) => SiteInfo | undefined; + +export interface SiteParser { + parser: HeartbeatParser; + urls: RegExp[] | string[]; +} + +export type StackExchangeSiteState = 'linked_meta' | 'normal' | 'open_beta'; + +export type StackExchangeSiteType = 'main_site' | 'meta_site'; + +export type StackExchangeSite = { + aliases?: string[]; + api_site_parameter: string; + audience?: string; + favicon_url: string; + high_resolution_icon_url: string; + icon_url: string; + launch_date?: number; + logo_url: string; + name: string; + site_state: StackExchangeSiteState; + site_type: StackExchangeSiteType; + site_url: string; +}; diff --git a/src/utils/heartbeat.ts b/src/utils/heartbeat.ts index d383015..d4b0f79 100644 --- a/src/utils/heartbeat.ts +++ b/src/utils/heartbeat.ts @@ -1,8 +1,7 @@ -import { parse } from 'node-html-parser'; +import { HeartbeatParser, KnownSite, SiteParser, StackExchangeSite } from '../types/sites'; +import { STACKEXCHANGE_SITES } from './stackexchange-sites'; -type ProjectNameExtractor = (url: string, html: string) => string | null; - -const GitHub: ProjectNameExtractor = (url: string, html: string): string | null => { +const GitHub: HeartbeatParser = (url: string) => { const { hostname } = new URL(url); const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); @@ -22,7 +21,7 @@ const GitHub: ProjectNameExtractor = (url: string, html: string): string | null return null; }; -const GitLab: ProjectNameExtractor = (url: string, html: string): string | null => { +const GitLab: HeartbeatParser = (url: string, html: string): string | null => { const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); if (match) { @@ -37,7 +36,7 @@ const GitLab: ProjectNameExtractor = (url: string, html: string): string | null return null; }; -const BitBucket: ProjectNameExtractor = (url: string, html: string): string | null => { +const BitBucket: HeartbeatParser = (url: string, html: string): string | null => { const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); if (match) { @@ -53,7 +52,7 @@ const BitBucket: ProjectNameExtractor = (url: string, html: string): string | nu return null; }; -const TravisCI: ProjectNameExtractor = (url: string, html: string): string | null => { +const TravisCI: HeartbeatParser = (url: string, html: string): string | null => { const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); if (match) { @@ -67,7 +66,7 @@ const TravisCI: ProjectNameExtractor = (url: string, html: string): string | nul return null; }; -const CircleCI: ProjectNameExtractor = (url: string, html: string): string | null => { +const CircleCI: HeartbeatParser = (url: string, html: string): string | null => { const projectPageMatch = url.match( /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, ); @@ -104,7 +103,7 @@ const CircleCI: ProjectNameExtractor = (url: string, html: string): string | nul return null; }; -const Vercel: ProjectNameExtractor = (url: string, html: string): string | null => { +const Vercel: HeartbeatParser = (url: string, html: string): string | null => { const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); if (match) { @@ -120,22 +119,19 @@ const Vercel: ProjectNameExtractor = (url: string, html: string): string | null return null; }; -const ProjectNameExtractors: ProjectNameExtractor[] = [ - GitHub, - GitLab, - BitBucket, - TravisCI, - CircleCI, - Vercel, -]; - -export const getHeartbeatFromPage = (): string | null => { - for (const projectNameExtractor of ProjectNameExtractors) { - const projectName = projectNameExtractor(url, html); - if (projectName) { - return projectName; +const StackOverflow: HeartbeatParser = (url: string, html: string): string | null => { + const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); + + if (match) { + const root = parse(html); + // this regex extracts the project name from the title + // eg. title: test-website - Overview – Vercel + const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); + if (match2 && match2[0] === match[0]) { + return match[0]; } } + return null; }; @@ -156,3 +152,81 @@ export const getHtmlContentByTabId = async (tabId: number): Promise => { }; return response.html; }; + +const _normalizeUrl = (url?: string | null) => { + if (!url) { + return ''; + } + if (url.startsWith('http://')) { + url = url.substring('http://'.length); + } + if (url.startsWith('https://')) { + url = url.substring('https://'.length); + } + if (url.startsWith('www.')) { + url = url.substring('www.'.length); + } + if (url.endsWith('/')) { + url = url.substring(0, url.length - 1); + } + return url; +}; + +const stackExchangeDomains = (STACKEXCHANGE_SITES as StackExchangeSite[]).map((site) => { + return _normalizeUrl(site.site_url); +}); + +const SITES: Record = { + bitbucket: { + parser: BitBucket, + urls: [/^https?:\/\/(.+\.)?bitbucket.org\//], + }, + circleci: { + parser: CircleCI, + urls: [/^https?:\/\/(.+\.)?circleci.com\//], + }, + github: { + parser: GitHub, + urls: [ + /^https?:\/\/(.+\.)?github.com\//, + /^https?:\/\/(.+\.)?github.dev\//, + /^https?:\/\/(.+\.)?github.blog\//, + /^https?:\/\/(.+\.)?github.io\//, + /^https?:\/\/(.+\.)?github.community\//, + // /^https?:\/\/(.+\.)?ghcr.io\//, + // /^https?:\/\/(.+\.)?githubapp.com\//, + // /^https?:\/\/(.+\.)?githubassets.com\//, + // /^https?:\/\/(.+\.)?githubusercontent.com\//, + // /^https?:\/\/(.+\.)?githubnext.com\//, + ], + }, + gitlab: { + parser: GitLab, + urls: [/^https?:\/\/(.+\.)?gitlab.com\//], + }, + stackoverflow: { + parser: StackOverflow, + urls: stackExchangeDomains, + }, + travisci: { + parser: TravisCI, + urls: [/^https?:\/\/(.+\.)?travis-ci.com\//], + }, + vercel: { + parser: Vercel, + urls: [/^https?:\/\/(.+\.)?vercel.com\//], + }, +}; + +const match = (url: string, pattern: RegExp | string): boolean => { + if (typeof pattern === 'string') { + return _normalizeUrl(url).startsWith(_normalizeUrl(pattern)); + } + return pattern.test(url); +}; + +export const getSite = (url: string): SiteParser | undefined => { + return Object.values(SITES).find((site) => { + return site.urls.some((re) => match(url, re)); + }); +}; diff --git a/src/utils/sites.ts b/src/utils/sites.ts deleted file mode 100644 index d383015..0000000 --- a/src/utils/sites.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { parse } from 'node-html-parser'; - -type ProjectNameExtractor = (url: string, html: string) => string | null; - -const GitHub: ProjectNameExtractor = (url: string, html: string): string | null => { - const { hostname } = new URL(url); - const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); - - if (match) { - if (hostname.endsWith('.com')) { - const root = parse(html); - const repoName = root - .querySelector('meta[name=octolytics-dimension-repository_nwo]') - ?.getAttribute('content'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - } - return match[0]; - } - - return null; -}; - -const GitLab: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const repoName = root.querySelector('body')?.getAttribute('data-project-full-path'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - return match[0]; - } - - return null; -}; - -const BitBucket: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: jhondoe / my-test-repo — Bitbucket - const match2 = root.querySelector('title')?.textContent.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const TravisCI: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const projectName = root.querySelector('#ember737')?.textContent; - if (projectName === match[0]) { - return match[0]; - } - } - - return null; -}; - -const CircleCI: ProjectNameExtractor = (url: string, html: string): string | null => { - const projectPageMatch = url.match( - /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - - if (projectPageMatch) { - const root = parse(html); - const seconndBreadcrumbLabel = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', - )?.textContent; - const seconndBreadcrumbValue = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', - )?.textContent; - if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { - return projectPageMatch[0]; - } - } - - const settingsPageMatch = url.match( - /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - if (settingsPageMatch) { - const root = parse(html); - const pageTitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', - )?.textContent; - const pageSubtitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', - )?.textContent; - if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { - return settingsPageMatch[0]; - } - } - - return null; -}; - -const Vercel: ProjectNameExtractor = (url: string, html: string): string | null => { - const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: test-website - Overview – Vercel - const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const ProjectNameExtractors: ProjectNameExtractor[] = [ - GitHub, - GitLab, - BitBucket, - TravisCI, - CircleCI, - Vercel, -]; - -export const getHeartbeatFromPage = (): string | null => { - for (const projectNameExtractor of ProjectNameExtractors) { - const projectName = projectNameExtractor(url, html); - if (projectName) { - return projectName; - } - } - return null; -}; - -const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; - -export const isCodeReviewing = (url: string): boolean => { - for (const reg of CODE_REVIEW_URL_REG_LIST) { - if (url.match(reg)) { - return true; - } - } - return false; -}; - -export const getHtmlContentByTabId = async (tabId: number): Promise => { - const response = (await browser.tabs.sendMessage(tabId, { message: 'get_html' })) as { - html: string; - }; - return response.html; -}; diff --git a/src/utils/stackexchange-sites.ts b/src/utils/stackexchange-sites.ts new file mode 100644 index 0000000..5b41cab --- /dev/null +++ b/src/utils/stackexchange-sites.ts @@ -0,0 +1,11605 @@ +/* eslint-disable */ + +export const STACKEXCHANGE_SITES = [ + { + aliases: ['https://www.stackoverflow.com', 'https://facebook.stackoverflow.com'], + favicon_url: 'https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico', + audience: 'professional and enthusiast programmers', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png', + api_site_parameter: 'stackoverflow', + launch_date: 1221436800, + icon_url: 'https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/stackoverflow/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'meta.stackoverflow', + relation: 'meta', + name: 'Meta Stack Overflow', + site_url: 'https://meta.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Stack Overflow Chat', + site_url: 'https://chat.stackoverflow.com/', + }, + ], + name: 'Stack Overflow', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#3E6D8E', + link_color: '#0077CC', + }, + open_beta_date: 1217462400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://stackoverflow.com', + }, + { + favicon_url: 'https://cdn.sstatic.net/Sites/serverfault/Img/favicon.ico', + audience: 'system and network administrators', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/serverfault/Img/apple-touch-icon@2.png', + api_site_parameter: 'serverfault', + launch_date: 1243296000, + icon_url: 'https://cdn.sstatic.net/Sites/serverfault/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/serverfault/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'meta.serverfault', + relation: 'meta', + name: 'Meta Server Fault', + site_url: 'https://meta.serverfault.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=serverfault.com', + }, + ], + name: 'Server Fault', + styling: { + tag_background_color: '#F3F1D9', + tag_foreground_color: '#444444', + link_color: '#10456A', + }, + open_beta_date: 1241049600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://serverfault.com', + }, + { + favicon_url: 'https://cdn.sstatic.net/Sites/superuser/Img/favicon.ico', + audience: 'computer enthusiasts and power users', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/superuser/Img/apple-touch-icon@2.png', + api_site_parameter: 'superuser', + launch_date: 1250553600, + icon_url: 'https://cdn.sstatic.net/Sites/superuser/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/superuser/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'meta.superuser', + relation: 'meta', + name: 'Meta Super User', + site_url: 'https://meta.superuser.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=superuser.com', + }, + ], + name: 'Super User', + styling: { + tag_background_color: '#FFFFFF', + tag_foreground_color: '#1087A4', + link_color: '#1086A4', + }, + open_beta_date: 1247529600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://superuser.com', + }, + { + favicon_url: 'https://meta.stackexchange.com/Content/Sites/stackexchangemeta/Img/favicon.ico', + audience: 'meta-discussion of the Stack Exchange family of Q&A websites', + high_resolution_icon_url: + 'https://meta.stackexchange.com/Content/Sites/stackexchangemeta/Img/apple-touch-icon@2.png', + api_site_parameter: 'meta', + launch_date: 1246147200, + icon_url: + 'https://meta.stackexchange.com/Content/Sites/stackexchangemeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + logo_url: 'https://meta.stackexchange.com/Content/Sites/stackexchangemeta/Img/logo.png', + related_sites: [ + { + relation: 'chat', + name: 'Meta Stack Exchange Chat', + site_url: 'https://chat.meta.stackexchange.com/', + }, + ], + name: 'Meta Stack Exchange', + styling: { + tag_background_color: '#F7FDFF', + tag_foreground_color: '#566E76', + link_color: '#4E82C2', + }, + open_beta_date: 1246147200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://meta.stackexchange.com', + }, + { + aliases: ['https://nothingtoinstall.com'], + closed_beta_date: 1277924400, + audience: 'power users of web applications', + favicon_url: 'https://cdn.sstatic.net/Sites/webapps/Img/favicon.ico', + api_site_parameter: 'webapps', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/webapps/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/webapps/Img/apple-touch-icon.png', + launch_date: 1285874037, + logo_url: 'https://cdn.sstatic.net/Sites/webapps/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'webapps.meta', + relation: 'meta', + name: 'Web Applications Meta Stack Exchange', + site_url: 'https://webapps.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=webapps.stackexchange.com', + }, + ], + name: 'Web Applications', + styling: { + tag_background_color: '#E2EDFA', + tag_foreground_color: '#5D7A9C', + link_color: '#426389', + }, + open_beta_date: 1278529200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://webapps.stackexchange.com', + }, + { + aliases: ['https://meta.nothingtoinstall.com', 'https://meta.webapps.stackexchange.com'], + audience: 'power users of web applications', + api_site_parameter: 'webapps.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/webappsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/webappsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/webappsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/webappsmeta/Img/logo.png', + open_beta_date: 1311274880, + name: 'Web Applications Meta', + related_sites: [ + { + api_site_parameter: 'webapps', + relation: 'parent', + name: 'Web Applications Stack Exchange', + site_url: 'https://webapps.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=webapps.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#EBEBEB', + tag_foreground_color: '#666', + link_color: '#333C43', + }, + site_type: 'meta_site', + site_url: 'https://webapps.meta.stackexchange.com', + }, + { + aliases: ['https://arqade.com', 'https://thearqade.com'], + closed_beta_date: 1278529200, + audience: 'passionate videogamers on all platforms', + favicon_url: 'https://cdn.sstatic.net/Sites/gaming/Img/favicon.ico', + api_site_parameter: 'gaming', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gaming/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gaming/Img/apple-touch-icon.png', + launch_date: 1286391600, + logo_url: 'https://cdn.sstatic.net/Sites/gaming/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'gaming.meta', + relation: 'meta', + name: 'Arqade Meta', + site_url: 'https://gaming.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gaming.stackexchange.com', + }, + ], + name: 'Arqade', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#666', link_color: '#5A8F53' }, + open_beta_date: 1279134000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://gaming.stackexchange.com', + }, + { + aliases: [ + 'https://meta.arqade.com', + 'https://meta.thearqade.com', + 'https://meta.gaming.stackexchange.com', + ], + audience: 'passionate videogamers on all platforms', + api_site_parameter: 'gaming.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/gamingmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gamingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gamingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/gamingmeta/Img/logo.png', + open_beta_date: 1315582136, + name: 'Arqade Meta', + related_sites: [ + { + api_site_parameter: 'gaming', + relation: 'parent', + name: 'Arqade', + site_url: 'https://gaming.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gaming.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#666', link_color: '#666666' }, + site_type: 'meta_site', + site_url: 'https://gaming.meta.stackexchange.com', + }, + { + aliases: ['https://webmaster.stackexchange.com'], + closed_beta_date: 1278615600, + audience: 'webmasters', + favicon_url: 'https://cdn.sstatic.net/Sites/webmasters/Img/favicon.ico', + api_site_parameter: 'webmasters', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/webmasters/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/webmasters/Img/apple-touch-icon.png', + launch_date: 1286997420, + logo_url: 'https://cdn.sstatic.net/Sites/webmasters/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'webmasters.meta', + relation: 'meta', + name: 'Webmasters Meta Stack Exchange', + site_url: 'https://webmasters.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=webmasters.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#1B8FBB', + link_color: '#1C69A4', + }, + name: 'Webmasters', + open_beta_date: 1279220400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://webmasters.stackexchange.com', + }, + { + aliases: [ + 'https://meta.webmaster.stackexchange.com', + 'https://meta.webmasters.stackexchange.com', + ], + audience: 'webmasters', + api_site_parameter: 'webmasters.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/webmastersmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/webmastersmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/webmastersmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/webmastersmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Webmasters Meta', + related_sites: [ + { + api_site_parameter: 'webmasters', + relation: 'parent', + name: 'Webmasters Stack Exchange', + site_url: 'https://webmasters.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=webmasters.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://webmasters.meta.stackexchange.com', + }, + { + aliases: ['https://seasonedadvice.com'], + closed_beta_date: 1278702000, + audience: 'professional and amateur chefs', + favicon_url: 'https://cdn.sstatic.net/Sites/cooking/Img/favicon.ico', + api_site_parameter: 'cooking', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cooking/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cooking/Img/apple-touch-icon.png', + launch_date: 1287084715, + logo_url: 'https://cdn.sstatic.net/Sites/cooking/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'cooking.meta', + relation: 'meta', + name: 'Seasoned Advice Meta', + site_url: 'https://cooking.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cooking.stackexchange.com', + }, + ], + name: 'Seasoned Advice', + styling: { + tag_background_color: '#FFF5E4', + tag_foreground_color: '#847454', + link_color: '#AB2020', + }, + open_beta_date: 1279306800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://cooking.stackexchange.com', + }, + { + aliases: ['https://meta.seasonedadvice.com', 'https://meta.cooking.stackexchange.com'], + api_site_parameter: 'cooking.meta', + audience: 'professional and amateur chefs', + favicon_url: 'https://cdn.sstatic.net/Sites/cookingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/cookingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cookingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cookingmeta/Img/logo.png', + name: 'Seasoned Advice Meta', + related_sites: [ + { + api_site_parameter: 'cooking', + name: 'Seasoned Advice', + relation: 'parent', + site_url: 'https://cooking.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=cooking.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://cooking.meta.stackexchange.com', + }, + { + closed_beta_date: 1279134000, + audience: 'professional and independent game developers', + favicon_url: 'https://cdn.sstatic.net/Sites/gamedev/Img/favicon.ico', + api_site_parameter: 'gamedev', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gamedev/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gamedev/Img/apple-touch-icon.png', + launch_date: 1287695708, + logo_url: 'https://cdn.sstatic.net/Sites/gamedev/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'gamedev.meta', + relation: 'meta', + name: 'Game Development Meta Stack Exchange', + site_url: 'https://gamedev.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gamedev.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters', 'Prettify'], + styling: { + tag_background_color: '#eeeeee', + tag_foreground_color: '#444444', + link_color: '#416D63', + }, + name: 'Game Development', + open_beta_date: 1279738800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://gamedev.stackexchange.com', + }, + { + aliases: ['https://meta.gamedev.stackexchange.com'], + audience: 'professional and independent game developers', + api_site_parameter: 'gamedev.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/gamedevmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/gamedevmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gamedevmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/gamedevmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + name: 'Game Development Meta', + related_sites: [ + { + api_site_parameter: 'gamedev', + relation: 'parent', + name: 'Game Development Stack Exchange', + site_url: 'https://gamedev.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gamedev.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://gamedev.meta.stackexchange.com', + }, + { + aliases: ['https://photography.stackexchange.com', 'https://photos.stackexchange.com'], + closed_beta_date: 1279220400, + audience: 'professional, enthusiast and amateur photographers', + favicon_url: 'https://cdn.sstatic.net/Sites/photo/Img/favicon.ico', + api_site_parameter: 'photo', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/photo/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/photo/Img/apple-touch-icon.png', + launch_date: 1288296279, + logo_url: 'https://cdn.sstatic.net/Sites/photo/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'photo.meta', + relation: 'meta', + name: 'Photography Meta Stack Exchange', + site_url: 'https://photo.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=photo.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + styling: { + tag_background_color: '#F7F7F7', + tag_foreground_color: '#444', + link_color: '#0077CC', + }, + name: 'Photography', + open_beta_date: 1279825200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://photo.stackexchange.com', + }, + { + aliases: [ + 'https://meta.photography.stackexchange.com', + 'https://meta.photos.stackexchange.com', + 'https://meta.photo.stackexchange.com', + ], + audience: 'professional, enthusiast and amateur photographers', + api_site_parameter: 'photo.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/photometa/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/photometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/photometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/photometa/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + name: 'Photography Meta', + related_sites: [ + { + api_site_parameter: 'photo', + relation: 'parent', + name: 'Photography Stack Exchange', + site_url: 'https://photo.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=photo.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://photo.meta.stackexchange.com', + }, + { + aliases: ['https://statistics.stackexchange.com', 'https://crossvalidated.com'], + closed_beta_date: 1279566000, + audience: + 'people interested in statistics, machine learning, data analysis, data mining, and data visualization', + favicon_url: 'https://cdn.sstatic.net/Sites/stats/Img/favicon.ico', + api_site_parameter: 'stats', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/stats/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/stats/Img/apple-touch-icon.png', + launch_date: 1288900046, + logo_url: 'https://cdn.sstatic.net/Sites/stats/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'stats.meta', + relation: 'meta', + name: 'Cross Validated Meta', + site_url: 'https://stats.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=stats.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { + tag_background_color: '#edefed', + tag_foreground_color: '#5D5D5D', + link_color: '#0077CC', + }, + name: 'Cross Validated', + open_beta_date: 1280170800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://stats.stackexchange.com', + }, + { + aliases: ['https://meta.statistics.stackexchange.com', 'https://meta.stats.stackexchange.com'], + audience: + 'people interested in statistics, machine learning, data analysis, data mining, and data visualization', + api_site_parameter: 'stats.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/statsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/statsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/statsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/statsmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Cross Validated Meta', + related_sites: [ + { + api_site_parameter: 'stats', + relation: 'parent', + name: 'Cross Validated', + site_url: 'https://stats.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=stats.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://stats.meta.stackexchange.com', + }, + { + aliases: ['https://maths.stackexchange.com', 'https://mathematics.stackexchange.com'], + closed_beta_date: 1279652400, + audience: 'people studying math at any level and professionals in related fields', + favicon_url: 'https://cdn.sstatic.net/Sites/math/Img/favicon.ico', + api_site_parameter: 'math', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/math/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/math/Img/apple-touch-icon.png', + launch_date: 1288038715, + logo_url: 'https://cdn.sstatic.net/Sites/math/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'math.meta', + relation: 'meta', + name: 'Mathematics Meta Stack Exchange', + site_url: 'https://math.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=math.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { + tag_background_color: '#888888', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Mathematics', + open_beta_date: 1280257200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://math.stackexchange.com', + }, + { + aliases: ['https://meta.math.stackexchange.com'], + audience: 'people studying math at any level and professionals in related fields', + api_site_parameter: 'math.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/mathmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/mathmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mathmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mathmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Mathematics Meta', + related_sites: [ + { + api_site_parameter: 'math', + relation: 'parent', + name: 'Mathematics Stack Exchange', + site_url: 'https://math.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=math.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://math.meta.stackexchange.com', + }, + { + closed_beta_date: 1279738800, + audience: 'contractors and serious DIYers', + favicon_url: 'https://cdn.sstatic.net/Sites/diy/Img/favicon.ico', + api_site_parameter: 'diy', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/diy/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/diy/Img/apple-touch-icon.png', + launch_date: 1299184860, + logo_url: 'https://cdn.sstatic.net/Sites/diy/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'diy.meta', + relation: 'meta', + name: 'Home Improvement Meta Stack Exchange', + site_url: 'https://diy.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=diy.stackexchange.com', + }, + ], + name: 'Home Improvement', + styling: { + tag_background_color: '#f5f5f5', + tag_foreground_color: '#696969', + link_color: '#0077CC', + }, + open_beta_date: 1280343600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://diy.stackexchange.com', + }, + { + aliases: ['https://meta.diy.stackexchange.com'], + api_site_parameter: 'diy.meta', + audience: 'contractors and serious DIYers', + favicon_url: 'https://cdn.sstatic.net/Sites/diymeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/diymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/diymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/diymeta/Img/logo.png', + name: 'Home Improvement Meta', + related_sites: [ + { + api_site_parameter: 'diy', + name: 'Home Improvement Stack Exchange', + relation: 'parent', + site_url: 'https://diy.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=diy.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://diy.meta.stackexchange.com', + }, + { + audience: 'computer enthusiasts and power users', + api_site_parameter: 'meta.superuser', + favicon_url: 'https://cdn.sstatic.net/Sites/superusermeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/superusermeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/superusermeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/superusermeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Meta Super User', + related_sites: [ + { + api_site_parameter: 'superuser', + relation: 'parent', + name: 'Super User', + site_url: 'https://superuser.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=superuser.com', + }, + ], + site_state: 'linked_meta', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_type: 'meta_site', + site_url: 'https://meta.superuser.com', + }, + { + api_site_parameter: 'meta.serverfault', + audience: 'system and network administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/serverfaultmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/serverfaultmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/serverfaultmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/serverfaultmeta/Img/logo.png', + name: 'Meta Server Fault', + related_sites: [ + { + api_site_parameter: 'serverfault', + name: 'Server Fault', + relation: 'parent', + site_url: 'https://serverfault.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=serverfault.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_url: 'https://meta.serverfault.com', + }, + { + closed_beta_date: 1279825200, + audience: 'cartographers, geographers and GIS professionals', + favicon_url: 'https://cdn.sstatic.net/Sites/gis/Img/favicon.ico', + api_site_parameter: 'gis', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gis/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gis/Img/apple-touch-icon.png', + launch_date: 1299486043, + logo_url: 'https://cdn.sstatic.net/Sites/gis/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'gis.meta', + relation: 'meta', + name: 'Geographic Information Systems Meta Stack Exchange', + site_url: 'https://gis.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gis.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#f5f5f5', + tag_foreground_color: '#696969', + link_color: '#176F8C', + }, + name: 'Geographic Information Systems', + open_beta_date: 1280430000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://gis.stackexchange.com', + }, + { + aliases: ['https://meta.gis.stackexchange.com'], + api_site_parameter: 'gis.meta', + audience: 'cartographers, geographers and GIS professionals', + favicon_url: 'https://cdn.sstatic.net/Sites/gismeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gismeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gismeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/gismeta/Img/logo.png', + name: 'Geographic Information Systems Meta', + related_sites: [ + { + api_site_parameter: 'gis', + name: 'Geographic Information Systems Stack Exchange', + relation: 'parent', + site_url: 'https://gis.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=gis.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://gis.meta.stackexchange.com', + }, + { + closed_beta_date: 1280170800, + audience: 'users of TeX, LaTeX, ConTeXt, and related typesetting systems', + favicon_url: 'https://cdn.sstatic.net/Sites/tex/Img/favicon.ico', + api_site_parameter: 'tex', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tex/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tex/Img/apple-touch-icon.png', + launch_date: 1289510398, + logo_url: 'https://cdn.sstatic.net/Sites/tex/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'tex.meta', + relation: 'meta', + name: 'TeX - LaTeX Meta Stack Exchange', + site_url: 'https://tex.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=tex.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#FEFEFA', + tag_foreground_color: '#444444', + link_color: '#0077CC', + }, + name: 'TeX - LaTeX', + open_beta_date: 1280775600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://tex.stackexchange.com', + }, + { + aliases: ['https://meta.tex.stackexchange.com'], + audience: 'users of TeX, LaTeX, ConTeXt, and related typesetting systems', + api_site_parameter: 'tex.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/texmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/texmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/texmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/texmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'TeX - LaTeX Meta', + related_sites: [ + { + api_site_parameter: 'tex', + relation: 'parent', + name: 'TeX - LaTeX Stack Exchange', + site_url: 'https://tex.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=tex.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://tex.meta.stackexchange.com', + }, + { + aliases: ['https://ubuntu.stackexchange.com'], + closed_beta_date: 1280343600, + audience: 'Ubuntu users and developers', + favicon_url: 'https://cdn.sstatic.net/Sites/askubuntu/Img/favicon.ico', + api_site_parameter: 'askubuntu', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/askubuntu/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/askubuntu/Img/apple-touch-icon.png', + launch_date: 1286712000, + logo_url: 'https://cdn.sstatic.net/Sites/askubuntu/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'meta.askubuntu', + relation: 'meta', + name: 'Ask Ubuntu Meta', + site_url: 'https://meta.askubuntu.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=askubuntu.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E8E7E5', + tag_foreground_color: '#5E5E5E', + link_color: '#333333', + }, + name: 'Ask Ubuntu', + open_beta_date: 1280948400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://askubuntu.com', + }, + { + aliases: ['https://meta.ubuntu.stackexchange.com'], + api_site_parameter: 'meta.askubuntu', + audience: 'Ubuntu users and developers', + favicon_url: 'https://cdn.sstatic.net/Sites/askubuntumeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/askubuntumeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/askubuntumeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/askubuntumeta/Img/logo.png', + name: 'Ask Ubuntu Meta', + related_sites: [ + { + api_site_parameter: 'askubuntu', + name: 'Ask Ubuntu', + relation: 'parent', + site_url: 'https://askubuntu.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=askubuntu.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E8E7E5', + tag_foreground_color: '#5E5E5E', + link_color: '#222222', + }, + site_url: 'https://meta.askubuntu.com', + }, + { + aliases: ['https://basicallymoney.com', 'https://www.basicallymoney.com'], + closed_beta_date: 1280948400, + audience: 'people who want to be financially literate', + favicon_url: 'https://cdn.sstatic.net/Sites/money/Img/favicon.ico', + api_site_parameter: 'money', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/money/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/money/Img/apple-touch-icon.png', + launch_date: 1393453216, + logo_url: 'https://cdn.sstatic.net/Sites/money/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'money.meta', + relation: 'meta', + name: 'Personal Finance & Money Meta Stack Exchange', + site_url: 'https://money.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=money.stackexchange.com', + }, + ], + name: 'Personal Finance & Money', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1281553200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://money.stackexchange.com', + }, + { + aliases: ['https://meta.money.stackexchange.com'], + api_site_parameter: 'money.meta', + audience: 'people who want to be financially literate', + favicon_url: 'https://cdn.sstatic.net/Sites/moneymeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/moneymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/moneymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/moneymeta/Img/logo.png', + name: 'Personal Finance & Money Meta', + related_sites: [ + { + api_site_parameter: 'money', + name: 'Personal Finance & Money Stack Exchange', + relation: 'parent', + site_url: 'https://money.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=money.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://money.meta.stackexchange.com', + }, + { + aliases: ['https://elu.stackexchange.com'], + closed_beta_date: 1281034800, + audience: 'linguists, etymologists, and serious English language enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/english/Img/favicon.ico', + api_site_parameter: 'english', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/english/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/english/Img/apple-touch-icon.png', + launch_date: 1290463924, + logo_url: 'https://cdn.sstatic.net/Sites/english/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'english.meta', + relation: 'meta', + name: 'English Language & Usage Meta Stack Exchange', + site_url: 'https://english.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=english.stackexchange.com', + }, + ], + name: 'English Language & Usage', + styling: { + tag_background_color: '#F4ECE3', + tag_foreground_color: '#5E5E5E', + link_color: '#0077CC', + }, + open_beta_date: 1281639600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://english.stackexchange.com', + }, + { + aliases: ['https://meta.english.stackexchange.com'], + api_site_parameter: 'english.meta', + audience: 'linguists, etymologists, and serious English language enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/englishmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/englishmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/englishmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/englishmeta/Img/logo.png', + name: 'English Language & Usage Meta', + related_sites: [ + { + api_site_parameter: 'english', + name: 'English Language & Usage Stack Exchange', + relation: 'parent', + site_url: 'https://english.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=english.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://english.meta.stackexchange.com', + }, + { + closed_beta_date: 1269993600, + audience: 'apps, scripts, and development with the Stack Exchange API', + favicon_url: 'https://cdn.sstatic.net/Sites/stackapps/Img/favicon.ico', + api_site_parameter: 'stackapps', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/stackapps/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/stackapps/Img/apple-touch-icon.png', + launch_date: 1274313600, + logo_url: 'https://cdn.sstatic.net/Sites/stackapps/Img/logo.png', + related_sites: [ + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=stackapps.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E7ECEC', + tag_foreground_color: '#555555', + link_color: '#0077DD', + }, + name: 'Stack Apps', + open_beta_date: 1274313600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://stackapps.com', + }, + { + aliases: ['https://ui.stackexchange.com'], + closed_beta_date: 1281380400, + audience: 'user experience researchers and experts', + favicon_url: 'https://cdn.sstatic.net/Sites/ux/Img/favicon.ico', + api_site_parameter: 'ux', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ux/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ux/Img/apple-touch-icon.png', + launch_date: 1325624400, + logo_url: 'https://cdn.sstatic.net/Sites/ux/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'ux.meta', + relation: 'meta', + name: 'User Experience Meta Stack Exchange', + site_url: 'https://ux.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ux.stackexchange.com', + }, + ], + markdown_extensions: ['Balsamiq'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'User Experience', + open_beta_date: 1281985200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ux.stackexchange.com', + }, + { + aliases: ['https://meta.ui.stackexchange.com', 'https://meta.ux.stackexchange.com'], + api_site_parameter: 'ux.meta', + audience: 'user experience researchers and experts', + favicon_url: 'https://cdn.sstatic.net/Sites/uxmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/uxmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/uxmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/uxmeta/Img/logo.png', + name: 'User Experience Meta', + related_sites: [ + { + api_site_parameter: 'ux', + name: 'User Experience Stack Exchange', + relation: 'parent', + site_url: 'https://ux.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=ux.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://ux.meta.stackexchange.com', + }, + { + aliases: ['https://linux.stackexchange.com'], + closed_beta_date: 1281466800, + audience: 'users of Linux, FreeBSD and other Un*x-like operating systems', + favicon_url: 'https://cdn.sstatic.net/Sites/unix/Img/favicon.ico', + api_site_parameter: 'unix', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/unix/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/unix/Img/apple-touch-icon.png', + launch_date: 1294871917, + logo_url: 'https://cdn.sstatic.net/Sites/unix/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'unix.meta', + relation: 'meta', + name: 'Unix & Linux Meta Stack Exchange', + site_url: 'https://unix.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=unix.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#F0F0F0', + tag_foreground_color: '#444444', + link_color: '#0077CC', + }, + name: 'Unix & Linux', + open_beta_date: 1282071600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://unix.stackexchange.com', + }, + { + aliases: ['https://meta.linux.stackexchange.com', 'https://meta.unix.stackexchange.com'], + api_site_parameter: 'unix.meta', + audience: 'users of Linux, FreeBSD and other Un*x-like operating systems', + favicon_url: 'https://cdn.sstatic.net/Sites/unixmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/unixmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/unixmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/unixmeta/Img/logo.png', + name: 'Unix & Linux Meta', + related_sites: [ + { + api_site_parameter: 'unix', + name: 'Unix & Linux Stack Exchange', + relation: 'parent', + site_url: 'https://unix.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=unix.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://unix.meta.stackexchange.com', + }, + { + closed_beta_date: 1281553200, + audience: 'WordPress developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/wordpress/Img/favicon.ico', + api_site_parameter: 'wordpress', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/wordpress/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/wordpress/Img/apple-touch-icon.png', + launch_date: 1297718441, + logo_url: 'https://cdn.sstatic.net/Sites/wordpress/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'wordpress.meta', + relation: 'meta', + name: 'WordPress Development Meta Stack Exchange', + site_url: 'https://wordpress.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=wordpress.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#F5F5F5', + tag_foreground_color: '#666', + link_color: '#0077CC', + }, + name: 'WordPress Development', + open_beta_date: 1282158000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://wordpress.stackexchange.com', + }, + { + aliases: ['https://meta.wordpress.stackexchange.com'], + api_site_parameter: 'wordpress.meta', + audience: 'WordPress developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/wordpressmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/wordpressmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/wordpressmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/wordpressmeta/Img/logo.png', + name: 'WordPress Development Meta', + related_sites: [ + { + api_site_parameter: 'wordpress', + name: 'WordPress Development Stack Exchange', + relation: 'parent', + site_url: 'https://wordpress.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=wordpress.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://wordpress.meta.stackexchange.com', + }, + { + closed_beta_date: 1281985200, + audience: 'theoretical computer scientists and researchers in related fields', + favicon_url: 'https://cdn.sstatic.net/Sites/cstheory/Img/favicon.ico', + api_site_parameter: 'cstheory', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cstheory/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cstheory/Img/apple-touch-icon.png', + launch_date: 1291150150, + logo_url: 'https://cdn.sstatic.net/Sites/cstheory/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'cstheory.meta', + relation: 'meta', + name: 'Theoretical Computer Science Meta Stack Exchange', + site_url: 'https://cstheory.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cstheory.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { + tag_background_color: '#696969', + tag_foreground_color: '#fCf7ed', + link_color: '#0077CC', + }, + name: 'Theoretical Computer Science', + open_beta_date: 1282590000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://cstheory.stackexchange.com', + }, + { + aliases: ['https://meta.cstheory.stackexchange.com'], + audience: 'theoretical computer scientists and researchers in related fields', + api_site_parameter: 'cstheory.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/cstheorymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/cstheorymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cstheorymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cstheorymeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Theoretical Computer Science Meta', + related_sites: [ + { + api_site_parameter: 'cstheory', + relation: 'parent', + name: 'Theoretical Computer Science Stack Exchange', + site_url: 'https://cstheory.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cstheory.stackexchange.com', + }, + ], + open_beta_date: 1310623608, + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_state: 'linked_meta', + site_type: 'meta_site', + site_url: 'https://cstheory.meta.stackexchange.com', + }, + { + aliases: ['https://askdifferent.com'], + closed_beta_date: 1282071600, + audience: 'power users of Apple hardware and software', + favicon_url: 'https://cdn.sstatic.net/Sites/apple/Img/favicon.ico', + api_site_parameter: 'apple', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/apple/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/apple/Img/apple-touch-icon.png', + launch_date: 1296250821, + logo_url: 'https://cdn.sstatic.net/Sites/apple/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'apple.meta', + relation: 'meta', + name: 'Ask Different Meta', + site_url: 'https://apple.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=apple.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E6F1F7', + tag_foreground_color: '#304955', + link_color: '#0077CC', + }, + name: 'Ask Different', + open_beta_date: 1282676400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://apple.stackexchange.com', + }, + { + aliases: ['https://meta.apple.stackexchange.com'], + api_site_parameter: 'apple.meta', + audience: 'power users of Apple hardware and software', + favicon_url: 'https://cdn.sstatic.net/Sites/applemeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/applemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/applemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/applemeta/Img/logo.png', + name: 'Ask Different Meta', + related_sites: [ + { + api_site_parameter: 'apple', + name: 'Ask Different', + relation: 'parent', + site_url: 'https://apple.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=apple.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://apple.meta.stackexchange.com', + }, + { + closed_beta_date: 1282244400, + audience: 'gamemasters and players of tabletop, paper-and-pencil role-playing games', + favicon_url: 'https://cdn.sstatic.net/Sites/rpg/Img/favicon.ico', + api_site_parameter: 'rpg', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/rpg/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/rpg/Img/apple-touch-icon.png', + launch_date: 1334176200, + logo_url: 'https://cdn.sstatic.net/Sites/rpg/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'rpg.meta', + relation: 'meta', + name: 'Role-playing Games Meta Stack Exchange', + site_url: 'https://rpg.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=rpg.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Role-playing Games', + open_beta_date: 1282849200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://rpg.stackexchange.com', + }, + { + aliases: ['https://meta.rpg.stackexchange.com'], + audience: 'gamemasters and players of tabletop, paper-and-pencil role-playing games', + api_site_parameter: 'rpg.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/rpgmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/rpgmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/rpgmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/rpgmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + name: 'Role-playing Games Meta', + related_sites: [ + { + api_site_parameter: 'rpg', + relation: 'parent', + name: 'Role-playing Games Stack Exchange', + site_url: 'https://rpg.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=rpg.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://rpg.meta.stackexchange.com', + }, + { + aliases: [ + 'https://bicycle.stackexchange.com', + 'https://cycling.stackexchange.com', + 'https://bikes.stackexchange.com', + ], + closed_beta_date: 1282762800, + audience: + 'people who build and repair bicycles, people who train cycling, or commute on bicycles', + favicon_url: 'https://cdn.sstatic.net/Sites/bicycles/Img/favicon.ico', + api_site_parameter: 'bicycles', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/bicycles/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bicycles/Img/apple-touch-icon.png', + launch_date: 1312311600, + logo_url: 'https://cdn.sstatic.net/Sites/bicycles/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'bicycles.meta', + relation: 'meta', + name: 'Bicycles Meta Stack Exchange', + site_url: 'https://bicycles.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bicycles.stackexchange.com', + }, + ], + name: 'Bicycles', + styling: { + tag_background_color: '#E7F0F3', + tag_foreground_color: '#478EA7', + link_color: '#0077CC', + }, + open_beta_date: 1283367600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://bicycles.stackexchange.com', + }, + { + aliases: ['https://meta.bicycle.stackexchange.com', 'https://meta.bicycles.stackexchange.com'], + audience: + 'people who build and repair bicycles, people who train cycling, or commute on bicycles', + api_site_parameter: 'bicycles.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/bicyclesmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bicyclesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bicyclesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/bicyclesmeta/Img/logo.png', + open_beta_date: 1308698903, + name: 'Bicycles Meta', + related_sites: [ + { + api_site_parameter: 'bicycles', + relation: 'parent', + name: 'Bicycles Stack Exchange', + site_url: 'https://bicycles.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bicycles.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://bicycles.meta.stackexchange.com', + }, + { + aliases: [ + 'https://programmer.stackexchange.com', + 'https://programmers.stackexchange.com', + 'https://swe.stackexchange.com', + ], + closed_beta_date: 1283367600, + audience: + 'professionals, academics, and students working within the systems development life cycle', + favicon_url: 'https://cdn.sstatic.net/Sites/softwareengineering/Img/favicon.ico', + api_site_parameter: 'softwareengineering', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/softwareengineering/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/softwareengineering/Img/apple-touch-icon.png', + launch_date: 1292524346, + logo_url: 'https://cdn.sstatic.net/Sites/softwareengineering/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'softwareengineering.meta', + relation: 'meta', + name: 'Software Engineering Meta Stack Exchange', + site_url: 'https://softwareengineering.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=softwareengineering.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#5D5D5D', + link_color: '#0077CC', + }, + name: 'Software Engineering', + open_beta_date: 1283972400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://softwareengineering.stackexchange.com', + }, + { + aliases: [ + 'https://meta.programmers.stackexchange.com', + 'https://meta.softwareengineering.stackexchange.com', + 'https://meta.swe.stackexchange.com', + ], + audience: + 'professionals, academics, and students working within the systems development life cycle', + api_site_parameter: 'softwareengineering.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/softwareengineeringmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/softwareengineeringmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/softwareengineeringmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/softwareengineeringmeta/Img/logo.png', + open_beta_date: 1316813149, + name: 'Software Engineering Meta', + related_sites: [ + { + api_site_parameter: 'softwareengineering', + relation: 'parent', + name: 'Software Engineering Stack Exchange', + site_url: 'https://softwareengineering.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=softwareengineering.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://softwareengineering.meta.stackexchange.com', + }, + { + aliases: ['https://chiphacker.com', 'https://www.chiphacker.com'], + closed_beta_date: 1285786800, + audience: 'electronics and electrical engineering professionals, students, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/electronics/Img/favicon.ico', + api_site_parameter: 'electronics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/electronics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/electronics/Img/apple-touch-icon.png', + launch_date: 1300734875, + logo_url: 'https://cdn.sstatic.net/Sites/electronics/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'electronics.meta', + relation: 'meta', + name: 'Electrical Engineering Meta Stack Exchange', + site_url: 'https://electronics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=electronics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters', 'Prettify'], + styling: { + tag_background_color: '#ffffff', + tag_foreground_color: '#696969', + link_color: '#0077CC', + }, + name: 'Electrical Engineering', + open_beta_date: 1285786800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://electronics.stackexchange.com', + }, + { + aliases: ['https://meta.electronics.stackexchange.com'], + audience: 'electronic hardware hacking enthusiasts', + api_site_parameter: 'electronics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/electronicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/electronicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/electronicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/electronicsmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + name: 'Electrical Engineering Meta', + related_sites: [ + { + api_site_parameter: 'electronics', + relation: 'parent', + name: 'Electrical Engineering Stack Exchange', + site_url: 'https://electronics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=electronics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://electronics.meta.stackexchange.com', + }, + { + closed_beta_date: 1284404400, + audience: 'enthusiasts and power users of the Android operating system', + favicon_url: 'https://cdn.sstatic.net/Sites/android/Img/favicon.ico', + api_site_parameter: 'android', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/android/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/android/Img/apple-touch-icon.png', + launch_date: 1300996634, + logo_url: 'https://cdn.sstatic.net/Sites/android/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'android.meta', + relation: 'meta', + name: 'Android Enthusiasts Meta Stack Exchange', + site_url: 'https://android.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=android.stackexchange.com', + }, + ], + name: 'Android Enthusiasts', + styling: { + tag_background_color: '#F1F5E6', + tag_foreground_color: '#666666', + link_color: '#0077CC', + }, + open_beta_date: 1285009200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://android.stackexchange.com', + }, + { + aliases: ['https://meta.android.stackexchange.com'], + api_site_parameter: 'android.meta', + audience: 'enthusiasts and power users of the Android operating system', + favicon_url: 'https://cdn.sstatic.net/Sites/androidmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/androidmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/androidmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/androidmeta/Img/logo.png', + name: 'Android Enthusiasts Meta', + related_sites: [ + { + api_site_parameter: 'android', + name: 'Android Enthusiasts Stack Exchange', + relation: 'parent', + site_url: 'https://android.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=android.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://android.meta.stackexchange.com', + }, + { + aliases: ['https://boardgame.stackexchange.com'], + closed_beta_date: 1287514800, + audience: + 'people who like playing board games, designing board games or modifying the rules of existing board games', + favicon_url: 'https://cdn.sstatic.net/Sites/boardgames/Img/favicon.ico', + api_site_parameter: 'boardgames', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/boardgames/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/boardgames/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/boardgames/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'boardgames.meta', + relation: 'meta', + name: 'Board & Card Games Meta Stack Exchange', + site_url: 'https://boardgames.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=boardgames.stackexchange.com', + }, + ], + name: 'Board & Card Games', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1288119600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://boardgames.stackexchange.com', + }, + { + aliases: ['https://meta.boardgames.stackexchange.com'], + api_site_parameter: 'boardgames.meta', + audience: + 'people who like playing board games, designing board games or modifying the rules of existing board games', + favicon_url: 'https://cdn.sstatic.net/Sites/boardgamesmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/boardgamesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/boardgamesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/boardgamesmeta/Img/apple-touch-icon.png', + name: 'Board & Card Games Meta', + related_sites: [ + { + api_site_parameter: 'boardgames', + name: 'Board & Card Games Stack Exchange', + relation: 'parent', + site_url: 'https://boardgames.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=boardgames.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://boardgames.meta.stackexchange.com', + }, + { + closed_beta_date: 1288724400, + audience: 'active researchers, academics and students of physics', + favicon_url: 'https://cdn.sstatic.net/Sites/physics/Img/favicon.ico', + api_site_parameter: 'physics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/physics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/physics/Img/apple-touch-icon.png', + launch_date: 1298586551, + logo_url: 'https://cdn.sstatic.net/Sites/physics/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'physics.meta', + relation: 'meta', + name: 'Physics Meta Stack Exchange', + site_url: 'https://physics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=physics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { + tag_background_color: '#EBF5F5', + tag_foreground_color: '#5A8788', + link_color: '#0077CC', + }, + name: 'Physics', + open_beta_date: 1289329200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://physics.stackexchange.com', + }, + { + aliases: ['https://meta.physics.stackexchange.com'], + audience: 'active researchers, academics and students of physics', + api_site_parameter: 'physics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/physicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/physicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/physicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/physicsmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Physics Meta', + related_sites: [ + { + api_site_parameter: 'physics', + relation: 'parent', + name: 'Physics Stack Exchange', + site_url: 'https://physics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=physics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#3E6D8E', + link_color: '#0077CC', + }, + site_type: 'meta_site', + site_url: 'https://physics.meta.stackexchange.com', + }, + { + aliases: ['https://homebrewing.stackexchange.com', 'https://brewadvice.com'], + closed_beta_date: 1289242800, + audience: 'dedicated home brewers and serious enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/homebrew/Img/favicon.ico', + api_site_parameter: 'homebrew', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/homebrew/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/homebrew/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/homebrew/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'homebrew.meta', + relation: 'meta', + name: 'Homebrewing Meta Stack Exchange', + site_url: 'https://homebrew.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=homebrew.stackexchange.com', + }, + ], + name: 'Homebrewing', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1289847600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://homebrew.stackexchange.com', + }, + { + aliases: [ + 'https://meta.homebrewing.stackexchange.com', + 'https://meta.homebrew.stackexchange.com', + ], + api_site_parameter: 'homebrew.meta', + audience: 'dedicated home brewers and serious enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/homebrewmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/homebrewmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/homebrewmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/homebrewmeta/Img/apple-touch-icon.png', + name: 'Homebrewing Meta', + related_sites: [ + { + api_site_parameter: 'homebrew', + name: 'Homebrewing Stack Exchange', + relation: 'parent', + site_url: 'https://homebrew.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=homebrew.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://homebrew.meta.stackexchange.com', + }, + { + aliases: ['https://itsecurity.stackexchange.com'], + closed_beta_date: 1289502000, + audience: 'information security professionals', + favicon_url: 'https://cdn.sstatic.net/Sites/security/Img/favicon.ico', + api_site_parameter: 'security', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/security/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/security/Img/apple-touch-icon.png', + launch_date: 1310490000, + logo_url: 'https://cdn.sstatic.net/Sites/security/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'security.meta', + relation: 'meta', + name: 'Information Security Meta Stack Exchange', + site_url: 'https://security.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=security.stackexchange.com', + }, + ], + name: 'Information Security', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1290106800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://security.stackexchange.com', + }, + { + aliases: [ + 'https://meta.itsecurity.stackexchange.com', + 'https://meta.security.stackexchange.com', + ], + audience: 'information security professionals', + api_site_parameter: 'security.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/securitymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/securitymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/securitymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/securitymeta/Img/logo.png', + open_beta_date: 1309274425, + name: 'Information Security Meta', + related_sites: [ + { + api_site_parameter: 'security', + relation: 'parent', + name: 'Information Security Stack Exchange', + site_url: 'https://security.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=security.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://security.meta.stackexchange.com', + }, + { + aliases: ['https://writer.stackexchange.com', 'https://writers.stackexchange.com'], + closed_beta_date: 1290106800, + audience: + 'the craft of professional writing, including fiction, non-fiction, technical, scholarly, and commercial writing', + favicon_url: 'https://cdn.sstatic.net/Sites/writing/Img/favicon.ico', + api_site_parameter: 'writing', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/writing/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/writing/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/writing/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'writing.meta', + relation: 'meta', + name: 'Writing Meta Stack Exchange', + site_url: 'https://writing.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=writing.stackexchange.com', + }, + ], + name: 'Writing', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1290711600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://writing.stackexchange.com', + }, + { + aliases: [ + 'https://meta.writing.stackexchange.com', + 'https://meta.writers.stackexchange.com', + 'https://writers.meta.stackexchange.com', + ], + api_site_parameter: 'writing.meta', + audience: + 'the craft of professional writing, including fiction, non-fiction, technical, scholarly, and commercial writing', + favicon_url: 'https://cdn.sstatic.net/Sites/writingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/writingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/writingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/writingmeta/Img/apple-touch-icon.png', + name: 'Writing Meta', + related_sites: [ + { + api_site_parameter: 'writing', + name: 'Writing Stack Exchange', + relation: 'parent', + site_url: 'https://writing.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=writing.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://writing.meta.stackexchange.com', + }, + { + aliases: ['https://avp.stackexchange.com'], + closed_beta_date: 1291748400, + audience: + 'engineers, producers, editors, and enthusiasts spanning the fields of video, and media creation', + favicon_url: 'https://cdn.sstatic.net/Sites/avp/Img/favicon.ico', + api_site_parameter: 'video', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/avp/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/avp/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/avp/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'video.meta', + relation: 'meta', + name: 'Video Production Meta Stack Exchange', + site_url: 'https://video.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=video.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Video Production', + open_beta_date: 1292353200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://video.stackexchange.com', + }, + { + aliases: ['https://meta.avp.stackexchange.com', 'https://meta.video.stackexchange.com'], + audience: + 'engineers, producers, editors, and enthusiasts spanning the fields of video, and media creation', + api_site_parameter: 'video.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/avpmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/avpmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/avpmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/avpmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Video Production Meta', + related_sites: [ + { + api_site_parameter: 'video', + relation: 'parent', + name: 'Video Production Stack Exchange', + site_url: 'https://video.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=video.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://video.meta.stackexchange.com', + }, + { + aliases: [ + 'https://graphicsdesign.stackexchange.com', + 'https://graphicdesigns.stackexchange.com', + ], + closed_beta_date: 1294167600, + audience: 'Graphic Design professionals, students, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/graphicdesign/Img/favicon.ico', + api_site_parameter: 'graphicdesign', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/graphicdesign/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/graphicdesign/Img/apple-touch-icon.png', + launch_date: 1396459790, + logo_url: 'https://cdn.sstatic.net/Sites/graphicdesign/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'graphicdesign.meta', + relation: 'meta', + name: 'Graphic Design Meta Stack Exchange', + site_url: 'https://graphicdesign.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=graphicdesign.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Graphic Design', + open_beta_date: 1294772400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://graphicdesign.stackexchange.com', + }, + { + aliases: ['https://meta.graphicdesign.stackexchange.com'], + audience: 'Graphic Design professionals, students, and enthusiasts', + api_site_parameter: 'graphicdesign.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/graphicdesignmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/graphicdesignmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/graphicdesignmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/graphicdesignmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Graphic Design Meta', + related_sites: [ + { + api_site_parameter: 'graphicdesign', + relation: 'parent', + name: 'Graphic Design Stack Exchange', + site_url: 'https://graphicdesign.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=graphicdesign.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://graphicdesign.meta.stackexchange.com', + }, + { + closed_beta_date: 1294081200, + audience: + 'database professionals who wish to improve their database skills and learn from others in the community', + favicon_url: 'https://cdn.sstatic.net/Sites/dba/Img/favicon.ico', + api_site_parameter: 'dba', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/dba/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/dba/Img/apple-touch-icon.png', + launch_date: 1313521200, + logo_url: 'https://cdn.sstatic.net/Sites/dba/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'dba.meta', + relation: 'meta', + name: 'Database Administrators Meta Stack Exchange', + site_url: 'https://dba.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=dba.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Database Administrators', + open_beta_date: 1294686000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://dba.stackexchange.com', + }, + { + aliases: ['https://meta.dba.stackexchange.com'], + audience: + 'database professionals who wish to improve their database skills and learn from others in the community', + api_site_parameter: 'dba.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/dbameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/dbameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/dbameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/dbameta/Img/logo.png', + open_beta_date: 1316787014, + name: 'Database Administrators Meta', + related_sites: [ + { + api_site_parameter: 'dba', + relation: 'parent', + name: 'Database Administrators Stack Exchange', + site_url: 'https://dba.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=dba.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#F8F8F8', + tag_foreground_color: '#707070', + link_color: '#727272', + }, + site_type: 'meta_site', + site_url: 'https://dba.meta.stackexchange.com', + }, + { + aliases: ['https://sciencefiction.stackexchange.com', 'https://fantasy.stackexchange.com'], + closed_beta_date: 1294772400, + audience: 'science fiction and fantasy enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/scifi/Img/favicon.ico', + api_site_parameter: 'scifi', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/scifi/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/scifi/Img/apple-touch-icon.png', + launch_date: 1323802800, + logo_url: 'https://cdn.sstatic.net/Sites/scifi/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'scifi.meta', + relation: 'meta', + name: 'Science Fiction & Fantasy Meta Stack Exchange', + site_url: 'https://scifi.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=scifi.stackexchange.com', + }, + ], + name: 'Science Fiction & Fantasy', + styling: { + tag_background_color: '#d9e6ec', + tag_foreground_color: '#777', + link_color: '#0077CC', + }, + open_beta_date: 1295377200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://scifi.stackexchange.com', + }, + { + aliases: ['https://meta.scifi.stackexchange.com'], + api_site_parameter: 'scifi.meta', + audience: 'science fiction and fantasy enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/scifimeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/scifimeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/scifimeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/scifimeta/Img/logo.png', + name: 'Science Fiction & Fantasy Meta', + related_sites: [ + { + api_site_parameter: 'scifi', + name: 'Science Fiction & Fantasy Stack Exchange', + relation: 'parent', + site_url: 'https://scifi.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=scifi.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://scifi.meta.stackexchange.com', + }, + { + closed_beta_date: 1295463600, + audience: 'peer programmer code reviews', + favicon_url: 'https://cdn.sstatic.net/Sites/codereview/Img/favicon.ico', + api_site_parameter: 'codereview', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/codereview/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/codereview/Img/apple-touch-icon.png', + launch_date: 1436881020, + logo_url: 'https://cdn.sstatic.net/Sites/codereview/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'codereview.meta', + relation: 'meta', + name: 'Code Review Meta Stack Exchange', + site_url: 'https://codereview.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=codereview.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Code Review', + open_beta_date: 1296068400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://codereview.stackexchange.com', + }, + { + aliases: ['https://meta.codereview.stackexchange.com'], + audience: 'peer programmer code reviews', + api_site_parameter: 'codereview.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/codereviewmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/codereviewmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/codereviewmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/codereviewmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters'], + name: 'Code Review Meta', + related_sites: [ + { + api_site_parameter: 'codereview', + relation: 'parent', + name: 'Code Review Stack Exchange', + site_url: 'https://codereview.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=codereview.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://codereview.meta.stackexchange.com', + }, + { + closed_beta_date: 1296154800, + audience: 'programming puzzle enthusiasts and code golfers', + favicon_url: 'https://cdn.sstatic.net/Sites/codegolf/Img/favicon.ico', + api_site_parameter: 'codegolf', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/codegolf/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/codegolf/Img/apple-touch-icon.png', + launch_date: 1456246452, + logo_url: 'https://cdn.sstatic.net/Sites/codegolf/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'codegolf.meta', + relation: 'meta', + name: 'Code Golf Meta Stack Exchange', + site_url: 'https://codegolf.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=codegolf.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Code Golf', + open_beta_date: 1296759600, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://codegolf.stackexchange.com', + }, + { + aliases: ['https://meta.codegolf.stackexchange.com'], + audience: 'programming puzzle enthusiasts and code golfers', + api_site_parameter: 'codegolf.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/codegolfmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/codegolfmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/codegolfmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/codegolfmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'EscapedMathJaxDelimiters', 'Prettify'], + name: 'Code Golf Meta', + related_sites: [ + { + api_site_parameter: 'codegolf', + relation: 'parent', + name: 'Code Golf Stack Exchange', + site_url: 'https://codegolf.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=codegolf.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://codegolf.meta.stackexchange.com', + }, + { + closed_beta_date: 1296500400, + audience: 'finance professionals and academics', + favicon_url: 'https://cdn.sstatic.net/Sites/quant/Img/favicon.ico', + api_site_parameter: 'quant', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/quant/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/quant/Img/apple-touch-icon.png', + launch_date: 1481567382, + logo_url: 'https://cdn.sstatic.net/Sites/quant/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'quant.meta', + relation: 'meta', + name: 'Quantitative Finance Meta Stack Exchange', + site_url: 'https://quant.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=quant.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Quantitative Finance', + open_beta_date: 1297105200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://quant.stackexchange.com', + }, + { + aliases: ['https://meta.quant.stackexchange.com'], + audience: 'finance professionals and academics', + api_site_parameter: 'quant.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/quantmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/quantmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/quantmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/quantmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Quantitative Finance Meta', + related_sites: [ + { + api_site_parameter: 'quant', + relation: 'parent', + name: 'Quantitative Finance Stack Exchange', + site_url: 'https://quant.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=quant.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://quant.meta.stackexchange.com', + }, + { + closed_beta_date: 1297105200, + audience: 'project managers', + favicon_url: 'https://cdn.sstatic.net/Sites/pm/Img/favicon.ico', + api_site_parameter: 'pm', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/pm/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/pm/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/pm/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'pm.meta', + relation: 'meta', + name: 'Project Management Meta Stack Exchange', + site_url: 'https://pm.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=pm.stackexchange.com', + }, + ], + name: 'Project Management', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1297710000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://pm.stackexchange.com', + }, + { + aliases: ['https://meta.pm.stackexchange.com'], + api_site_parameter: 'pm.meta', + audience: 'project managers', + favicon_url: 'https://cdn.sstatic.net/Sites/pmmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/pmmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/pmmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/pmmeta/Img/apple-touch-icon.png', + name: 'Project Management Meta', + related_sites: [ + { + api_site_parameter: 'pm', + name: 'Project Management Stack Exchange', + relation: 'parent', + site_url: 'https://pm.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=pm.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://pm.meta.stackexchange.com', + }, + { + aliases: ['https://skeptic.stackexchange.com', 'https://skepticexchange.com'], + closed_beta_date: 1298574000, + audience: 'scientific skepticism', + favicon_url: 'https://cdn.sstatic.net/Sites/skeptics/Img/favicon.ico', + api_site_parameter: 'skeptics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/skeptics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/skeptics/Img/apple-touch-icon.png', + launch_date: 1332366021, + logo_url: 'https://cdn.sstatic.net/Sites/skeptics/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'skeptics.meta', + relation: 'meta', + name: 'Skeptics Meta Stack Exchange', + site_url: 'https://skeptics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=skeptics.stackexchange.com', + }, + ], + name: 'Skeptics', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1299178800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://skeptics.stackexchange.com', + }, + { + aliases: ['https://meta.skeptics.stackexchange.com'], + api_site_parameter: 'skeptics.meta', + audience: 'scientific skepticism', + favicon_url: 'https://cdn.sstatic.net/Sites/skepticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/skepticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/skepticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/skepticsmeta/Img/logo.png', + name: 'Skeptics Meta', + related_sites: [ + { + api_site_parameter: 'skeptics', + name: 'Skeptics Stack Exchange', + relation: 'parent', + site_url: 'https://skeptics.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=skeptics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://skeptics.meta.stackexchange.com', + }, + { + closed_beta_date: 1299006000, + audience: + 'physical fitness professionals, athletes, trainers, and those providing health-related needs', + favicon_url: 'https://cdn.sstatic.net/Sites/fitness/Img/favicon.ico', + api_site_parameter: 'fitness', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/fitness/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/fitness/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/fitness/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'fitness.meta', + relation: 'meta', + name: 'Physical Fitness Meta Stack Exchange', + site_url: 'https://fitness.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=fitness.stackexchange.com', + }, + ], + name: 'Physical Fitness', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1299610800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://fitness.stackexchange.com', + }, + { + aliases: ['https://meta.fitness.stackexchange.com'], + api_site_parameter: 'fitness.meta', + audience: + 'physical fitness professionals, athletes, trainers, and those providing health-related needs', + favicon_url: 'https://cdn.sstatic.net/Sites/fitnessmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/fitnessmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/fitnessmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/fitnessmeta/Img/apple-touch-icon.png', + name: 'Physical Fitness Meta', + related_sites: [ + { + api_site_parameter: 'fitness', + name: 'Physical Fitness Stack Exchange', + relation: 'parent', + site_url: 'https://fitness.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=fitness.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://fitness.meta.stackexchange.com', + }, + { + closed_beta_date: 1299092400, + audience: 'Drupal developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/drupal/Img/favicon.ico', + api_site_parameter: 'drupal', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/drupal/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/drupal/Img/apple-touch-icon.png', + launch_date: 1314738000, + logo_url: 'https://cdn.sstatic.net/Sites/drupal/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'drupal.meta', + relation: 'meta', + name: 'Drupal Answers Meta', + site_url: 'https://drupal.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=drupal.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#F8F8F8', + tag_foreground_color: '#707070', + link_color: '#3D89B7', + }, + name: 'Drupal Answers', + open_beta_date: 1299697200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://drupal.stackexchange.com', + }, + { + aliases: ['https://meta.drupal.stackexchange.com'], + api_site_parameter: 'drupal.meta', + audience: 'Drupal developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/drupalmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/drupalmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/drupalmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/drupalmeta/Img/logo.png', + name: 'Drupal Answers Meta', + related_sites: [ + { + api_site_parameter: 'drupal', + name: 'Drupal Answers', + relation: 'parent', + site_url: 'https://drupal.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=drupal.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#A69635', + }, + site_url: 'https://drupal.meta.stackexchange.com', + }, + { + aliases: ['https://garage.stackexchange.com'], + closed_beta_date: 1299524400, + audience: 'mechanics and DIY enthusiast owners of cars, trucks, and motorcycles', + favicon_url: 'https://cdn.sstatic.net/Sites/mechanics/Img/favicon.ico', + api_site_parameter: 'mechanics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/mechanics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mechanics/Img/apple-touch-icon.png', + launch_date: 1473796633, + logo_url: 'https://cdn.sstatic.net/Sites/mechanics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'mechanics.meta', + relation: 'meta', + name: 'Motor Vehicle Maintenance & Repair Meta Stack Exchange', + site_url: 'https://mechanics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mechanics.stackexchange.com', + }, + ], + name: 'Motor Vehicle Maintenance & Repair', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1300129200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://mechanics.stackexchange.com', + }, + { + aliases: ['https://meta.garage.stackexchange.com', 'https://meta.mechanics.stackexchange.com'], + api_site_parameter: 'mechanics.meta', + audience: 'mechanics and DIY enthusiast owners of cars, trucks, and motorcycles', + favicon_url: 'https://cdn.sstatic.net/Sites/mechanicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mechanicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mechanicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mechanicsmeta/Img/apple-touch-icon.png', + name: 'Motor Vehicle Maintenance & Repair Meta', + related_sites: [ + { + api_site_parameter: 'mechanics', + name: 'Motor Vehicle Maintenance & Repair Stack Exchange', + relation: 'parent', + site_url: 'https://mechanics.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=mechanics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://mechanics.meta.stackexchange.com', + }, + { + closed_beta_date: 1301425200, + audience: 'parents, grandparents, nannies and others with a parenting role', + favicon_url: 'https://cdn.sstatic.net/Sites/parenting/Img/favicon.ico', + api_site_parameter: 'parenting', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/parenting/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/parenting/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/parenting/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'parenting.meta', + relation: 'meta', + name: 'Parenting Meta Stack Exchange', + site_url: 'https://parenting.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=parenting.stackexchange.com', + }, + ], + name: 'Parenting', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1302030000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://parenting.stackexchange.com', + }, + { + aliases: ['https://meta.parenting.stackexchange.com'], + api_site_parameter: 'parenting.meta', + audience: 'parents, grandparents, nannies and others with a parenting role', + favicon_url: 'https://cdn.sstatic.net/Sites/parentingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/parentingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/parentingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/parentingmeta/Img/apple-touch-icon.png', + name: 'Parenting Meta', + related_sites: [ + { + api_site_parameter: 'parenting', + name: 'Parenting Stack Exchange', + relation: 'parent', + site_url: 'https://parenting.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=parenting.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://parenting.meta.stackexchange.com', + }, + { + aliases: ['https://sharepointoverflow.com', 'https://www.sharepointoverflow.com'], + closed_beta_date: 1302202800, + audience: 'SharePoint enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/sharepoint/Img/favicon.ico', + api_site_parameter: 'sharepoint', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sharepoint/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sharepoint/Img/apple-touch-icon.png', + launch_date: 1315940400, + logo_url: 'https://cdn.sstatic.net/Sites/sharepoint/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'sharepoint.meta', + relation: 'meta', + name: 'SharePoint Meta Stack Exchange', + site_url: 'https://sharepoint.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sharepoint.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#707070', + link_color: '#0077CC', + }, + name: 'SharePoint', + open_beta_date: 1302202800, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sharepoint.stackexchange.com', + }, + { + aliases: ['https://meta.sharepoint.stackexchange.com'], + api_site_parameter: 'sharepoint.meta', + audience: 'SharePoint enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/sharepointmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/sharepointmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sharepointmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/sharepointmeta/Img/logo.png', + name: 'SharePoint Meta', + related_sites: [ + { + api_site_parameter: 'sharepoint', + name: 'SharePoint Stack Exchange', + relation: 'parent', + site_url: 'https://sharepoint.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=sharepoint.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://sharepoint.meta.stackexchange.com', + }, + { + aliases: ['https://guitars.stackexchange.com', 'https://guitar.stackexchange.com'], + closed_beta_date: 1303844400, + audience: 'musicians, students, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/music/Img/favicon.ico', + api_site_parameter: 'music', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/music/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/music/Img/apple-touch-icon.png', + launch_date: 1441805820, + logo_url: 'https://cdn.sstatic.net/Sites/music/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'music.meta', + relation: 'meta', + name: 'Music: Practice & Theory Meta Stack Exchange', + site_url: 'https://music.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=music.stackexchange.com', + }, + ], + name: 'Music: Practice & Theory', + styling: { + tag_background_color: '#ECF2F7', + tag_foreground_color: '#61798A', + link_color: '#0077CC', + }, + open_beta_date: 1304449200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://music.stackexchange.com', + }, + { + aliases: ['https://meta.music.stackexchange.com'], + api_site_parameter: 'music.meta', + audience: 'musicians, students, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/musicmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/musicmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/musicmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/musicmeta/Img/logo.png', + name: 'Music: Practice & Theory Meta', + related_sites: [ + { + api_site_parameter: 'music', + name: 'Music: Practice & Theory Stack Exchange', + relation: 'parent', + site_url: 'https://music.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=music.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://music.meta.stackexchange.com', + }, + { + closed_beta_date: 1304449200, + audience: 'software quality control experts, automation engineers, and software testers', + favicon_url: 'https://cdn.sstatic.net/Sites/sqa/Img/favicon.ico', + api_site_parameter: 'sqa', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sqa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sqa/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/sqa/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'sqa.meta', + relation: 'meta', + name: 'Software Quality Assurance & Testing Meta Stack Exchange', + site_url: 'https://sqa.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sqa.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Software Quality Assurance & Testing', + open_beta_date: 1305054000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sqa.stackexchange.com', + }, + { + aliases: ['https://meta.sqa.stackexchange.com'], + audience: 'software quality control experts, automation engineers, and software testers', + api_site_parameter: 'sqa.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/sqameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sqameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sqameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/sqameta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Software Quality Assurance & Testing Meta', + related_sites: [ + { + api_site_parameter: 'sqa', + relation: 'parent', + name: 'Software Quality Assurance & Testing Stack Exchange', + site_url: 'https://sqa.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sqa.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://sqa.meta.stackexchange.com', + }, + { + aliases: [ + 'https://mi.yodeya.com', + 'https://yodeya.com', + 'https://yodeya.stackexchange.com', + 'https://miyodeya.com', + ], + closed_beta_date: 1305054000, + audience: + 'those who base their lives on Jewish law and tradition and anyone interested in learning more', + favicon_url: 'https://cdn.sstatic.net/Sites/judaism/Img/favicon.ico', + api_site_parameter: 'judaism', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/judaism/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/judaism/Img/apple-touch-icon.png', + launch_date: 1336500000, + logo_url: 'https://cdn.sstatic.net/Sites/judaism/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'judaism.meta', + relation: 'meta', + name: 'Mi Yodeya Meta', + site_url: 'https://judaism.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=judaism.stackexchange.com', + }, + ], + name: 'Mi Yodeya', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1305054000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://judaism.stackexchange.com', + }, + { + aliases: ['https://meta.judaism.stackexchange.com'], + api_site_parameter: 'judaism.meta', + audience: + 'those who base their lives on Jewish law and tradition and anyone interested in learning more', + favicon_url: 'https://cdn.sstatic.net/Sites/judaismmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/judaismmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/judaismmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/judaismmeta/Img/logo.png', + name: 'Mi Yodeya Meta', + related_sites: [ + { + api_site_parameter: 'judaism', + name: 'Mi Yodeya', + relation: 'parent', + site_url: 'https://judaism.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=judaism.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://judaism.meta.stackexchange.com', + }, + { + aliases: ['https://deutsch.stackexchange.com'], + closed_beta_date: 1306263600, + audience: + 'speakers of German wanting to discuss the finer points of the language and translation', + favicon_url: 'https://cdn.sstatic.net/Sites/german/Img/favicon.ico', + api_site_parameter: 'german', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/german/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/german/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/german/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'german.meta', + relation: 'meta', + name: 'German Language Meta Stack Exchange', + site_url: 'https://german.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=german.stackexchange.com', + }, + ], + name: 'German Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1306868400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://german.stackexchange.com', + }, + { + aliases: ['https://meta.german.stackexchange.com'], + api_site_parameter: 'german.meta', + audience: + 'speakers of German wanting to discuss the finer points of the language and translation', + favicon_url: 'https://cdn.sstatic.net/Sites/germanmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/germanmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/germanmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/germanmeta/Img/apple-touch-icon.png', + name: 'German Language Meta', + related_sites: [ + { + api_site_parameter: 'german', + name: 'German Language Stack Exchange', + relation: 'parent', + site_url: 'https://german.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=german.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://german.meta.stackexchange.com', + }, + { + closed_beta_date: 1306868400, + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Japanese language', + favicon_url: 'https://cdn.sstatic.net/Sites/japanese/Img/favicon.ico', + api_site_parameter: 'japanese', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/japanese/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/japanese/Img/apple-touch-icon.png', + launch_date: 1441805820, + logo_url: 'https://cdn.sstatic.net/Sites/japanese/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'japanese.meta', + relation: 'meta', + name: 'Japanese Language Meta Stack Exchange', + site_url: 'https://japanese.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=japanese.stackexchange.com', + }, + ], + name: 'Japanese Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1307473200, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://japanese.stackexchange.com', + }, + { + aliases: ['https://meta.japanese.stackexchange.com'], + api_site_parameter: 'japanese.meta', + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Japanese language', + favicon_url: 'https://cdn.sstatic.net/Sites/japanesemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/japanesemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/japanesemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/japanesemeta/Img/logo.png', + name: 'Japanese Language Meta', + related_sites: [ + { + api_site_parameter: 'japanese', + name: 'Japanese Language Stack Exchange', + relation: 'parent', + site_url: 'https://japanese.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=japanese.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://japanese.meta.stackexchange.com', + }, + { + closed_beta_date: 1307473200, + audience: + 'those interested in the study of the fundamental nature of knowledge, reality, and existence', + favicon_url: 'https://cdn.sstatic.net/Sites/philosophy/Img/favicon.ico', + api_site_parameter: 'philosophy', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/philosophy/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/philosophy/Img/apple-touch-icon.png', + launch_date: 1467819836, + logo_url: 'https://cdn.sstatic.net/Sites/philosophy/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'philosophy.meta', + relation: 'meta', + name: 'Philosophy Meta Stack Exchange', + site_url: 'https://philosophy.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=philosophy.stackexchange.com', + }, + ], + name: 'Philosophy', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1308078000, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://philosophy.stackexchange.com', + }, + { + aliases: ['https://meta.philosophy.stackexchange.com'], + api_site_parameter: 'philosophy.meta', + audience: + 'those interested in the study of the fundamental nature of knowledge, reality, and existence', + favicon_url: 'https://cdn.sstatic.net/Sites/philosophymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/philosophymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/philosophymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/philosophymeta/Img/apple-touch-icon.png', + name: 'Philosophy Meta', + related_sites: [ + { + api_site_parameter: 'philosophy', + name: 'Philosophy Stack Exchange', + relation: 'parent', + site_url: 'https://philosophy.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=philosophy.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://philosophy.meta.stackexchange.com', + }, + { + aliases: ['https://landscaping.stackexchange.com'], + closed_beta_date: 1307559600, + audience: 'gardeners and landscapers', + favicon_url: 'https://cdn.sstatic.net/Sites/gardening/Img/favicon.ico', + api_site_parameter: 'gardening', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/gardening/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gardening/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/gardening/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'gardening.meta', + relation: 'meta', + name: 'Gardening & Landscaping Meta Stack Exchange', + site_url: 'https://gardening.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=gardening.stackexchange.com', + }, + ], + name: 'Gardening & Landscaping', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1308164400, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://gardening.stackexchange.com', + }, + { + aliases: ['https://meta.gardening.stackexchange.com'], + api_site_parameter: 'gardening.meta', + audience: 'gardeners and landscapers', + favicon_url: 'https://cdn.sstatic.net/Sites/gardeningmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/gardeningmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/gardeningmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/gardeningmeta/Img/apple-touch-icon.png', + name: 'Gardening & Landscaping Meta', + related_sites: [ + { + api_site_parameter: 'gardening', + name: 'Gardening & Landscaping Stack Exchange', + relation: 'parent', + site_url: 'https://gardening.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=gardening.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://gardening.meta.stackexchange.com', + }, + { + closed_beta_date: 1308682800, + audience: 'road warriors and seasoned travelers', + favicon_url: 'https://cdn.sstatic.net/Sites/travel/Img/favicon.ico', + api_site_parameter: 'travel', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/travel/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/travel/Img/apple-touch-icon.png', + launch_date: 1358885491, + logo_url: 'https://cdn.sstatic.net/Sites/travel/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'travel.meta', + relation: 'meta', + name: 'Travel Meta Stack Exchange', + site_url: 'https://travel.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=travel.stackexchange.com', + }, + ], + name: 'Travel', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1309286870, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://travel.stackexchange.com', + }, + { + aliases: ['https://meta.travel.stackexchange.com'], + api_site_parameter: 'travel.meta', + audience: 'road warriors and seasoned travelers', + favicon_url: 'https://cdn.sstatic.net/Sites/travelmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/travelmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/travelmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/travelmeta/Img/logo.png', + name: 'Travel Meta', + related_sites: [ + { + api_site_parameter: 'travel', + name: 'Travel Stack Exchange', + relation: 'parent', + site_url: 'https://travel.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=travel.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://travel.meta.stackexchange.com', + }, + { + aliases: ['https://cryptography.stackexchange.com'], + closed_beta_date: 1310497200, + audience: 'software developers, mathematicians and others interested in cryptography', + favicon_url: 'https://cdn.sstatic.net/Sites/crypto/Img/favicon.ico', + api_site_parameter: 'crypto', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/crypto/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/crypto/Img/apple-touch-icon.png', + launch_date: 1435671420, + logo_url: 'https://cdn.sstatic.net/Sites/crypto/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'crypto.meta', + relation: 'meta', + name: 'Cryptography Meta Stack Exchange', + site_url: 'https://crypto.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=crypto.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Cryptography', + open_beta_date: 1312315906, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://crypto.stackexchange.com', + }, + { + aliases: [ + 'https://meta.cryptography.stackexchange.com', + 'https://meta.crypto.stackexchange.com', + ], + audience: 'software developers, mathematicians and others interested in cryptography', + api_site_parameter: 'crypto.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/cryptometa/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cryptometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cryptometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cryptometa/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Cryptography Meta', + related_sites: [ + { + api_site_parameter: 'crypto', + relation: 'parent', + name: 'Cryptography Stack Exchange', + site_url: 'https://crypto.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=crypto.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://crypto.meta.stackexchange.com', + }, + { + aliases: ['https://signals.stackexchange.com'], + closed_beta_date: 1313521200, + audience: 'practitioners of the art and science of signal, image and video processing', + favicon_url: 'https://cdn.sstatic.net/Sites/dsp/Img/favicon.ico', + api_site_parameter: 'dsp', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/dsp/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/dsp/Img/apple-touch-icon.png', + launch_date: 1447708127, + logo_url: 'https://cdn.sstatic.net/Sites/dsp/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'dsp.meta', + relation: 'meta', + name: 'Signal Processing Meta Stack Exchange', + site_url: 'https://dsp.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=dsp.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Signal Processing', + open_beta_date: 1315343961, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://dsp.stackexchange.com', + }, + { + aliases: ['https://meta.dsp.stackexchange.com'], + audience: 'practitioners of the art and science of signal, image and video processing', + api_site_parameter: 'dsp.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/dspmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/dspmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/dspmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/dspmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Signal Processing Meta', + related_sites: [ + { + api_site_parameter: 'dsp', + relation: 'parent', + name: 'Signal Processing Stack Exchange', + site_url: 'https://dsp.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=dsp.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://dsp.meta.stackexchange.com', + }, + { + closed_beta_date: 1313607600, + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the French language', + favicon_url: 'https://cdn.sstatic.net/Sites/french/Img/favicon.ico', + api_site_parameter: 'french', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/french/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/french/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/french/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'french.meta', + relation: 'meta', + name: 'French Language Meta Stack Exchange', + site_url: 'https://french.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=french.stackexchange.com', + }, + ], + name: 'French Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1314214299, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://french.stackexchange.com', + }, + { + aliases: ['https://meta.french.stackexchange.com'], + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the French language', + api_site_parameter: 'french.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/frenchmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/frenchmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/frenchmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/frenchmeta/Img/apple-touch-icon.png', + open_beta_date: 1315426246, + name: 'French Language Meta', + related_sites: [ + { + api_site_parameter: 'french', + relation: 'parent', + name: 'French Language Stack Exchange', + site_url: 'https://french.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=french.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://french.meta.stackexchange.com', + }, + { + closed_beta_date: 1314126000, + audience: 'committed Christians, experts in Christianity and those interested in learning more', + favicon_url: 'https://cdn.sstatic.net/Sites/christianity/Img/favicon.ico', + api_site_parameter: 'christianity', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/christianity/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/christianity/Img/apple-touch-icon.png', + launch_date: 1369832400, + logo_url: 'https://cdn.sstatic.net/Sites/christianity/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'christianity.meta', + relation: 'meta', + name: 'Christianity Meta Stack Exchange', + site_url: 'https://christianity.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=christianity.stackexchange.com', + }, + ], + name: 'Christianity', + styling: { + tag_background_color: '#fcf5e0', + tag_foreground_color: '#ab9e67', + link_color: '#0077CC', + }, + open_beta_date: 1314734811, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://christianity.stackexchange.com', + }, + { + aliases: ['https://meta.christianity.stackexchange.com'], + api_site_parameter: 'christianity.meta', + audience: 'committed Christians, experts in Christianity and those interested in learning more', + favicon_url: 'https://cdn.sstatic.net/Sites/christianitymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/christianitymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/christianitymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/christianitymeta/Img/logo.png', + name: 'Christianity Meta', + related_sites: [ + { + api_site_parameter: 'christianity', + name: 'Christianity Stack Exchange', + relation: 'parent', + site_url: 'https://christianity.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=christianity.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://christianity.meta.stackexchange.com', + }, + { + closed_beta_date: 1314730800, + audience: 'Bitcoin crypto-currency enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/bitcoin/Img/favicon.ico', + api_site_parameter: 'bitcoin', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/bitcoin/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bitcoin/Img/apple-touch-icon.png', + launch_date: 1507579373, + logo_url: 'https://cdn.sstatic.net/Sites/bitcoin/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'bitcoin.meta', + relation: 'meta', + name: 'Bitcoin Meta Stack Exchange', + site_url: 'https://bitcoin.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bitcoin.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Bitcoin', + open_beta_date: 1315422597, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://bitcoin.stackexchange.com', + }, + { + aliases: ['https://meta.bitcoin.stackexchange.com'], + api_site_parameter: 'bitcoin.meta', + audience: 'Bitcoin crypto-currency enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/bitcoinmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bitcoinmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bitcoinmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/bitcoinmeta/Img/apple-touch-icon.png', + name: 'Bitcoin Meta', + related_sites: [ + { + api_site_parameter: 'bitcoin', + name: 'Bitcoin Stack Exchange', + relation: 'parent', + site_url: 'https://bitcoin.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=bitcoin.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://bitcoin.meta.stackexchange.com', + }, + { + aliases: ['https://linguist.stackexchange.com'], + closed_beta_date: 1315940400, + audience: + 'professional linguists and others with an interest in linguistic research and theory', + favicon_url: 'https://cdn.sstatic.net/Sites/linguistics/Img/favicon.ico', + api_site_parameter: 'linguistics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/linguistics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/linguistics/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/linguistics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'linguistics.meta', + relation: 'meta', + name: 'Linguistics Meta Stack Exchange', + site_url: 'https://linguistics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=linguistics.stackexchange.com', + }, + ], + name: 'Linguistics', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1316539203, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://linguistics.stackexchange.com', + }, + { + aliases: ['https://meta.linguistics.stackexchange.com'], + api_site_parameter: 'linguistics.meta', + audience: + 'professional linguists and others with an interest in linguistic research and theory', + favicon_url: 'https://cdn.sstatic.net/Sites/linguisticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/linguisticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/linguisticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/linguisticsmeta/Img/apple-touch-icon.png', + name: 'Linguistics Meta', + related_sites: [ + { + api_site_parameter: 'linguistics', + name: 'Linguistics Stack Exchange', + relation: 'parent', + site_url: 'https://linguistics.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=linguistics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://linguistics.meta.stackexchange.com', + }, + { + closed_beta_date: 1317754800, + audience: + 'professors, theologians, and those interested in exegetical analysis of biblical texts', + favicon_url: 'https://cdn.sstatic.net/Sites/hermeneutics/Img/favicon.ico', + api_site_parameter: 'hermeneutics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/hermeneutics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hermeneutics/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/hermeneutics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'hermeneutics.meta', + relation: 'meta', + name: 'Biblical Hermeneutics Meta Stack Exchange', + site_url: 'https://hermeneutics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=hermeneutics.stackexchange.com', + }, + ], + name: 'Biblical Hermeneutics', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1318358448, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://hermeneutics.stackexchange.com', + }, + { + aliases: ['https://meta.hermeneutics.stackexchange.com'], + api_site_parameter: 'hermeneutics.meta', + audience: + 'professors, theologians, and those interested in exegetical analysis of biblical texts', + favicon_url: 'https://cdn.sstatic.net/Sites/hermeneuticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/hermeneuticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hermeneuticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hermeneuticsmeta/Img/apple-touch-icon.png', + name: 'Biblical Hermeneutics Meta', + related_sites: [ + { + api_site_parameter: 'hermeneutics', + name: 'Biblical Hermeneutics Stack Exchange', + relation: 'parent', + site_url: 'https://hermeneutics.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=hermeneutics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://hermeneutics.meta.stackexchange.com', + }, + { + closed_beta_date: 1318359600, + audience: 'historians and history buffs', + favicon_url: 'https://cdn.sstatic.net/Sites/history/Img/favicon.ico', + api_site_parameter: 'history', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/history/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/history/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/history/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'history.meta', + relation: 'meta', + name: 'History Meta Stack Exchange', + site_url: 'https://history.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=history.stackexchange.com', + }, + ], + name: 'History', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1319568393, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://history.stackexchange.com', + }, + { + aliases: ['https://meta.history.stackexchange.com'], + api_site_parameter: 'history.meta', + audience: 'historians and history buffs', + favicon_url: 'https://cdn.sstatic.net/Sites/historymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/historymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/historymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/historymeta/Img/apple-touch-icon.png', + name: 'History Meta', + related_sites: [ + { + api_site_parameter: 'history', + name: 'History Stack Exchange', + relation: 'parent', + site_url: 'https://history.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=history.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://history.meta.stackexchange.com', + }, + { + closed_beta_date: 1319569200, + audience: 'LEGO® and building block enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/bricks/Img/favicon.ico', + api_site_parameter: 'bricks', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/bricks/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bricks/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/bricks/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'bricks.meta', + relation: 'meta', + name: 'Bricks Meta', + site_url: 'https://bricks.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bricks.stackexchange.com', + }, + ], + name: 'Bricks', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1320171942, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://bricks.stackexchange.com', + }, + { + aliases: ['https://meta.bricks.stackexchange.com'], + api_site_parameter: 'bricks.meta', + audience: 'LEGO® and building block enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/bricksmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/bricksmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bricksmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/bricksmeta/Img/apple-touch-icon.png', + name: 'Bricks Meta', + related_sites: [ + { + api_site_parameter: 'bricks', + name: 'Bricks', + relation: 'parent', + site_url: 'https://bricks.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=bricks.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://bricks.meta.stackexchange.com', + }, + { + aliases: ['https://espanol.stackexchange.com'], + closed_beta_date: 1321383600, + audience: + 'linguists, teachers, students and Spanish language enthusiasts in general wanting to discuss the finer points of the language', + favicon_url: 'https://cdn.sstatic.net/Sites/spanish/Img/favicon.ico', + api_site_parameter: 'spanish', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/spanish/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/spanish/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/spanish/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'spanish.meta', + relation: 'meta', + name: 'Spanish Language Meta Stack Exchange', + site_url: 'https://spanish.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=spanish.stackexchange.com', + }, + ], + name: 'Spanish Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1321996468, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://spanish.stackexchange.com', + }, + { + aliases: ['https://meta.spanish.stackexchange.com'], + api_site_parameter: 'spanish.meta', + audience: + 'linguists, teachers, students and Spanish language enthusiasts in general wanting to discuss the finer points of the language', + favicon_url: 'https://cdn.sstatic.net/Sites/spanishmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/spanishmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/spanishmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/spanishmeta/Img/apple-touch-icon.png', + name: 'Spanish Language Meta', + related_sites: [ + { + api_site_parameter: 'spanish', + name: 'Spanish Language Stack Exchange', + relation: 'parent', + site_url: 'https://spanish.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=spanish.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://spanish.meta.stackexchange.com', + }, + { + closed_beta_date: 1322593200, + audience: 'scientists using computers to solve scientific problems', + favicon_url: 'https://cdn.sstatic.net/Sites/scicomp/Img/favicon.ico', + api_site_parameter: 'scicomp', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/scicomp/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/scicomp/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/scicomp/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'scicomp.meta', + relation: 'meta', + name: 'Computational Science Meta Stack Exchange', + site_url: 'https://scicomp.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=scicomp.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Computational Science', + open_beta_date: 1323202002, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://scicomp.stackexchange.com', + }, + { + aliases: ['https://meta.scicomp.stackexchange.com'], + audience: 'scientists using computers to solve scientific problems', + api_site_parameter: 'scicomp.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/scicompmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/scicompmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/scicompmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/scicompmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Computational Science Meta', + related_sites: [ + { + api_site_parameter: 'scicomp', + relation: 'parent', + name: 'Computational Science Stack Exchange', + site_url: 'https://scicomp.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=scicomp.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://scicomp.meta.stackexchange.com', + }, + { + aliases: ['https://tv.stackexchange.com'], + closed_beta_date: 1322679600, + audience: 'movie and TV enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/movies/Img/favicon.ico', + api_site_parameter: 'movies', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/movies/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/movies/Img/apple-touch-icon.png', + launch_date: 1422480963, + logo_url: 'https://cdn.sstatic.net/Sites/movies/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'movies.meta', + relation: 'meta', + name: 'Movies & TV Meta Stack Exchange', + site_url: 'https://movies.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=movies.stackexchange.com', + }, + ], + name: 'Movies & TV', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1323286864, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://movies.stackexchange.com', + }, + { + aliases: ['https://meta.tv.stackexchange.com', 'https://meta.movies.stackexchange.com'], + api_site_parameter: 'movies.meta', + audience: 'movie and TV enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/moviesmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/moviesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/moviesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/moviesmeta/Img/logo.png', + name: 'Movies & TV Meta', + related_sites: [ + { + api_site_parameter: 'movies', + name: 'Movies & TV Stack Exchange', + relation: 'parent', + site_url: 'https://movies.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=movies.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://movies.meta.stackexchange.com', + }, + { + closed_beta_date: 1323802800, + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Chinese language', + favicon_url: 'https://cdn.sstatic.net/Sites/chinese/Img/favicon.ico', + api_site_parameter: 'chinese', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/chinese/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chinese/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/chinese/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'chinese.meta', + relation: 'meta', + name: 'Chinese Language Meta Stack Exchange', + site_url: 'https://chinese.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=chinese.stackexchange.com', + }, + ], + name: 'Chinese Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1324489050, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://chinese.stackexchange.com', + }, + { + aliases: ['https://meta.chinese.stackexchange.com'], + api_site_parameter: 'chinese.meta', + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Chinese language', + favicon_url: 'https://cdn.sstatic.net/Sites/chinesemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/chinesemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chinesemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/chinesemeta/Img/apple-touch-icon.png', + name: 'Chinese Language Meta', + related_sites: [ + { + api_site_parameter: 'chinese', + name: 'Chinese Language Stack Exchange', + relation: 'parent', + site_url: 'https://chinese.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=chinese.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://chinese.meta.stackexchange.com', + }, + { + closed_beta_date: 1323889200, + audience: 'biology researchers, academics, and students', + favicon_url: 'https://cdn.sstatic.net/Sites/biology/Img/favicon.ico', + api_site_parameter: 'biology', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/biology/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/biology/Img/apple-touch-icon.png', + launch_date: 1432150236, + logo_url: 'https://cdn.sstatic.net/Sites/biology/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'biology.meta', + relation: 'meta', + name: 'Biology Meta Stack Exchange', + site_url: 'https://biology.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=biology.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Biology', + open_beta_date: 1324489117, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://biology.stackexchange.com', + }, + { + aliases: ['https://meta.biology.stackexchange.com'], + audience: 'biology researchers, academics, and students', + api_site_parameter: 'biology.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/biologymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/biologymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/biologymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/biologymeta/Img/logo.png', + markdown_extensions: ['MathJax', 'MHChemMathJax'], + name: 'Biology Meta', + related_sites: [ + { + api_site_parameter: 'biology', + relation: 'parent', + name: 'Biology Stack Exchange', + site_url: 'https://biology.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=biology.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://biology.meta.stackexchange.com', + }, + { + closed_beta_date: 1326222000, + audience: 'serious players and enthusiasts of poker', + favicon_url: 'https://cdn.sstatic.net/Sites/poker/Img/favicon.ico', + api_site_parameter: 'poker', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/poker/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/poker/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/poker/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'poker.meta', + relation: 'meta', + name: 'Poker Meta Stack Exchange', + site_url: 'https://poker.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=poker.stackexchange.com', + }, + ], + name: 'Poker', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1327433790, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://poker.stackexchange.com', + }, + { + aliases: ['https://meta.poker.stackexchange.com'], + api_site_parameter: 'poker.meta', + audience: 'serious players and enthusiasts of poker', + favicon_url: 'https://cdn.sstatic.net/Sites/pokermeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/pokermeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/pokermeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/pokermeta/Img/apple-touch-icon.png', + name: 'Poker Meta', + related_sites: [ + { + api_site_parameter: 'poker', + name: 'Poker Stack Exchange', + relation: 'parent', + site_url: 'https://poker.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=poker.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://poker.meta.stackexchange.com', + }, + { + closed_beta_date: 1326826800, + audience: 'users of Wolfram Mathematica', + favicon_url: 'https://cdn.sstatic.net/Sites/mathematica/Img/favicon.ico', + api_site_parameter: 'mathematica', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mathematica/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mathematica/Img/apple-touch-icon.png', + launch_date: 1342483200, + logo_url: 'https://cdn.sstatic.net/Sites/mathematica/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'mathematica.meta', + relation: 'meta', + name: 'Mathematica Meta Stack Exchange', + site_url: 'https://mathematica.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mathematica.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Mathematica', + open_beta_date: 1327515670, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://mathematica.stackexchange.com', + }, + { + aliases: ['https://meta.mathematica.stackexchange.com'], + api_site_parameter: 'mathematica.meta', + audience: 'users of Wolfram Mathematica', + favicon_url: 'https://cdn.sstatic.net/Sites/mathematicameta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mathematicameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mathematicameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mathematicameta/Img/logo.png', + name: 'Mathematica Meta', + related_sites: [ + { + api_site_parameter: 'mathematica', + name: 'Mathematica Stack Exchange', + relation: 'parent', + site_url: 'https://mathematica.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=mathematica.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://mathematica.meta.stackexchange.com', + }, + { + aliases: ['https://cogsci.stackexchange.com'], + closed_beta_date: 1326913200, + audience: + 'practitioners, researchers, and students in cognitive science, psychology, neuroscience, and psychiatry', + favicon_url: 'https://cdn.sstatic.net/Sites/psychology/Img/favicon.ico', + api_site_parameter: 'psychology', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/psychology/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/psychology/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/psychology/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'psychology.meta', + relation: 'meta', + name: 'Psychology & Neuroscience Meta Stack Exchange', + site_url: 'https://psychology.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=psychology.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Psychology & Neuroscience', + open_beta_date: 1327529121, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://psychology.stackexchange.com', + }, + { + aliases: ['https://meta.cogsci.stackexchange.com', 'https://cogsci.meta.stackexchange.com'], + api_site_parameter: 'psychology.meta', + audience: + 'practitioners, researchers, and students in cognitive science, psychology, neuroscience, and psychiatry', + favicon_url: 'https://cdn.sstatic.net/Sites/psychologymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/psychologymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/psychologymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/psychologymeta/Img/apple-touch-icon.png', + name: 'Psychology & Neuroscience Meta', + related_sites: [ + { + api_site_parameter: 'psychology', + name: 'Psychology & Neuroscience Stack Exchange', + relation: 'parent', + site_url: 'https://psychology.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=psychology.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://psychology.meta.stackexchange.com', + }, + { + closed_beta_date: 1327431600, + audience: + 'people who love being outdoors enjoying nature and wilderness, and learning about the required skills and equipment', + favicon_url: 'https://cdn.sstatic.net/Sites/outdoors/Img/favicon.ico', + api_site_parameter: 'outdoors', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/outdoors/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/outdoors/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/outdoors/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'outdoors.meta', + relation: 'meta', + name: 'The Great Outdoors Meta Stack Exchange', + site_url: 'https://outdoors.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=outdoors.stackexchange.com', + }, + ], + name: 'The Great Outdoors', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1328043655, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://outdoors.stackexchange.com', + }, + { + aliases: ['https://meta.outdoors.stackexchange.com'], + api_site_parameter: 'outdoors.meta', + audience: + 'people who love being outdoors enjoying nature and wilderness, and learning about the required skills and equipment', + favicon_url: 'https://cdn.sstatic.net/Sites/outdoorsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/outdoorsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/outdoorsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/outdoorsmeta/Img/apple-touch-icon.png', + name: 'The Great Outdoors Meta', + related_sites: [ + { + api_site_parameter: 'outdoors', + name: 'The Great Outdoors Stack Exchange', + relation: 'parent', + site_url: 'https://outdoors.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=outdoors.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://outdoors.meta.stackexchange.com', + }, + { + closed_beta_date: 1328036400, + audience: 'students and teachers of all martial arts', + favicon_url: 'https://cdn.sstatic.net/Sites/martialarts/Img/favicon.ico', + api_site_parameter: 'martialarts', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/martialarts/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/martialarts/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/martialarts/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'martialarts.meta', + relation: 'meta', + name: 'Martial Arts Meta Stack Exchange', + site_url: 'https://martialarts.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=martialarts.stackexchange.com', + }, + ], + name: 'Martial Arts', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1328641985, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://martialarts.stackexchange.com', + }, + { + aliases: ['https://meta.martialarts.stackexchange.com'], + api_site_parameter: 'martialarts.meta', + audience: 'students and teachers of all martial arts', + favicon_url: 'https://cdn.sstatic.net/Sites/martialartsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/martialartsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/martialartsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/martialartsmeta/Img/apple-touch-icon.png', + name: 'Martial Arts Meta', + related_sites: [ + { + api_site_parameter: 'martialarts', + name: 'Martial Arts Stack Exchange', + relation: 'parent', + site_url: 'https://martialarts.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=martialarts.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://martialarts.meta.stackexchange.com', + }, + { + closed_beta_date: 1328727600, + audience: 'participants in team and individual sport activities', + favicon_url: 'https://cdn.sstatic.net/Sites/sports/Img/favicon.ico', + api_site_parameter: 'sports', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sports/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sports/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/sports/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'sports.meta', + relation: 'meta', + name: 'Sports Meta Stack Exchange', + site_url: 'https://sports.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sports.stackexchange.com', + }, + ], + name: 'Sports', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1329336737, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sports.stackexchange.com', + }, + { + aliases: ['https://meta.sports.stackexchange.com'], + api_site_parameter: 'sports.meta', + audience: 'participants in team and individual sport activities', + favicon_url: 'https://cdn.sstatic.net/Sites/sportsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sportsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sportsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/sportsmeta/Img/apple-touch-icon.png', + name: 'Sports Meta', + related_sites: [ + { + api_site_parameter: 'sports', + name: 'Sports Stack Exchange', + relation: 'parent', + site_url: 'https://sports.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=sports.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://sports.meta.stackexchange.com', + }, + { + aliases: ['https://academics.stackexchange.com'], + closed_beta_date: 1329246000, + audience: 'academics and those enrolled in higher education', + favicon_url: 'https://cdn.sstatic.net/Sites/academia/Img/favicon.ico', + api_site_parameter: 'academia', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/academia/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/academia/Img/apple-touch-icon.png', + launch_date: 1398277239, + logo_url: 'https://cdn.sstatic.net/Sites/academia/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'academia.meta', + relation: 'meta', + name: 'Academia Meta Stack Exchange', + site_url: 'https://academia.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=academia.stackexchange.com', + }, + ], + name: 'Academia', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1329854452, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://academia.stackexchange.com', + }, + { + aliases: ['https://meta.academia.stackexchange.com'], + api_site_parameter: 'academia.meta', + audience: 'academics and those enrolled in higher education', + favicon_url: 'https://cdn.sstatic.net/Sites/academiameta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/academiameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/academiameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/academiameta/Img/logo.png', + name: 'Academia Meta', + related_sites: [ + { + api_site_parameter: 'academia', + name: 'Academia Stack Exchange', + relation: 'parent', + site_url: 'https://academia.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=academia.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://academia.meta.stackexchange.com', + }, + { + aliases: ['https://computerscience.stackexchange.com'], + closed_beta_date: 1331060400, + audience: 'students, researchers and practitioners of computer science', + favicon_url: 'https://cdn.sstatic.net/Sites/cs/Img/favicon.ico', + api_site_parameter: 'cs', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cs/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cs/Img/apple-touch-icon.png', + launch_date: 1439905020, + logo_url: 'https://cdn.sstatic.net/Sites/cs/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'cs.meta', + relation: 'meta', + name: 'Computer Science Meta Stack Exchange', + site_url: 'https://cs.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cs.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Computer Science', + open_beta_date: 1332272936, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://cs.stackexchange.com', + }, + { + aliases: ['https://meta.cs.stackexchange.com'], + audience: 'students, researchers and practitioners of computer science', + api_site_parameter: 'cs.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/csmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/csmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/csmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/csmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Computer Science Meta', + related_sites: [ + { + api_site_parameter: 'cs', + relation: 'parent', + name: 'Computer Science Stack Exchange', + site_url: 'https://cs.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cs.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://cs.meta.stackexchange.com', + }, + { + closed_beta_date: 1334084400, + audience: 'members of the workforce navigating the professional setting', + favicon_url: 'https://cdn.sstatic.net/Sites/workplace/Img/favicon.ico', + api_site_parameter: 'workplace', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/workplace/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/workplace/Img/apple-touch-icon.png', + launch_date: 1392922800, + logo_url: 'https://cdn.sstatic.net/Sites/workplace/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'workplace.meta', + relation: 'meta', + name: 'The Workplace Meta Stack Exchange', + site_url: 'https://workplace.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=workplace.stackexchange.com', + }, + ], + name: 'The Workplace', + styling: { tag_background_color: '#EEE', tag_foreground_color: '#777', link_color: '#0077CC' }, + open_beta_date: 1334692546, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://workplace.stackexchange.com', + }, + { + aliases: ['https://meta.workplace.stackexchange.com'], + api_site_parameter: 'workplace.meta', + audience: 'members of the workforce navigating the professional setting', + favicon_url: 'https://cdn.sstatic.net/Sites/workplacemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/workplacemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/workplacemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/workplacemeta/Img/logo.png', + name: 'The Workplace Meta', + related_sites: [ + { + api_site_parameter: 'workplace', + name: 'The Workplace Stack Exchange', + relation: 'parent', + site_url: 'https://workplace.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=workplace.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { tag_background_color: '#EEE', tag_foreground_color: '#777', link_color: '#3D3D3D' }, + site_url: 'https://workplace.meta.stackexchange.com', + }, + { + closed_beta_date: 1335380400, + audience: 'scientists, academics, teachers, and students in the field of chemistry', + favicon_url: 'https://cdn.sstatic.net/Sites/chemistry/Img/favicon.ico', + api_site_parameter: 'chemistry', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/chemistry/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chemistry/Img/apple-touch-icon.png', + launch_date: 1431546723, + logo_url: 'https://cdn.sstatic.net/Sites/chemistry/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'chemistry.meta', + relation: 'meta', + name: 'Chemistry Meta Stack Exchange', + site_url: 'https://chemistry.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=chemistry.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Chemistry', + open_beta_date: 1336512679, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://chemistry.stackexchange.com', + }, + { + aliases: ['https://meta.chemistry.stackexchange.com'], + audience: 'scientists, academics, teachers, and students in the field of chemistry', + api_site_parameter: 'chemistry.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/chemistrymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/chemistrymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chemistrymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/chemistrymeta/Img/logo.png', + markdown_extensions: ['MathJax', 'MHChemMathJax', 'Prettify'], + name: 'Chemistry Meta', + related_sites: [ + { + api_site_parameter: 'chemistry', + relation: 'parent', + name: 'Chemistry Stack Exchange', + site_url: 'https://chemistry.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=chemistry.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://chemistry.meta.stackexchange.com', + }, + { + closed_beta_date: 1335898800, + audience: 'serious players and enthusiasts of chess', + favicon_url: 'https://cdn.sstatic.net/Sites/chess/Img/favicon.ico', + api_site_parameter: 'chess', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/chess/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chess/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/chess/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'chess.meta', + relation: 'meta', + name: 'Chess Meta Stack Exchange', + site_url: 'https://chess.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=chess.stackexchange.com', + }, + ], + name: 'Chess', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1337098688, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://chess.stackexchange.com', + }, + { + aliases: ['https://meta.chess.stackexchange.com'], + api_site_parameter: 'chess.meta', + audience: 'serious players and enthusiasts of chess', + favicon_url: 'https://cdn.sstatic.net/Sites/chessmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/chessmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/chessmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/chessmeta/Img/apple-touch-icon.png', + name: 'Chess Meta', + related_sites: [ + { + api_site_parameter: 'chess', + name: 'Chess Stack Exchange', + relation: 'parent', + site_url: 'https://chess.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=chess.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://chess.meta.stackexchange.com', + }, + { + closed_beta_date: 1339527600, + audience: 'users and developers of hardware and software for Raspberry Pi', + favicon_url: 'https://cdn.sstatic.net/Sites/raspberrypi/Img/favicon.ico', + api_site_parameter: 'raspberrypi', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/raspberrypi/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/raspberrypi/Img/apple-touch-icon.png', + launch_date: 1447786122, + logo_url: 'https://cdn.sstatic.net/Sites/raspberrypi/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'raspberrypi.meta', + relation: 'meta', + name: 'Raspberry Pi Meta Stack Exchange', + site_url: 'https://raspberrypi.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=raspberrypi.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Raspberry Pi', + open_beta_date: 1340134756, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://raspberrypi.stackexchange.com', + }, + { + aliases: ['https://meta.raspberrypi.stackexchange.com'], + audience: 'users and developers of hardware and software for Raspberry Pi', + api_site_parameter: 'raspberrypi.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/raspberrypimeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/raspberrypimeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/raspberrypimeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/raspberrypimeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Raspberry Pi Meta', + related_sites: [ + { + api_site_parameter: 'raspberrypi', + relation: 'parent', + name: 'Raspberry Pi Stack Exchange', + site_url: 'https://raspberrypi.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=raspberrypi.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://raspberrypi.meta.stackexchange.com', + }, + { + closed_beta_date: 1339614000, + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Russian language', + favicon_url: 'https://cdn.sstatic.net/Sites/russian/Img/favicon.ico', + api_site_parameter: 'russian', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/russian/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/russian/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/russian/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'russian.meta', + relation: 'meta', + name: 'Russian Language Meta Stack Exchange', + site_url: 'https://russian.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=russian.stackexchange.com', + }, + ], + name: 'Russian Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1340730618, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://russian.stackexchange.com', + }, + { + aliases: ['https://meta.russian.stackexchange.com'], + api_site_parameter: 'russian.meta', + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Russian language', + favicon_url: 'https://cdn.sstatic.net/Sites/russianmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/russianmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/russianmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/russianmeta/Img/apple-touch-icon.png', + name: 'Russian Language Meta', + related_sites: [ + { + api_site_parameter: 'russian', + name: 'Russian Language Stack Exchange', + relation: 'parent', + site_url: 'https://russian.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=russian.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://russian.meta.stackexchange.com', + }, + { + closed_beta_date: 1340132400, + audience: 'Muslims, experts in Islam, and those interested in learning more about Islam', + favicon_url: 'https://cdn.sstatic.net/Sites/islam/Img/favicon.ico', + api_site_parameter: 'islam', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/islam/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/islam/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/islam/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'islam.meta', + relation: 'meta', + name: 'Islam Meta Stack Exchange', + site_url: 'https://islam.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=islam.stackexchange.com', + }, + ], + name: 'Islam', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1340731397, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://islam.stackexchange.com', + }, + { + aliases: ['https://meta.islam.stackexchange.com'], + api_site_parameter: 'islam.meta', + audience: 'Muslims, experts in Islam, and those interested in learning more about Islam', + favicon_url: 'https://cdn.sstatic.net/Sites/islammeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/islammeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/islammeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/islammeta/Img/apple-touch-icon.png', + name: 'Islam Meta', + related_sites: [ + { + api_site_parameter: 'islam', + name: 'Islam Stack Exchange', + relation: 'parent', + site_url: 'https://islam.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=islam.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://islam.meta.stackexchange.com', + }, + { + closed_beta_date: 1343761200, + audience: + 'Salesforce administrators, implementation experts, developers and anybody in-between', + favicon_url: 'https://cdn.sstatic.net/Sites/salesforce/Img/favicon.ico', + api_site_parameter: 'salesforce', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/salesforce/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/salesforce/Img/apple-touch-icon.png', + launch_date: 1410383915, + logo_url: 'https://cdn.sstatic.net/Sites/salesforce/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'salesforce.meta', + relation: 'meta', + name: 'Salesforce Meta Stack Exchange', + site_url: 'https://salesforce.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=salesforce.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Salesforce', + open_beta_date: 1344992944, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://salesforce.stackexchange.com', + }, + { + aliases: ['https://meta.salesforce.stackexchange.com'], + audience: + 'Salesforce administrators, implementation experts, developers and anybody in-between', + api_site_parameter: 'salesforce.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/salesforcemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/salesforcemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/salesforcemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/salesforcemeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Salesforce Meta', + related_sites: [ + { + api_site_parameter: 'salesforce', + relation: 'parent', + name: 'Salesforce Stack Exchange', + site_url: 'https://salesforce.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=salesforce.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://salesforce.meta.stackexchange.com', + }, + { + aliases: ['https://askpatents.com', 'https://askpatents.stackexchange.com'], + audience: 'people interested in improving and participating in the patent system', + api_site_parameter: 'patents', + favicon_url: 'https://cdn.sstatic.net/Sites/patents/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/patents/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/patents/Img/apple-touch-icon.png', + launch_date: 1348106226, + logo_url: 'https://cdn.sstatic.net/Sites/patents/Img/apple-touch-icon.png', + name: 'Ask Patents', + related_sites: [ + { + api_site_parameter: 'patents.meta', + relation: 'meta', + name: 'Ask Patents Meta', + site_url: 'https://patents.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=patents.stackexchange.com', + }, + ], + open_beta_date: 1348106226, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://patents.stackexchange.com', + }, + { + aliases: [ + 'https://meta.askpatents.com', + 'https://meta.askpatents.stackexchange.com', + 'https://meta.patents.stackexchange.com', + ], + api_site_parameter: 'patents.meta', + audience: 'people interested in improving and participating in the patent system', + favicon_url: 'https://cdn.sstatic.net/Sites/patentsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/patentsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/patentsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/patentsmeta/Img/apple-touch-icon.png', + name: 'Ask Patents Meta', + related_sites: [ + { + api_site_parameter: 'patents', + name: 'Ask Patents', + relation: 'parent', + site_url: 'https://patents.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=patents.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://patents.meta.stackexchange.com', + }, + { + closed_beta_date: 1349809200, + audience: 'expert genealogists and people interested in genealogy or family history', + favicon_url: 'https://cdn.sstatic.net/Sites/genealogy/Img/favicon.ico', + api_site_parameter: 'genealogy', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/genealogy/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/genealogy/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/genealogy/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'genealogy.meta', + relation: 'meta', + name: 'Genealogy & Family History Meta Stack Exchange', + site_url: 'https://genealogy.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=genealogy.stackexchange.com', + }, + ], + name: 'Genealogy & Family History', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1350409609, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://genealogy.stackexchange.com', + }, + { + aliases: ['https://meta.genealogy.stackexchange.com'], + api_site_parameter: 'genealogy.meta', + audience: 'expert genealogists and people interested in genealogy or family history', + favicon_url: 'https://cdn.sstatic.net/Sites/genealogymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/genealogymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/genealogymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/genealogymeta/Img/apple-touch-icon.png', + name: 'Genealogy & Family History Meta', + related_sites: [ + { + api_site_parameter: 'genealogy', + name: 'Genealogy & Family History Stack Exchange', + relation: 'parent', + site_url: 'https://genealogy.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=genealogy.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://genealogy.meta.stackexchange.com', + }, + { + closed_beta_date: 1351018800, + audience: 'professional robotic engineers, hobbyists, researchers and students', + favicon_url: 'https://cdn.sstatic.net/Sites/robotics/Img/favicon.ico', + api_site_parameter: 'robotics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/robotics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/robotics/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/robotics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'robotics.meta', + relation: 'meta', + name: 'Robotics Meta Stack Exchange', + site_url: 'https://robotics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=robotics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Robotics', + open_beta_date: 1352227308, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://robotics.stackexchange.com', + }, + { + aliases: ['https://meta.robotics.stackexchange.com'], + audience: 'professional robotic engineers, hobbyists, researchers and students', + api_site_parameter: 'robotics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/roboticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/roboticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/roboticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/roboticsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Robotics Meta', + related_sites: [ + { + api_site_parameter: 'robotics', + relation: 'parent', + name: 'Robotics Stack Exchange', + site_url: 'https://robotics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=robotics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://robotics.meta.stackexchange.com', + }, + { + closed_beta_date: 1353006000, + audience: 'administrators, end users, developers and designers for ExpressionEngine® CMS', + favicon_url: 'https://cdn.sstatic.net/Sites/expressionengine/Img/favicon.ico', + api_site_parameter: 'expressionengine', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/expressionengine/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/expressionengine/Img/apple-touch-icon.png', + launch_date: 1421269200, + logo_url: 'https://cdn.sstatic.net/Sites/expressionengine/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'expressionengine.meta', + relation: 'meta', + name: 'ExpressionEngine® Answers Meta', + site_url: 'https://expressionengine.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=expressionengine.stackexchange.com', + }, + ], + name: 'ExpressionEngine® Answers', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1354039543, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://expressionengine.stackexchange.com', + }, + { + aliases: ['https://meta.expressionengine.stackexchange.com'], + api_site_parameter: 'expressionengine.meta', + audience: 'administrators, end users, developers and designers for ExpressionEngine® CMS', + favicon_url: 'https://cdn.sstatic.net/Sites/expressionenginemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/expressionenginemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/expressionenginemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/expressionenginemeta/Img/logo.png', + name: 'ExpressionEngine® Answers Meta', + related_sites: [ + { + api_site_parameter: 'expressionengine', + name: 'ExpressionEngine® Answers', + relation: 'parent', + site_url: 'https://expressionengine.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=expressionengine.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://expressionengine.meta.stackexchange.com', + }, + { + closed_beta_date: 1354647600, + audience: 'people interested in governments, policies, and political processes', + favicon_url: 'https://cdn.sstatic.net/Sites/politics/Img/favicon.ico', + api_site_parameter: 'politics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/politics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/politics/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/politics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'politics.meta', + relation: 'meta', + name: 'Politics Meta Stack Exchange', + site_url: 'https://politics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=politics.stackexchange.com', + }, + ], + name: 'Politics', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1355858114, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://politics.stackexchange.com', + }, + { + aliases: ['https://meta.politics.stackexchange.com'], + api_site_parameter: 'politics.meta', + audience: 'people interested in governments, policies, and political processes', + favicon_url: 'https://cdn.sstatic.net/Sites/politicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/politicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/politicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/politicsmeta/Img/apple-touch-icon.png', + name: 'Politics Meta', + related_sites: [ + { + api_site_parameter: 'politics', + name: 'Politics Stack Exchange', + relation: 'parent', + site_url: 'https://politics.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=politics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://politics.meta.stackexchange.com', + }, + { + closed_beta_date: 1355252400, + audience: 'anime and manga fans', + favicon_url: 'https://cdn.sstatic.net/Sites/anime/Img/favicon.ico', + api_site_parameter: 'anime', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/anime/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/anime/Img/apple-touch-icon.png', + launch_date: 1440509820, + logo_url: 'https://cdn.sstatic.net/Sites/anime/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'anime.meta', + relation: 'meta', + name: 'Anime & Manga Meta Stack Exchange', + site_url: 'https://anime.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=anime.stackexchange.com', + }, + ], + name: 'Anime & Manga', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1355858123, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://anime.stackexchange.com', + }, + { + aliases: ['https://meta.anime.stackexchange.com'], + api_site_parameter: 'anime.meta', + audience: 'anime and manga fans', + favicon_url: 'https://cdn.sstatic.net/Sites/animemeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/animemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/animemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/animemeta/Img/logo.png', + name: 'Anime & Manga Meta', + related_sites: [ + { + api_site_parameter: 'anime', + name: 'Anime & Manga Stack Exchange', + relation: 'parent', + site_url: 'https://anime.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=anime.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://anime.meta.stackexchange.com', + }, + { + closed_beta_date: 1358881200, + audience: 'users of the Magento e-Commerce platform', + favicon_url: 'https://cdn.sstatic.net/Sites/magento/Img/favicon.ico', + api_site_parameter: 'magento', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/magento/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/magento/Img/apple-touch-icon.png', + launch_date: 1441114620, + logo_url: 'https://cdn.sstatic.net/Sites/magento/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'magento.meta', + relation: 'meta', + name: 'Magento Meta Stack Exchange', + site_url: 'https://magento.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=magento.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Magento', + open_beta_date: 1359489765, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://magento.stackexchange.com', + }, + { + aliases: ['https://meta.magento.stackexchange.com'], + audience: 'users of the Magento e-Commerce platform', + api_site_parameter: 'magento.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/magentometa/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/magentometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/magentometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/magentometa/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Magento Meta', + related_sites: [ + { + api_site_parameter: 'magento', + relation: 'parent', + name: 'Magento Stack Exchange', + site_url: 'https://magento.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=magento.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://magento.meta.stackexchange.com', + }, + { + closed_beta_date: 1358967600, + audience: 'speakers of other languages learning English', + favicon_url: 'https://cdn.sstatic.net/Sites/ell/Img/favicon.ico', + api_site_parameter: 'ell', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ell/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ell/Img/apple-touch-icon.png', + launch_date: 1441719420, + logo_url: 'https://cdn.sstatic.net/Sites/ell/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'ell.meta', + relation: 'meta', + name: 'English Language Learners Meta Stack Exchange', + site_url: 'https://ell.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ell.stackexchange.com', + }, + ], + name: 'English Language Learners', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1359572594, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ell.stackexchange.com', + }, + { + aliases: ['https://meta.ell.stackexchange.com'], + api_site_parameter: 'ell.meta', + audience: 'speakers of other languages learning English', + favicon_url: 'https://cdn.sstatic.net/Sites/ellmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ellmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ellmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/ellmeta/Img/logo.png', + name: 'English Language Learners Meta', + related_sites: [ + { + api_site_parameter: 'ell', + name: 'English Language Learners Stack Exchange', + relation: 'parent', + site_url: 'https://ell.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=ell.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://ell.meta.stackexchange.com', + }, + { + closed_beta_date: 1359486000, + audience: + 'folks dedicated to a lifestyle that can be maintained indefinitely without depleting available resources', + favicon_url: 'https://cdn.sstatic.net/Sites/sustainability/Img/favicon.ico', + api_site_parameter: 'sustainability', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/sustainability/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sustainability/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/sustainability/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'sustainability.meta', + relation: 'meta', + name: 'Sustainable Living Meta Stack Exchange', + site_url: 'https://sustainability.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sustainability.stackexchange.com', + }, + ], + name: 'Sustainable Living', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1360101012, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sustainability.stackexchange.com', + }, + { + aliases: ['https://meta.sustainability.stackexchange.com'], + api_site_parameter: 'sustainability.meta', + audience: + 'folks dedicated to a lifestyle that can be maintained indefinitely without depleting available resources', + favicon_url: 'https://cdn.sstatic.net/Sites/sustainabilitymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/sustainabilitymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sustainabilitymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/sustainabilitymeta/Img/apple-touch-icon.png', + name: 'Sustainable Living Meta', + related_sites: [ + { + api_site_parameter: 'sustainability', + name: 'Sustainable Living Stack Exchange', + relation: 'parent', + site_url: 'https://sustainability.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=sustainability.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://sustainability.meta.stackexchange.com', + }, + { + closed_beta_date: 1361300400, + audience: 'Tridion developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/tridion/Img/favicon.ico', + api_site_parameter: 'tridion', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tridion/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tridion/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/tridion/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'tridion.meta', + relation: 'meta', + name: 'Tridion Meta Stack Exchange', + site_url: 'https://tridion.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=tridion.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Tridion', + open_beta_date: 1363119511, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://tridion.stackexchange.com', + }, + { + aliases: ['https://meta.tridion.stackexchange.com'], + api_site_parameter: 'tridion.meta', + audience: 'Tridion developers and administrators', + favicon_url: 'https://cdn.sstatic.net/Sites/tridionmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/tridionmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tridionmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/tridionmeta/Img/apple-touch-icon.png', + name: 'Tridion Meta', + related_sites: [ + { + api_site_parameter: 'tridion', + name: 'Tridion Stack Exchange', + relation: 'parent', + site_url: 'https://tridion.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=tridion.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://tridion.meta.stackexchange.com', + }, + { + closed_beta_date: 1363719600, + audience: + 'researchers and developers who explore the principles of a system through analysis of its structure, function, and operation', + favicon_url: 'https://cdn.sstatic.net/Sites/reverseengineering/Img/favicon.ico', + api_site_parameter: 'reverseengineering', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/reverseengineering/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/reverseengineering/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/reverseengineering/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'reverseengineering.meta', + relation: 'meta', + name: 'Reverse Engineering Meta Stack Exchange', + site_url: 'https://reverseengineering.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=reverseengineering.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Reverse Engineering', + open_beta_date: 1364850392, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://reverseengineering.stackexchange.com', + }, + { + aliases: ['https://meta.reverseengineering.stackexchange.com'], + audience: + 'researchers and developers who explore the principles of a system through analysis of its structure, function, and operation', + api_site_parameter: 'reverseengineering.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/reverseengineeringmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/reverseengineeringmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/reverseengineeringmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/reverseengineeringmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Reverse Engineering Meta', + related_sites: [ + { + api_site_parameter: 'reverseengineering', + relation: 'parent', + name: 'Reverse Engineering Stack Exchange', + site_url: 'https://reverseengineering.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=reverseengineering.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://reverseengineering.meta.stackexchange.com', + }, + { + closed_beta_date: 1367953200, + audience: 'network engineers', + favicon_url: 'https://cdn.sstatic.net/Sites/networkengineering/Img/favicon.ico', + api_site_parameter: 'networkengineering', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/networkengineering/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/networkengineering/Img/apple-touch-icon.png', + launch_date: 1435092632, + logo_url: 'https://cdn.sstatic.net/Sites/networkengineering/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'networkengineering.meta', + relation: 'meta', + name: 'Network Engineering Meta Stack Exchange', + site_url: 'https://networkengineering.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=networkengineering.stackexchange.com', + }, + ], + name: 'Network Engineering', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1368630905, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://networkengineering.stackexchange.com', + }, + { + aliases: ['https://meta.networkengineering.stackexchange.com'], + api_site_parameter: 'networkengineering.meta', + audience: 'network engineers', + favicon_url: 'https://cdn.sstatic.net/Sites/networkengineeringmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/networkengineeringmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/networkengineeringmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/networkengineeringmeta/Img/logo.png', + name: 'Network Engineering Meta', + related_sites: [ + { + api_site_parameter: 'networkengineering', + name: 'Network Engineering Stack Exchange', + relation: 'parent', + site_url: 'https://networkengineering.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: + 'https://chat.stackexchange.com?tab=site&host=networkengineering.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://networkengineering.meta.stackexchange.com', + }, + { + audience: 'developers and researchers interested in open data', + api_site_parameter: 'opendata', + closed_beta_date: 1368039600, + favicon_url: 'https://cdn.sstatic.net/Sites/opendata/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/opendata/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/opendata/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/opendata/Img/apple-touch-icon.png', + name: 'Open Data', + related_sites: [ + { + api_site_parameter: 'opendata.meta', + relation: 'meta', + name: 'Open Data Meta Stack Exchange', + site_url: 'https://opendata.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=opendata.stackexchange.com', + }, + ], + open_beta_date: 1369162030, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://opendata.stackexchange.com', + }, + { + aliases: ['https://meta.opendata.stackexchange.com'], + api_site_parameter: 'opendata.meta', + audience: 'developers and researchers interested in open data', + favicon_url: 'https://cdn.sstatic.net/Sites/opendatameta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/opendatameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/opendatameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/opendatameta/Img/apple-touch-icon.png', + name: 'Open Data Meta', + related_sites: [ + { + api_site_parameter: 'opendata', + name: 'Open Data Stack Exchange', + relation: 'parent', + site_url: 'https://opendata.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=opendata.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://opendata.meta.stackexchange.com', + }, + { + closed_beta_date: 1369162800, + audience: ' self-employed and freelance workers', + favicon_url: 'https://cdn.sstatic.net/Sites/freelancing/Img/favicon.ico', + api_site_parameter: 'freelancing', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/freelancing/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/freelancing/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/freelancing/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'freelancing.meta', + relation: 'meta', + name: 'Freelancing Meta Stack Exchange', + site_url: 'https://freelancing.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=freelancing.stackexchange.com', + }, + ], + name: 'Freelancing', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1370351684, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://freelancing.stackexchange.com', + }, + { + aliases: ['https://meta.freelancing.stackexchange.com'], + api_site_parameter: 'freelancing.meta', + audience: ' self-employed and freelance workers', + favicon_url: 'https://cdn.sstatic.net/Sites/freelancingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/freelancingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/freelancingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/freelancingmeta/Img/apple-touch-icon.png', + name: 'Freelancing Meta', + related_sites: [ + { + api_site_parameter: 'freelancing', + name: 'Freelancing Stack Exchange', + relation: 'parent', + site_url: 'https://freelancing.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=freelancing.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://freelancing.meta.stackexchange.com', + }, + { + closed_beta_date: 1369249200, + audience: 'people who use Blender to create 3D graphics, animations, or games', + favicon_url: 'https://cdn.sstatic.net/Sites/blender/Img/favicon.ico', + api_site_parameter: 'blender', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/blender/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/blender/Img/apple-touch-icon.png', + launch_date: 1434461820, + logo_url: 'https://cdn.sstatic.net/Sites/blender/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'blender.meta', + relation: 'meta', + name: 'Blender Meta Stack Exchange', + site_url: 'https://blender.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=blender.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Blender', + open_beta_date: 1369854086, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://blender.stackexchange.com', + }, + { + aliases: ['https://meta.blender.stackexchange.com'], + audience: 'people who use Blender to create 3D graphics, animations, or games', + api_site_parameter: 'blender.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/blendermeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/blendermeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/blendermeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/blendermeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Blender Meta', + related_sites: [ + { + api_site_parameter: 'blender', + relation: 'parent', + name: 'Blender Stack Exchange', + site_url: 'https://blender.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=blender.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://blender.meta.stackexchange.com', + }, + { + aliases: ['https://mathoverflow.stackexchange.com', 'https://mathoverflow.com'], + favicon_url: 'https://cdn.sstatic.net/Sites/mathoverflow/Img/favicon.ico', + audience: 'professional mathematicians', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mathoverflow/Img/apple-touch-icon@2.png', + api_site_parameter: 'mathoverflow.net', + launch_date: 1254154260, + icon_url: 'https://cdn.sstatic.net/Sites/mathoverflow/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + logo_url: 'https://cdn.sstatic.net/Sites/mathoverflow/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'meta.mathoverflow.net', + relation: 'meta', + name: 'MathOverflow Meta', + site_url: 'https://meta.mathoverflow.net', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mathoverflow.net', + }, + ], + name: 'MathOverflow', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1254154260, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://mathoverflow.net', + }, + { + audience: 'professional mathematicians', + api_site_parameter: 'meta.mathoverflow.net', + favicon_url: 'https://cdn.sstatic.net/Sites/mathoverflowmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mathoverflowmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mathoverflowmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mathoverflowmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'MathOverflow Meta', + related_sites: [ + { + api_site_parameter: 'mathoverflow.net', + relation: 'parent', + name: 'MathOverflow', + site_url: 'https://mathoverflow.net', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mathoverflow.net', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://meta.mathoverflow.net', + }, + { + aliases: ['https://thefinalfrontier.stackexchange.com'], + closed_beta_date: 1374001200, + audience: 'spacecraft operators, scientists, engineers, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/space/Img/favicon.ico', + api_site_parameter: 'space', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/space/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/space/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/space/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'space.meta', + relation: 'meta', + name: 'Space Exploration Meta Stack Exchange', + site_url: 'https://space.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=space.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Space Exploration', + open_beta_date: 1374515175, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://space.stackexchange.com', + }, + { + aliases: ['https://meta.space.stackexchange.com'], + audience: 'spacecraft operators, scientists, engineers, and enthusiasts', + api_site_parameter: 'space.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/spacemeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/spacemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/spacemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/spacemeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Space Exploration Meta', + related_sites: [ + { + api_site_parameter: 'space', + relation: 'parent', + name: 'Space Exploration Stack Exchange', + site_url: 'https://space.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=space.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://space.meta.stackexchange.com', + }, + { + aliases: ['https://socialsounddesign.com', 'https://sounddesign.stackexchange.com'], + closed_beta_date: 1289409934, + audience: 'sound engineers, producers, editors, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/sound/Img/favicon.ico', + api_site_parameter: 'sound', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sound/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sound/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/sound/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'sound.meta', + relation: 'meta', + name: 'Sound Design Meta Stack Exchange', + site_url: 'https://sound.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sound.stackexchange.com', + }, + ], + name: 'Sound Design', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1378302577, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sound.stackexchange.com', + }, + { + aliases: ['https://meta.sound.stackexchange.com'], + api_site_parameter: 'sound.meta', + audience: 'sound designers', + favicon_url: 'https://cdn.sstatic.net/Sites/soundmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/soundmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/soundmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/soundmeta/Img/apple-touch-icon.png', + name: 'Sound Design Meta', + related_sites: [ + { + api_site_parameter: 'sound', + name: 'Sound Design Stack Exchange', + relation: 'parent', + site_url: 'https://sound.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=sound.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://sound.meta.stackexchange.com', + }, + { + closed_beta_date: 1380049200, + audience: 'astronomers and astrophysicists', + favicon_url: 'https://cdn.sstatic.net/Sites/astronomy/Img/favicon.ico', + api_site_parameter: 'astronomy', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/astronomy/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/astronomy/Img/apple-touch-icon.png', + launch_date: 1639665491, + logo_url: 'https://cdn.sstatic.net/Sites/astronomy/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'astronomy.meta', + relation: 'meta', + name: 'Astronomy Meta Stack Exchange', + site_url: 'https://astronomy.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=astronomy.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Astronomy', + open_beta_date: 1381267035, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://astronomy.stackexchange.com', + }, + { + aliases: ['https://meta.astronomy.stackexchange.com'], + audience: 'astronomers and astrophysicists', + api_site_parameter: 'astronomy.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/astronomymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/astronomymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/astronomymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/astronomymeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Astronomy Meta', + related_sites: [ + { + api_site_parameter: 'astronomy', + relation: 'parent', + name: 'Astronomy Stack Exchange', + site_url: 'https://astronomy.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=astronomy.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://astronomy.meta.stackexchange.com', + }, + { + closed_beta_date: 1380135600, + audience: 'researchers, developers, and users of Tor', + favicon_url: 'https://cdn.sstatic.net/Sites/tor/Img/favicon.ico', + api_site_parameter: 'tor', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tor/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tor/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/tor/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'tor.meta', + relation: 'meta', + name: 'Tor Meta Stack Exchange', + site_url: 'https://tor.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=tor.stackexchange.com', + }, + ], + name: 'Tor', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1380668476, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://tor.stackexchange.com', + }, + { + aliases: ['https://meta.tor.stackexchange.com'], + api_site_parameter: 'tor.meta', + audience: 'researchers, developers, and users of Tor', + favicon_url: 'https://cdn.sstatic.net/Sites/tormeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tormeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tormeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/tormeta/Img/apple-touch-icon.png', + name: 'Tor Meta', + related_sites: [ + { + api_site_parameter: 'tor', + name: 'Tor Stack Exchange', + relation: 'parent', + site_url: 'https://tor.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=tor.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://tor.meta.stackexchange.com', + }, + { + closed_beta_date: 1381258800, + audience: 'pet owners, caretakers, breeders, veterinarians, and trainers', + favicon_url: 'https://cdn.sstatic.net/Sites/pets/Img/favicon.ico', + api_site_parameter: 'pets', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/pets/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/pets/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/pets/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'pets.meta', + relation: 'meta', + name: 'Pets Meta Stack Exchange', + site_url: 'https://pets.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=pets.stackexchange.com', + }, + ], + name: 'Pets', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1382462458, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://pets.stackexchange.com', + }, + { + aliases: ['https://meta.pets.stackexchange.com'], + api_site_parameter: 'pets.meta', + audience: 'pet owners, caretakers, breeders, veterinarians, and trainers', + favicon_url: 'https://cdn.sstatic.net/Sites/petsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/petsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/petsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/petsmeta/Img/apple-touch-icon.png', + name: 'Pets Meta', + related_sites: [ + { + api_site_parameter: 'pets', + name: 'Pets Stack Exchange', + relation: 'parent', + site_url: 'https://pets.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=pets.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://pets.meta.stackexchange.com', + }, + { + closed_beta_date: 1382468400, + audience: 'amateur radio enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/ham/Img/favicon.ico', + api_site_parameter: 'ham', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ham/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ham/Img/apple-touch-icon.png', + launch_date: 1639665491, + logo_url: 'https://cdn.sstatic.net/Sites/ham/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ham.meta', + relation: 'meta', + name: 'Amateur Radio Meta Stack Exchange', + site_url: 'https://ham.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ham.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Amateur Radio', + open_beta_date: 1383079023, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ham.stackexchange.com', + }, + { + aliases: ['https://meta.ham.stackexchange.com'], + audience: 'amateur radio enthusiasts', + api_site_parameter: 'ham.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/hammeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/hammeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hammeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hammeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Amateur Radio Meta', + related_sites: [ + { + api_site_parameter: 'ham', + relation: 'parent', + name: 'Amateur Radio Stack Exchange', + site_url: 'https://ham.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ham.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://ham.meta.stackexchange.com', + }, + { + closed_beta_date: 1383678000, + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Italian language', + favicon_url: 'https://cdn.sstatic.net/Sites/italian/Img/favicon.ico', + api_site_parameter: 'italian', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/italian/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/italian/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/italian/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'italian.meta', + relation: 'meta', + name: 'Italian Language Meta Stack Exchange', + site_url: 'https://italian.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=italian.stackexchange.com', + }, + ], + name: 'Italian Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1384816861, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://italian.stackexchange.com', + }, + { + aliases: ['https://meta.italian.stackexchange.com'], + api_site_parameter: 'italian.meta', + audience: + 'students, teachers, and linguists wanting to discuss the finer points of the Italian language', + favicon_url: 'https://cdn.sstatic.net/Sites/italianmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/italianmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/italianmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/italianmeta/Img/apple-touch-icon.png', + name: 'Italian Language Meta', + related_sites: [ + { + api_site_parameter: 'italian', + name: 'Italian Language Stack Exchange', + relation: 'parent', + site_url: 'https://italian.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=italian.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://italian.meta.stackexchange.com', + }, + { + aliases: ['https://br.stackoverflow.com', 'https://stackoverflow.com.br'], + closed_beta_date: 1386874800, + audience: 'programadores profissionais e entusiastas', + favicon_url: 'https://cdn.sstatic.net/Sites/br/Img/favicon.ico', + api_site_parameter: 'pt.stackoverflow', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/br/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/br/Img/apple-touch-icon.png', + launch_date: 1431965114, + logo_url: 'https://cdn.sstatic.net/Sites/br/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'pt.meta.stackoverflow', + relation: 'meta', + name: 'Stack Overflow em Português Meta', + site_url: 'https://pt.meta.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=pt.stackoverflow.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Stack Overflow em Português', + open_beta_date: 1390952305, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://pt.stackoverflow.com', + }, + { + aliases: ['https://meta.br.stackoverflow.com', 'https://meta.pt.stackoverflow.com'], + audience: 'programadores profissionais e entusiastas', + api_site_parameter: 'pt.meta.stackoverflow', + favicon_url: 'https://cdn.sstatic.net/Sites/brmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/brmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/brmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/brmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Stack Overflow em Português Meta', + related_sites: [ + { + api_site_parameter: 'pt.stackoverflow', + relation: 'parent', + name: 'Stack Overflow em Português', + site_url: 'https://pt.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=pt.stackoverflow.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://pt.meta.stackoverflow.com', + }, + { + closed_beta_date: 1387306800, + audience: 'aircraft pilots, mechanics, and enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/aviation/Img/favicon.ico', + api_site_parameter: 'aviation', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/aviation/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/aviation/Img/apple-touch-icon.png', + launch_date: 1447708127, + logo_url: 'https://cdn.sstatic.net/Sites/aviation/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'aviation.meta', + relation: 'meta', + name: 'Aviation Meta Stack Exchange', + site_url: 'https://aviation.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=aviation.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Aviation', + open_beta_date: 1387915310, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://aviation.stackexchange.com', + }, + { + aliases: ['https://meta.aviation.stackexchange.com'], + audience: 'aircraft pilots, mechanics, and enthusiasts', + api_site_parameter: 'aviation.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/aviationmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/aviationmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/aviationmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/aviationmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Aviation Meta', + related_sites: [ + { + api_site_parameter: 'aviation', + relation: 'parent', + name: 'Aviation Stack Exchange', + site_url: 'https://aviation.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=aviation.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://aviation.meta.stackexchange.com', + }, + { + closed_beta_date: 1387393200, + audience: 'ebook publishers and readers', + favicon_url: 'https://cdn.sstatic.net/Sites/ebooks/Img/favicon.ico', + api_site_parameter: 'ebooks', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ebooks/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ebooks/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/ebooks/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ebooks.meta', + relation: 'meta', + name: 'Ebooks Meta Stack Exchange', + site_url: 'https://ebooks.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ebooks.stackexchange.com', + }, + ], + name: 'Ebooks', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1387915396, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ebooks.stackexchange.com', + }, + { + aliases: ['https://meta.ebooks.stackexchange.com'], + api_site_parameter: 'ebooks.meta', + audience: 'ebook publishers and readers', + favicon_url: 'https://cdn.sstatic.net/Sites/ebooksmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ebooksmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ebooksmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/ebooksmeta/Img/apple-touch-icon.png', + name: 'Ebooks Meta', + related_sites: [ + { + api_site_parameter: 'ebooks', + name: 'Ebooks Stack Exchange', + relation: 'parent', + site_url: 'https://ebooks.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=ebooks.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://ebooks.meta.stackexchange.com', + }, + { + aliases: ['https://beer.stackexchange.com', 'https://dranks.stackexchange.com'], + closed_beta_date: 1390330800, + audience: 'alcoholic beverage aficionados and those interested in beer, wine, or spirits', + favicon_url: 'https://cdn.sstatic.net/Sites/alcohol/Img/favicon.ico', + api_site_parameter: 'alcohol', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/alcohol/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/alcohol/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/alcohol/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'alcohol.meta', + relation: 'meta', + name: 'Beer, Wine & Spirits Meta Stack Exchange', + site_url: 'https://alcohol.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=alcohol.stackexchange.com', + }, + ], + name: 'Beer, Wine & Spirits', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1390946159, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://alcohol.stackexchange.com', + }, + { + aliases: ['https://meta.beer.stackexchange.com', 'https://meta.alcohol.stackexchange.com'], + api_site_parameter: 'alcohol.meta', + audience: 'alcoholic beverage aficionados and those interested in beer, wine, or spirits', + favicon_url: 'https://cdn.sstatic.net/Sites/alcoholmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/alcoholmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/alcoholmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/alcoholmeta/Img/apple-touch-icon.png', + name: 'Beer, Wine & Spirits Meta', + related_sites: [ + { + api_site_parameter: 'alcohol', + name: 'Beer, Wine & Spirits Stack Exchange', + relation: 'parent', + site_url: 'https://alcohol.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=alcohol.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://alcohol.meta.stackexchange.com', + }, + { + closed_beta_date: 1391540400, + audience: 'people seeking specific software recommendations', + favicon_url: 'https://cdn.sstatic.net/Sites/softwarerecs/Img/favicon.ico', + api_site_parameter: 'softwarerecs', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/softwarerecs/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/softwarerecs/Img/apple-touch-icon.png', + launch_date: 1441805820, + logo_url: 'https://cdn.sstatic.net/Sites/softwarerecs/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'softwarerecs.meta', + relation: 'meta', + name: 'Software Recommendations Meta Stack Exchange', + site_url: 'https://softwarerecs.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=softwarerecs.stackexchange.com', + }, + ], + name: 'Software Recommendations', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1392759911, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://softwarerecs.stackexchange.com', + }, + { + aliases: ['https://meta.softwarerecs.stackexchange.com'], + api_site_parameter: 'softwarerecs.meta', + audience: 'people seeking specific software recommendations', + favicon_url: 'https://cdn.sstatic.net/Sites/softwarerecsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/softwarerecsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/softwarerecsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/softwarerecsmeta/Img/logo.png', + name: 'Software Recommendations Meta', + related_sites: [ + { + api_site_parameter: 'softwarerecs', + name: 'Software Recommendations Stack Exchange', + relation: 'parent', + site_url: 'https://softwarerecs.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=softwarerecs.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://softwarerecs.meta.stackexchange.com', + }, + { + closed_beta_date: 1392145200, + audience: 'developers of open-source hardware and software that is compatible with Arduino', + favicon_url: 'https://cdn.sstatic.net/Sites/arduino/Img/favicon.ico', + api_site_parameter: 'arduino', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/arduino/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/arduino/Img/apple-touch-icon.png', + launch_date: 1500324502, + logo_url: 'https://cdn.sstatic.net/Sites/arduino/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'arduino.meta', + relation: 'meta', + name: 'Arduino Meta Stack Exchange', + site_url: 'https://arduino.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=arduino.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Arduino', + open_beta_date: 1393435951, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://arduino.stackexchange.com', + }, + { + aliases: ['https://meta.arduino.stackexchange.com'], + audience: 'developers of open-source hardware and software that is compatible with Arduino', + api_site_parameter: 'arduino.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/arduinometa/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/arduinometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/arduinometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/arduinometa/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Arduino Meta', + related_sites: [ + { + api_site_parameter: 'arduino', + relation: 'parent', + name: 'Arduino Stack Exchange', + site_url: 'https://arduino.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=arduino.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://arduino.meta.stackexchange.com', + }, + { + audience: 'students of Harvard University's CS50', + api_site_parameter: 'cs50', + favicon_url: 'https://cdn.sstatic.net/Sites/cs50/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cs50/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cs50/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cs50/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'CS50', + related_sites: [ + { + api_site_parameter: 'cs50.meta', + relation: 'meta', + name: 'CS50 Meta Stack Exchange', + site_url: 'https://cs50.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cs50.stackexchange.com', + }, + ], + open_beta_date: 1405429226, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'closed_beta', + site_type: 'main_site', + site_url: 'https://cs50.stackexchange.com', + }, + { + aliases: ['https://meta.cs50.stackexchange.com'], + audience: 'students of Harvard University's CS50', + api_site_parameter: 'cs50.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/cs50meta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cs50meta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cs50meta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cs50meta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'CS50 Meta', + related_sites: [ + { + api_site_parameter: 'cs50', + relation: 'parent', + name: 'CS50 Stack Exchange', + site_url: 'https://cs50.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cs50.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://cs50.meta.stackexchange.com', + }, + { + aliases: ['https://expats.stackexchange.com'], + closed_beta_date: 1394650800, + audience: 'people living abroad on a long-term basis', + favicon_url: 'https://cdn.sstatic.net/Sites/expatriates/Img/favicon.ico', + api_site_parameter: 'expatriates', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/expatriates/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/expatriates/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/expatriates/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'expatriates.meta', + relation: 'meta', + name: 'Expatriates Meta Stack Exchange', + site_url: 'https://expatriates.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=expatriates.stackexchange.com', + }, + ], + name: 'Expatriates', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1395169389, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://expatriates.stackexchange.com', + }, + { + aliases: ['https://meta.expatriates.stackexchange.com'], + api_site_parameter: 'expatriates.meta', + audience: 'people living abroad on a long-term basis', + favicon_url: 'https://cdn.sstatic.net/Sites/expatriatesmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/expatriatesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/expatriatesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/expatriatesmeta/Img/apple-touch-icon.png', + name: 'Expatriates Meta', + related_sites: [ + { + api_site_parameter: 'expatriates', + name: 'Expatriates Stack Exchange', + relation: 'parent', + site_url: 'https://expatriates.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=expatriates.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://expatriates.meta.stackexchange.com', + }, + { + closed_beta_date: 1394737200, + audience: 'those involved in the field of teaching mathematics', + favicon_url: 'https://cdn.sstatic.net/Sites/matheducators/Img/favicon.ico', + api_site_parameter: 'matheducators', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/matheducators/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/matheducators/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/matheducators/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'matheducators.meta', + relation: 'meta', + name: 'Mathematics Educators Meta Stack Exchange', + site_url: 'https://matheducators.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=matheducators.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Mathematics Educators', + open_beta_date: 1395706340, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://matheducators.stackexchange.com', + }, + { + aliases: ['https://meta.matheducators.stackexchange.com'], + audience: 'those involved in the field of teaching mathematics', + api_site_parameter: 'matheducators.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/matheducatorsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/matheducatorsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/matheducatorsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/matheducatorsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Mathematics Educators Meta', + related_sites: [ + { + api_site_parameter: 'matheducators', + relation: 'parent', + name: 'Mathematics Educators Stack Exchange', + site_url: 'https://matheducators.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=matheducators.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://matheducators.meta.stackexchange.com', + }, + { + audience: 'professional and enthusiast programmers', + api_site_parameter: 'meta.stackoverflow', + favicon_url: 'https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon@2.png', + icon_url: + 'https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon.png', + logo_url: 'https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Meta Stack Overflow', + related_sites: [ + { + api_site_parameter: 'stackoverflow', + relation: 'parent', + name: 'Stack Overflow', + site_url: 'https://stackoverflow.com', + }, + { + relation: 'chat', + name: 'Meta Stack Overflow Chat', + site_url: 'https://chat.stackoverflow.com/', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#F7FDFF', + tag_foreground_color: '#566E76', + link_color: '#4E82C2', + }, + site_type: 'meta_site', + site_url: 'https://meta.stackoverflow.com', + }, + { + closed_beta_date: 1397588400, + audience: + 'those interested in the geology, meteorology, oceanography, and environmental sciences', + favicon_url: 'https://cdn.sstatic.net/Sites/earthscience/Img/favicon.ico', + api_site_parameter: 'earthscience', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/earthscience/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/earthscience/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/earthscience/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'earthscience.meta', + relation: 'meta', + name: 'Earth Science Meta Stack Exchange', + site_url: 'https://earthscience.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=earthscience.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Earth Science', + open_beta_date: 1398180414, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://earthscience.stackexchange.com', + }, + { + aliases: ['https://meta.earthscience.stackexchange.com'], + audience: + 'those interested in the geology, meteorology, oceanography, and environmental sciences', + api_site_parameter: 'earthscience.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/earthsciencemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/earthsciencemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/earthsciencemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/earthsciencemeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'MHChemMathJax'], + name: 'Earth Science Meta', + related_sites: [ + { + api_site_parameter: 'earthscience', + relation: 'parent', + name: 'Earth Science Stack Exchange', + site_url: 'https://earthscience.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=earthscience.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://earthscience.meta.stackexchange.com', + }, + { + closed_beta_date: 1398193200, + audience: 'Joomla! administrators, users, developers and designers', + favicon_url: 'https://cdn.sstatic.net/Sites/joomla/Img/favicon.ico', + api_site_parameter: 'joomla', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/joomla/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/joomla/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/joomla/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'joomla.meta', + relation: 'meta', + name: 'Joomla Meta Stack Exchange', + site_url: 'https://joomla.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=joomla.stackexchange.com', + }, + ], + name: 'Joomla', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1398793682, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://joomla.stackexchange.com', + }, + { + aliases: ['https://meta.joomla.stackexchange.com'], + api_site_parameter: 'joomla.meta', + audience: 'Joomla! administrators, users, developers and designers', + favicon_url: 'https://cdn.sstatic.net/Sites/joomlameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/joomlameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/joomlameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/joomlameta/Img/apple-touch-icon.png', + name: 'Joomla Meta', + related_sites: [ + { + api_site_parameter: 'joomla', + name: 'Joomla Stack Exchange', + relation: 'parent', + site_url: 'https://joomla.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=joomla.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://joomla.meta.stackexchange.com', + }, + { + closed_beta_date: 1400007600, + audience: + 'Data science professionals, Machine Learning specialists, and those interested in learning more about the field', + favicon_url: 'https://cdn.sstatic.net/Sites/datascience/Img/favicon.ico', + api_site_parameter: 'datascience', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/datascience/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/datascience/Img/apple-touch-icon.png', + launch_date: 1499704419, + logo_url: 'https://cdn.sstatic.net/Sites/datascience/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'datascience.meta', + relation: 'meta', + name: 'Data Science Meta Stack Exchange', + site_url: 'https://datascience.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=datascience.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Data Science', + open_beta_date: 1402346566, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://datascience.stackexchange.com', + }, + { + aliases: ['https://meta.datascience.stackexchange.com'], + audience: + 'Data science professionals, Machine Learning specialists, and those interested in learning more about the field', + api_site_parameter: 'datascience.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/datasciencemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/datasciencemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/datasciencemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/datasciencemeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Data Science Meta', + related_sites: [ + { + api_site_parameter: 'datascience', + relation: 'parent', + name: 'Data Science Stack Exchange', + site_url: 'https://datascience.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=datascience.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://datascience.meta.stackexchange.com', + }, + { + closed_beta_date: 1400094000, + audience: 'those who create, solve, and study puzzles', + favicon_url: 'https://cdn.sstatic.net/Sites/puzzling/Img/favicon.ico', + api_site_parameter: 'puzzling', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/puzzling/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/puzzling/Img/apple-touch-icon.png', + launch_date: 1462373480, + logo_url: 'https://cdn.sstatic.net/Sites/puzzling/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'puzzling.meta', + relation: 'meta', + name: 'Puzzling Meta Stack Exchange', + site_url: 'https://puzzling.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=puzzling.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Puzzling', + open_beta_date: 1401225985, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://puzzling.stackexchange.com', + }, + { + aliases: ['https://meta.puzzling.stackexchange.com'], + audience: 'those who create, solve, and study puzzles', + api_site_parameter: 'puzzling.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/puzzlingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/puzzlingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/puzzlingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/puzzlingmeta/Img/logo.png', + markdown_extensions: ['MathJax'], + name: 'Puzzling Meta', + related_sites: [ + { + api_site_parameter: 'puzzling', + relation: 'parent', + name: 'Puzzling Stack Exchange', + site_url: 'https://puzzling.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=puzzling.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://puzzling.meta.stackexchange.com', + }, + { + closed_beta_date: 1402513200, + audience: 'administrators, end users, developers and designers for Craft CMS', + favicon_url: 'https://cdn.sstatic.net/Sites/craftcms/Img/favicon.ico', + api_site_parameter: 'craftcms', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/craftcms/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/craftcms/Img/apple-touch-icon.png', + launch_date: 1639765508, + logo_url: 'https://cdn.sstatic.net/Sites/craftcms/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'craftcms.meta', + relation: 'meta', + name: 'Craft CMS Meta Stack Exchange', + site_url: 'https://craftcms.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=craftcms.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Craft CMS', + open_beta_date: 1403053615, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://craftcms.stackexchange.com', + }, + { + aliases: ['https://meta.craftcms.stackexchange.com'], + audience: 'administrators, end users, developers and designers for Craft CMS', + api_site_parameter: 'craftcms.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/craftcmsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/craftcmsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/craftcmsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/craftcmsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Craft CMS Meta', + related_sites: [ + { + api_site_parameter: 'craftcms', + relation: 'parent', + name: 'Craft CMS Stack Exchange', + site_url: 'https://craftcms.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=craftcms.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://craftcms.meta.stackexchange.com', + }, + { + closed_beta_date: 1403031600, + audience: 'people practicing or interested in Buddhist philosophy, teaching, and practice', + favicon_url: 'https://cdn.sstatic.net/Sites/buddhism/Img/favicon.ico', + api_site_parameter: 'buddhism', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/buddhism/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/buddhism/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/buddhism/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'buddhism.meta', + relation: 'meta', + name: 'Buddhism Meta Stack Exchange', + site_url: 'https://buddhism.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=buddhism.stackexchange.com', + }, + ], + name: 'Buddhism', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1403637894, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://buddhism.stackexchange.com', + }, + { + aliases: ['https://meta.buddhism.stackexchange.com'], + api_site_parameter: 'buddhism.meta', + audience: 'people practicing or interested in Buddhist philosophy, teaching, and practice', + favicon_url: 'https://cdn.sstatic.net/Sites/buddhismmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/buddhismmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/buddhismmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/buddhismmeta/Img/apple-touch-icon.png', + name: 'Buddhism Meta', + related_sites: [ + { + api_site_parameter: 'buddhism', + name: 'Buddhism Stack Exchange', + relation: 'parent', + site_url: 'https://buddhism.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=buddhism.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://buddhism.meta.stackexchange.com', + }, + { + closed_beta_date: 1403118000, + audience: + 'followers of the Hindu religion and those interested in learning more about Hinduism', + favicon_url: 'https://cdn.sstatic.net/Sites/hinduism/Img/favicon.ico', + api_site_parameter: 'hinduism', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/hinduism/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hinduism/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/hinduism/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'hinduism.meta', + relation: 'meta', + name: 'Hinduism Meta Stack Exchange', + site_url: 'https://hinduism.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=hinduism.stackexchange.com', + }, + ], + name: 'Hinduism', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1404155977, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://hinduism.stackexchange.com', + }, + { + aliases: ['https://meta.hinduism.stackexchange.com'], + api_site_parameter: 'hinduism.meta', + audience: + 'followers of the Hindu religion and those interested in learning more about Hinduism', + favicon_url: 'https://cdn.sstatic.net/Sites/hinduismmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/hinduismmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hinduismmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hinduismmeta/Img/apple-touch-icon.png', + name: 'Hinduism Meta', + related_sites: [ + { + api_site_parameter: 'hinduism', + name: 'Hinduism Stack Exchange', + relation: 'parent', + site_url: 'https://hinduism.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=hinduism.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://hinduism.meta.stackexchange.com', + }, + { + aliases: ['https://moderator.stackexchange.com', 'https://moderators.stackexchange.com'], + audience: 'community managers, administrators, and moderators', + api_site_parameter: 'communitybuilding', + closed_beta_date: 1406660400, + favicon_url: 'https://cdn.sstatic.net/Sites/communitybuilding/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/communitybuilding/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/communitybuilding/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/communitybuilding/Img/apple-touch-icon.png', + name: 'Community Building', + related_sites: [ + { + api_site_parameter: 'communitybuilding.meta', + relation: 'meta', + name: 'Community Building Meta Stack Exchange', + site_url: 'https://communitybuilding.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: + 'https://chat.stackexchange.com?tab=site&host=communitybuilding.stackexchange.com', + }, + ], + open_beta_date: 1407262833, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://communitybuilding.stackexchange.com', + }, + { + aliases: [ + 'https://meta.moderators.stackexchange.com', + 'https://meta.communitybuilding.stackexchange.com', + ], + api_site_parameter: 'communitybuilding.meta', + audience: 'community managers, administrators, and moderators', + favicon_url: 'https://cdn.sstatic.net/Sites/communitybuildingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/communitybuildingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/communitybuildingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/communitybuildingmeta/Img/apple-touch-icon.png', + name: 'Community Building Meta', + related_sites: [ + { + api_site_parameter: 'communitybuilding', + name: 'Community Building Stack Exchange', + relation: 'parent', + site_url: 'https://communitybuilding.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: + 'https://chat.stackexchange.com?tab=site&host=communitybuilding.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://communitybuilding.meta.stackexchange.com', + }, + { + closed_beta_date: 1410894000, + audience: + 'writers/artists using science, geography and culture to construct imaginary worlds and settings', + favicon_url: 'https://cdn.sstatic.net/Sites/worldbuilding/Img/favicon.ico', + api_site_parameter: 'worldbuilding', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/worldbuilding/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/worldbuilding/Img/apple-touch-icon.png', + launch_date: 1447708127, + logo_url: 'https://cdn.sstatic.net/Sites/worldbuilding/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'worldbuilding.meta', + relation: 'meta', + name: 'Worldbuilding Meta Stack Exchange', + site_url: 'https://worldbuilding.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=worldbuilding.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Worldbuilding', + open_beta_date: 1412024504, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://worldbuilding.stackexchange.com', + }, + { + aliases: ['https://meta.worldbuilding.stackexchange.com'], + audience: + 'writers/artists using science, geography and culture to construct imaginary worlds and settings', + api_site_parameter: 'worldbuilding.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/worldbuildingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/worldbuildingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/worldbuildingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/worldbuildingmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'MHChemMathJax'], + name: 'Worldbuilding Meta', + related_sites: [ + { + api_site_parameter: 'worldbuilding', + relation: 'parent', + name: 'Worldbuilding Stack Exchange', + site_url: 'https://worldbuilding.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=worldbuilding.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://worldbuilding.meta.stackexchange.com', + }, + { + aliases: ['https://jp.stackoverflow.com'], + closed_beta_date: 1417392000, + audience: 'プログラマーとプログラミングに熱心な人', + favicon_url: 'https://cdn.sstatic.net/Sites/ja/Img/favicon.ico', + api_site_parameter: 'ja.stackoverflow', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ja/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ja/Img/apple-touch-icon.png', + launch_date: 1639665221, + logo_url: 'https://cdn.sstatic.net/Sites/ja/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ja.meta.stackoverflow', + relation: 'meta', + name: 'スタック・オーバーフローMeta', + site_url: 'https://ja.meta.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ja.stackoverflow.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'スタック・オーバーフロー', + open_beta_date: 1418685144, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ja.stackoverflow.com', + }, + { + aliases: ['https://meta.ja.stackoverflow.com'], + audience: 'プログラマーとプログラミングに熱心な人', + api_site_parameter: 'ja.meta.stackoverflow', + favicon_url: 'https://cdn.sstatic.net/Sites/jameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/jameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/jameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/jameta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'スタック・オーバーフローMeta', + related_sites: [ + { + api_site_parameter: 'ja.stackoverflow', + relation: 'parent', + name: 'スタック・オーバーフロー', + site_url: 'https://ja.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ja.stackoverflow.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://ja.meta.stackoverflow.com', + }, + { + closed_beta_date: 1411498800, + audience: 'those using, extending or developing Emacs', + favicon_url: 'https://cdn.sstatic.net/Sites/emacs/Img/favicon.ico', + api_site_parameter: 'emacs', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/emacs/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/emacs/Img/apple-touch-icon.png', + launch_date: 1447708127, + logo_url: 'https://cdn.sstatic.net/Sites/emacs/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'emacs.meta', + relation: 'meta', + name: 'Emacs Meta Stack Exchange', + site_url: 'https://emacs.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=emacs.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Emacs', + open_beta_date: 1412705563, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://emacs.stackexchange.com', + }, + { + aliases: ['https://meta.emacs.stackexchange.com'], + audience: 'those using, extending or developing Emacs', + api_site_parameter: 'emacs.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/emacsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/emacsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/emacsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/emacsmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Emacs Meta', + related_sites: [ + { + api_site_parameter: 'emacs', + relation: 'parent', + name: 'Emacs Stack Exchange', + site_url: 'https://emacs.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=emacs.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://emacs.meta.stackexchange.com', + }, + { + closed_beta_date: 1414522800, + audience: 'people interested in the history and origins of science and mathematics', + favicon_url: 'https://cdn.sstatic.net/Sites/hsm/Img/favicon.ico', + api_site_parameter: 'hsm', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/hsm/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hsm/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/hsm/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'hsm.meta', + relation: 'meta', + name: 'History of Science and Mathematics Meta Stack Exchange', + site_url: 'https://hsm.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=hsm.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'History of Science and Mathematics', + open_beta_date: 1415642680, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://hsm.stackexchange.com', + }, + { + aliases: ['https://meta.hsm.stackexchange.com'], + audience: 'people interested in the history and origins of science and mathematics', + api_site_parameter: 'hsm.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/hsmmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/hsmmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hsmmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hsmmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'History of Science and Mathematics Meta', + related_sites: [ + { + api_site_parameter: 'hsm', + relation: 'parent', + name: 'History of Science and Mathematics Stack Exchange', + site_url: 'https://hsm.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=hsm.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://hsm.meta.stackexchange.com', + }, + { + closed_beta_date: 1416337200, + audience: 'those who study, teach, research and apply economics and econometrics', + favicon_url: 'https://cdn.sstatic.net/Sites/economics/Img/favicon.ico', + api_site_parameter: 'economics', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/economics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/economics/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/economics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'economics.meta', + relation: 'meta', + name: 'Economics Meta Stack Exchange', + site_url: 'https://economics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=economics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Economics', + open_beta_date: 1417457805, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://economics.stackexchange.com', + }, + { + aliases: ['https://meta.economics.stackexchange.com'], + audience: 'professional and academic economists and analysts', + api_site_parameter: 'economics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/economicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/economicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/economicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/economicsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Economics Meta', + related_sites: [ + { + api_site_parameter: 'economics', + relation: 'parent', + name: 'Economics Stack Exchange', + site_url: 'https://economics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=economics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://economics.meta.stackexchange.com', + }, + { + closed_beta_date: 1418151600, + audience: 'people looking to bypass life's everyday problems with simple tricks', + favicon_url: 'https://cdn.sstatic.net/Sites/lifehacks/Img/favicon.ico', + api_site_parameter: 'lifehacks', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/lifehacks/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/lifehacks/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/lifehacks/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'lifehacks.meta', + relation: 'meta', + name: 'Lifehacks Meta Stack Exchange', + site_url: 'https://lifehacks.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=lifehacks.stackexchange.com', + }, + ], + name: 'Lifehacks', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1419282468, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://lifehacks.stackexchange.com', + }, + { + aliases: ['https://meta.lifehacks.stackexchange.com'], + api_site_parameter: 'lifehacks.meta', + audience: 'people looking to bypass life's everyday problems with simple tricks', + favicon_url: 'https://cdn.sstatic.net/Sites/lifehacksmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/lifehacksmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/lifehacksmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/lifehacksmeta/Img/apple-touch-icon.png', + name: 'Lifehacks Meta', + related_sites: [ + { + api_site_parameter: 'lifehacks', + name: 'Lifehacks Stack Exchange', + relation: 'parent', + site_url: 'https://lifehacks.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=lifehacks.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://lifehacks.meta.stackexchange.com', + }, + { + closed_beta_date: 1421780400, + audience: 'professionals and students of engineering', + favicon_url: 'https://cdn.sstatic.net/Sites/engineering/Img/favicon.ico', + api_site_parameter: 'engineering', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/engineering/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/engineering/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/engineering/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'engineering.meta', + relation: 'meta', + name: 'Engineering Meta Stack Exchange', + site_url: 'https://engineering.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=engineering.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Engineering', + open_beta_date: 1422901967, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://engineering.stackexchange.com', + }, + { + aliases: ['https://meta.engineering.stackexchange.com'], + audience: 'professionals and students of engineering', + api_site_parameter: 'engineering.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/engineeringmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/engineeringmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/engineeringmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/engineeringmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Engineering Meta', + related_sites: [ + { + api_site_parameter: 'engineering', + relation: 'parent', + name: 'Engineering Stack Exchange', + site_url: 'https://engineering.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=engineering.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://engineering.meta.stackexchange.com', + }, + { + closed_beta_date: 1422385200, + audience: 'people interested in all aspects of producing and consuming coffee', + favicon_url: 'https://cdn.sstatic.net/Sites/coffee/Img/favicon.ico', + api_site_parameter: 'coffee', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/coffee/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/coffee/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/coffee/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'coffee.meta', + relation: 'meta', + name: 'Coffee Meta Stack Exchange', + site_url: 'https://coffee.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=coffee.stackexchange.com', + }, + ], + name: 'Coffee', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1423508206, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://coffee.stackexchange.com', + }, + { + aliases: ['https://meta.coffee.stackexchange.com'], + api_site_parameter: 'coffee.meta', + audience: 'people interested in all aspects of producing and consuming coffee', + favicon_url: 'https://cdn.sstatic.net/Sites/coffeemeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/coffeemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/coffeemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/coffeemeta/Img/apple-touch-icon.png', + name: 'Coffee Meta', + related_sites: [ + { + api_site_parameter: 'coffee', + name: 'Coffee Stack Exchange', + relation: 'parent', + site_url: 'https://coffee.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=coffee.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://coffee.meta.stackexchange.com', + }, + { + aliases: ['https://vim.stackexchange.com'], + closed_beta_date: 1422990000, + audience: 'people using the vi and Vim families of text editors', + favicon_url: 'https://cdn.sstatic.net/Sites/vi/Img/favicon.ico', + api_site_parameter: 'vi', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/vi/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/vi/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/vi/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'vi.meta', + relation: 'meta', + name: 'Vi and Vim Meta Stack Exchange', + site_url: 'https://vi.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=vi.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Vi and Vim', + open_beta_date: 1424310269, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://vi.stackexchange.com', + }, + { + aliases: ['https://meta.vi.stackexchange.com'], + api_site_parameter: 'vi.meta', + audience: 'people using the vi and Vim families of text editors', + favicon_url: 'https://cdn.sstatic.net/Sites/vimeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/vimeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/vimeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/vimeta/Img/apple-touch-icon.png', + name: 'Vi and Vim Meta', + related_sites: [ + { + api_site_parameter: 'vi', + name: 'Vi and Vim Stack Exchange', + relation: 'parent', + site_url: 'https://vi.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=vi.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://vi.meta.stackexchange.com', + }, + { + audience: 'music historians, critics, and fans', + api_site_parameter: 'musicfans', + closed_beta_date: 1424804400, + favicon_url: 'https://cdn.sstatic.net/Sites/musicfans/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/musicfans/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/musicfans/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/musicfans/Img/apple-touch-icon.png', + name: 'Music Fans', + related_sites: [ + { + api_site_parameter: 'musicfans.meta', + relation: 'meta', + name: 'Music Fans Meta Stack Exchange', + site_url: 'https://musicfans.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=musicfans.stackexchange.com', + }, + ], + open_beta_date: 1426020780, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://musicfans.stackexchange.com', + }, + { + aliases: ['https://meta.musicfans.stackexchange.com'], + api_site_parameter: 'musicfans.meta', + audience: 'music historians, critics, and fans', + favicon_url: 'https://cdn.sstatic.net/Sites/musicfansmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/musicfansmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/musicfansmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/musicfansmeta/Img/apple-touch-icon.png', + name: 'Music Fans Meta', + related_sites: [ + { + api_site_parameter: 'musicfans', + name: 'Music Fans Stack Exchange', + relation: 'parent', + site_url: 'https://musicfans.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=musicfans.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://musicfans.meta.stackexchange.com', + }, + { + closed_beta_date: 1426618800, + audience: 'professional and amateur woodworkers', + favicon_url: 'https://cdn.sstatic.net/Sites/woodworking/Img/favicon.ico', + api_site_parameter: 'woodworking', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/woodworking/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/woodworking/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/woodworking/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'woodworking.meta', + relation: 'meta', + name: 'Woodworking Meta Stack Exchange', + site_url: 'https://woodworking.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=woodworking.stackexchange.com', + }, + ], + name: 'Woodworking', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1427736055, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://woodworking.stackexchange.com', + }, + { + aliases: ['https://meta.woodworking.stackexchange.com'], + api_site_parameter: 'woodworking.meta', + audience: 'professional and amateur woodworkers', + favicon_url: 'https://cdn.sstatic.net/Sites/woodworkingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/woodworkingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/woodworkingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/woodworkingmeta/Img/apple-touch-icon.png', + name: 'Woodworking Meta', + related_sites: [ + { + api_site_parameter: 'woodworking', + name: 'Woodworking Stack Exchange', + relation: 'parent', + site_url: 'https://woodworking.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=woodworking.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://woodworking.meta.stackexchange.com', + }, + { + closed_beta_date: 1427223600, + audience: + 'administrators and users of the CiviCRM Constituent Relationship Management software', + favicon_url: 'https://cdn.sstatic.net/Sites/civicrm/Img/favicon.ico', + api_site_parameter: 'civicrm', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/civicrm/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/civicrm/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/civicrm/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'civicrm.meta', + relation: 'meta', + name: 'CiviCRM Meta Stack Exchange', + site_url: 'https://civicrm.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=civicrm.stackexchange.com', + }, + ], + name: 'CiviCRM', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1428434031, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://civicrm.stackexchange.com', + }, + { + aliases: ['https://meta.civicrm.stackexchange.com'], + api_site_parameter: 'civicrm.meta', + audience: + 'administrators and users of the CiviCRM Constituent Relationship Management software', + favicon_url: 'https://cdn.sstatic.net/Sites/civicrmmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/civicrmmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/civicrmmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/civicrmmeta/Img/apple-touch-icon.png', + name: 'CiviCRM Meta', + related_sites: [ + { + api_site_parameter: 'civicrm', + name: 'CiviCRM Stack Exchange', + relation: 'parent', + site_url: 'https://civicrm.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=civicrm.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://civicrm.meta.stackexchange.com', + }, + { + aliases: ['https://health.stackexchange.com'], + audience: + 'professionals in medical and allied health fields, students of those professions, related academics, and others with a sound understanding of medicine and healthcare-related sciences', + api_site_parameter: 'medicalsciences', + closed_beta_date: 1427828400, + favicon_url: 'https://cdn.sstatic.net/Sites/medicalsciences/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/medicalsciences/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/medicalsciences/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/medicalsciences/Img/apple-touch-icon.png', + name: 'Medical Sciences', + related_sites: [ + { + api_site_parameter: 'medicalsciences.meta', + relation: 'meta', + name: 'Medical Sciences Meta Stack Exchange', + site_url: 'https://medicalsciences.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=medicalsciences.stackexchange.com', + }, + ], + open_beta_date: 1429753438, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://medicalsciences.stackexchange.com', + }, + { + aliases: ['https://meta.health.stackexchange.com', 'https://health.meta.stackexchange.com'], + api_site_parameter: 'medicalsciences.meta', + audience: + 'professionals in medical and allied health fields, students of those professions, related academics, and others with a sound understanding of medicine and healthcare-related sciences', + favicon_url: 'https://cdn.sstatic.net/Sites/medicalsciencesmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/medicalsciencesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/medicalsciencesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/medicalsciencesmeta/Img/apple-touch-icon.png', + name: 'Medical Sciences Meta', + related_sites: [ + { + api_site_parameter: 'medicalsciences', + name: 'Medical Sciences Stack Exchange', + relation: 'parent', + site_url: 'https://medicalsciences.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=medicalsciences.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://medicalsciences.meta.stackexchange.com', + }, + { + aliases: ['https://hashcode.ru', 'https://stackoverflow.ru'], + closed_beta_date: 1427436000, + audience: 'программистов', + favicon_url: 'https://cdn.sstatic.net/Sites/ru/Img/favicon.ico', + api_site_parameter: 'ru.stackoverflow', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ru/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ru/Img/apple-touch-icon.png', + launch_date: 1449851367, + logo_url: 'https://cdn.sstatic.net/Sites/ru/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'ru.meta.stackoverflow', + relation: 'meta', + name: 'Stack Overflow на русском Meta', + site_url: 'https://ru.meta.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ru.stackoverflow.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Stack Overflow на русском', + open_beta_date: 1427774754, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ru.stackoverflow.com', + }, + { + aliases: ['https://meta.hashcode.ru', 'https://meta.ru.stackoverflow.com'], + audience: 'программистов', + api_site_parameter: 'ru.meta.stackoverflow', + favicon_url: 'https://cdn.sstatic.net/Sites/rumeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/rumeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/rumeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/rumeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Stack Overflow на русском Meta', + related_sites: [ + { + api_site_parameter: 'ru.stackoverflow', + relation: 'parent', + name: 'Stack Overflow на русском', + site_url: 'https://ru.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ru.stackoverflow.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://ru.meta.stackoverflow.com', + }, + { + aliases: ['https://russ.hashcode.ru', 'https://russ.stackexchange.com'], + closed_beta_date: 1430092800, + audience: 'лингвистов и энтузиастов русского языка', + favicon_url: 'https://cdn.sstatic.net/Sites/rus/Img/favicon.ico', + api_site_parameter: 'rus', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/rus/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/rus/Img/apple-touch-icon.png', + launch_date: 1564693434, + logo_url: 'https://cdn.sstatic.net/Sites/rus/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'rus.meta', + relation: 'meta', + name: 'Русский язык Meta', + site_url: 'https://rus.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=rus.stackexchange.com', + }, + ], + name: 'Русский язык', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1430170418, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://rus.stackexchange.com', + }, + { + aliases: ['https://meta.rus.stackexchange.com'], + api_site_parameter: 'rus.meta', + audience: 'лингвистов и энтузиастов русского языка', + favicon_url: 'https://cdn.sstatic.net/Sites/rusmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/rusmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/rusmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/rusmeta/Img/apple-touch-icon.png', + name: 'Русский язык Meta', + related_sites: [ + { + api_site_parameter: 'rus', + name: 'Русский язык', + relation: 'parent', + site_url: 'https://rus.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=rus.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://rus.meta.stackexchange.com', + }, + { + closed_beta_date: 1430247600, + audience: 'enthusiasts and scholars of mythology and folklore', + favicon_url: 'https://cdn.sstatic.net/Sites/mythology/Img/favicon.ico', + api_site_parameter: 'mythology', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/mythology/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mythology/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/mythology/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'mythology.meta', + relation: 'meta', + name: 'Mythology & Folklore Meta Stack Exchange', + site_url: 'https://mythology.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mythology.stackexchange.com', + }, + ], + name: 'Mythology & Folklore', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1431455524, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://mythology.stackexchange.com', + }, + { + aliases: ['https://meta.mythology.stackexchange.com'], + api_site_parameter: 'mythology.meta', + audience: 'enthusiasts and scholars of mythology and folklore', + favicon_url: 'https://cdn.sstatic.net/Sites/mythologymeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mythologymeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mythologymeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mythologymeta/Img/apple-touch-icon.png', + name: 'Mythology & Folklore Meta', + related_sites: [ + { + api_site_parameter: 'mythology', + name: 'Mythology & Folklore Stack Exchange', + relation: 'parent', + site_url: 'https://mythology.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=mythology.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://mythology.meta.stackexchange.com', + }, + { + closed_beta_date: 1432666800, + audience: 'legal professionals, students, and others with experience or interest in law', + favicon_url: 'https://cdn.sstatic.net/Sites/law/Img/favicon.ico', + api_site_parameter: 'law', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/law/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/law/Img/apple-touch-icon.png', + launch_date: 1467819836, + logo_url: 'https://cdn.sstatic.net/Sites/law/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'law.meta', + relation: 'meta', + name: 'Law Meta Stack Exchange', + site_url: 'https://law.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=law.stackexchange.com', + }, + ], + name: 'Law', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1433788411, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://law.stackexchange.com', + }, + { + aliases: ['https://meta.law.stackexchange.com'], + api_site_parameter: 'law.meta', + audience: 'legal professionals, students, and others with experience or interest in law', + favicon_url: 'https://cdn.sstatic.net/Sites/lawmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/lawmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/lawmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/lawmeta/Img/apple-touch-icon.png', + name: 'Law Meta', + related_sites: [ + { + api_site_parameter: 'law', + name: 'Law Stack Exchange', + relation: 'parent', + site_url: 'https://law.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=law.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://law.meta.stackexchange.com', + }, + { + closed_beta_date: 1435086000, + audience: 'people organizing, marketing or licensing open source development projects', + favicon_url: 'https://cdn.sstatic.net/Sites/opensource/Img/favicon.ico', + api_site_parameter: 'opensource', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/opensource/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/opensource/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/opensource/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'opensource.meta', + relation: 'meta', + name: 'Open Source Meta Stack Exchange', + site_url: 'https://opensource.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=opensource.stackexchange.com', + }, + ], + name: 'Open Source', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1436211683, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://opensource.stackexchange.com', + }, + { + aliases: ['https://meta.opensource.stackexchange.com'], + api_site_parameter: 'opensource.meta', + audience: 'people organizing, marketing or licensing open source development projects', + favicon_url: 'https://cdn.sstatic.net/Sites/opensourcemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/opensourcemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/opensourcemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/opensourcemeta/Img/apple-touch-icon.png', + name: 'Open Source Meta', + related_sites: [ + { + api_site_parameter: 'opensource', + name: 'Open Source Stack Exchange', + relation: 'parent', + site_url: 'https://opensource.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=opensource.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://opensource.meta.stackexchange.com', + }, + { + audience: 'developers and users of elementary OS and applications', + api_site_parameter: 'elementaryos', + closed_beta_date: 1435690800, + favicon_url: 'https://cdn.sstatic.net/Sites/elementaryos/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/elementaryos/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/elementaryos/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/elementaryos/Img/apple-touch-icon.png', + name: 'elementary OS', + related_sites: [ + { + api_site_parameter: 'elementaryos.meta', + relation: 'meta', + name: 'elementary OS Meta Stack Exchange', + site_url: 'https://elementaryos.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=elementaryos.stackexchange.com', + }, + ], + open_beta_date: 1436829594, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://elementaryos.stackexchange.com', + }, + { + aliases: ['https://meta.elementaryos.stackexchange.com'], + api_site_parameter: 'elementaryos.meta', + audience: 'developers and users of elementary OS and applications', + favicon_url: 'https://cdn.sstatic.net/Sites/elementaryosmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/elementaryosmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/elementaryosmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/elementaryosmeta/Img/apple-touch-icon.png', + name: 'elementary OS Meta', + related_sites: [ + { + api_site_parameter: 'elementaryos', + name: 'elementary OS Stack Exchange', + relation: 'parent', + site_url: 'https://elementaryos.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=elementaryos.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://elementaryos.meta.stackexchange.com', + }, + { + closed_beta_date: 1436900400, + audience: + 'linguists, teachers and learners wanting to discuss the finer points of the Portuguese language', + favicon_url: 'https://cdn.sstatic.net/Sites/portuguese/Img/favicon.ico', + api_site_parameter: 'portuguese', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/portuguese/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/portuguese/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/portuguese/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'portuguese.meta', + relation: 'meta', + name: 'Portuguese Language Meta Stack Exchange', + site_url: 'https://portuguese.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=portuguese.stackexchange.com', + }, + ], + name: 'Portuguese Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1438032046, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://portuguese.stackexchange.com', + }, + { + aliases: ['https://meta.portuguese.stackexchange.com'], + api_site_parameter: 'portuguese.meta', + audience: + 'linguists, teachers and learners wanting to discuss the finer points of the Portuguese language', + favicon_url: 'https://cdn.sstatic.net/Sites/portuguesemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/portuguesemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/portuguesemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/portuguesemeta/Img/apple-touch-icon.png', + name: 'Portuguese Language Meta', + related_sites: [ + { + api_site_parameter: 'portuguese', + name: 'Portuguese Language Stack Exchange', + relation: 'parent', + site_url: 'https://portuguese.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=portuguese.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://portuguese.meta.stackexchange.com', + }, + { + closed_beta_date: 1438714800, + audience: 'computer graphics researchers and programmers', + favicon_url: 'https://cdn.sstatic.net/Sites/computergraphics/Img/favicon.ico', + api_site_parameter: 'computergraphics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/computergraphics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/computergraphics/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/computergraphics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'computergraphics.meta', + relation: 'meta', + name: 'Computer Graphics Meta Stack Exchange', + site_url: 'https://computergraphics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=computergraphics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Computer Graphics', + open_beta_date: 1441049266, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://computergraphics.stackexchange.com', + }, + { + aliases: ['https://meta.computergraphics.stackexchange.com'], + audience: 'computer graphics researchers and programmers', + api_site_parameter: 'computergraphics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/computergraphicsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/computergraphicsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/computergraphicsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/computergraphicsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Computer Graphics Meta', + related_sites: [ + { + api_site_parameter: 'computergraphics', + relation: 'parent', + name: 'Computer Graphics Stack Exchange', + site_url: 'https://computergraphics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=computergraphics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://computergraphics.meta.stackexchange.com', + }, + { + audience: 'people seeking specific hardware recommendations', + api_site_parameter: 'hardwarerecs', + closed_beta_date: 1441825200, + favicon_url: 'https://cdn.sstatic.net/Sites/hardwarerecs/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/hardwarerecs/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hardwarerecs/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hardwarerecs/Img/apple-touch-icon.png', + name: 'Hardware Recommendations', + related_sites: [ + { + api_site_parameter: 'hardwarerecs.meta', + relation: 'meta', + name: 'Hardware Recommendations Meta Stack Exchange', + site_url: 'https://hardwarerecs.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=hardwarerecs.stackexchange.com', + }, + ], + open_beta_date: 1443535311, + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://hardwarerecs.stackexchange.com', + }, + { + aliases: ['https://meta.hardwarerecs.stackexchange.com'], + api_site_parameter: 'hardwarerecs.meta', + audience: 'people seeking specific hardware recommendations', + favicon_url: 'https://cdn.sstatic.net/Sites/hardwarerecsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/hardwarerecsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/hardwarerecsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/hardwarerecsmeta/Img/apple-touch-icon.png', + name: 'Hardware Recommendations Meta', + related_sites: [ + { + api_site_parameter: 'hardwarerecs', + name: 'Hardware Recommendations Stack Exchange', + relation: 'parent', + site_url: 'https://hardwarerecs.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=hardwarerecs.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://hardwarerecs.meta.stackexchange.com', + }, + { + closed_beta_date: 1448996400, + audience: 'programadores y profesionales de la informática', + favicon_url: 'https://cdn.sstatic.net/Sites/es/Img/favicon.ico', + api_site_parameter: 'es.stackoverflow', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/es/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/es/Img/apple-touch-icon.png', + launch_date: 1495050784, + logo_url: 'https://cdn.sstatic.net/Sites/es/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'es.meta.stackoverflow', + relation: 'meta', + name: 'Stack Overflow Meta en español', + site_url: 'https://es.meta.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=es.stackoverflow.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Stack Overflow en español', + open_beta_date: 1450204682, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://es.stackoverflow.com', + }, + { + aliases: ['https://meta.es.stackoverflow.com'], + audience: 'programadores y profesionales de la informática', + api_site_parameter: 'es.meta.stackoverflow', + favicon_url: 'https://cdn.sstatic.net/Sites/esmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/esmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/esmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/esmeta/Img/logo.png', + markdown_extensions: ['Prettify'], + name: 'Stack Overflow Meta en español', + related_sites: [ + { + api_site_parameter: 'es.stackoverflow', + relation: 'parent', + name: 'Stack Overflow en español', + site_url: 'https://es.stackoverflow.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=es.stackoverflow.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://es.meta.stackoverflow.com', + }, + { + aliases: ['https://threedprinting.stackexchange.com'], + closed_beta_date: 1452625200, + audience: '3D printing enthusiasts', + favicon_url: 'https://cdn.sstatic.net/Sites/3dprinting/Img/favicon.ico', + api_site_parameter: '3dprinting', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/3dprinting/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/3dprinting/Img/apple-touch-icon.png', + launch_date: 1639665491, + logo_url: 'https://cdn.sstatic.net/Sites/3dprinting/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: '3dprinting.meta', + relation: 'meta', + name: '3D Printing Meta Stack Exchange', + site_url: 'https://3dprinting.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=3dprinting.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: '3D Printing', + open_beta_date: 1454365714, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://3dprinting.stackexchange.com', + }, + { + aliases: ['https://meta.3dprinting.stackexchange.com'], + audience: '3D printing enthusiasts', + api_site_parameter: '3dprinting.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/3dprintingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/3dprintingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/3dprintingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/3dprintingmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'MHChemMathJax'], + name: '3D Printing Meta', + related_sites: [ + { + api_site_parameter: '3dprinting', + relation: 'parent', + name: '3D Printing Stack Exchange', + site_url: 'https://3dprinting.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=3dprinting.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://3dprinting.meta.stackexchange.com', + }, + { + closed_beta_date: 1453316400, + audience: + 'users of Ethereum, the decentralized application platform and smart contract enabled blockchain', + favicon_url: 'https://cdn.sstatic.net/Sites/ethereum/Img/favicon.ico', + api_site_parameter: 'ethereum', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ethereum/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ethereum/Img/apple-touch-icon.png', + launch_date: 1498500594, + logo_url: 'https://cdn.sstatic.net/Sites/ethereum/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ethereum.meta', + relation: 'meta', + name: 'Ethereum Meta Stack Exchange', + site_url: 'https://ethereum.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ethereum.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Ethereum', + open_beta_date: 1454365663, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ethereum.stackexchange.com', + }, + { + aliases: ['https://meta.ethereum.stackexchange.com'], + audience: + 'users of Ethereum, the decentralized application platform and smart contract enabled blockchain', + api_site_parameter: 'ethereum.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/ethereummeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/ethereummeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ethereummeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/ethereummeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Ethereum Meta', + related_sites: [ + { + api_site_parameter: 'ethereum', + relation: 'parent', + name: 'Ethereum Stack Exchange', + site_url: 'https://ethereum.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ethereum.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://ethereum.meta.stackexchange.com', + }, + { + closed_beta_date: 1456254000, + audience: + 'linguists, teachers, and students wanting to discuss the finer points of the Latin language', + favicon_url: 'https://cdn.sstatic.net/Sites/latin/Img/favicon.ico', + api_site_parameter: 'latin', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/latin/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/latin/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/latin/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'latin.meta', + relation: 'meta', + name: 'Latin Language Meta Stack Exchange', + site_url: 'https://latin.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=latin.stackexchange.com', + }, + ], + name: 'Latin Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1458079490, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://latin.stackexchange.com', + }, + { + aliases: ['https://meta.latin.stackexchange.com'], + api_site_parameter: 'latin.meta', + audience: + 'linguists, teachers, and students wanting to discuss the finer points of the Latin language', + favicon_url: 'https://cdn.sstatic.net/Sites/latinmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/latinmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/latinmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/latinmeta/Img/apple-touch-icon.png', + name: 'Latin Language Meta', + related_sites: [ + { + api_site_parameter: 'latin', + name: 'Latin Language Stack Exchange', + relation: 'parent', + site_url: 'https://latin.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=latin.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://latin.meta.stackexchange.com', + }, + { + closed_beta_date: 1459882800, + audience: + 'students, teachers, polyglots, and anyone interested in the techniques of second-language acquisition', + favicon_url: 'https://cdn.sstatic.net/Sites/languagelearning/Img/favicon.ico', + api_site_parameter: 'languagelearning', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/languagelearning/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/languagelearning/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/languagelearning/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'languagelearning.meta', + relation: 'meta', + name: 'Language Learning Meta Stack Exchange', + site_url: 'https://languagelearning.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=languagelearning.stackexchange.com', + }, + ], + name: 'Language Learning', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1461623189, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://languagelearning.stackexchange.com', + }, + { + aliases: ['https://meta.languagelearning.stackexchange.com'], + api_site_parameter: 'languagelearning.meta', + audience: + 'students, teachers, polyglots, and anyone interested in the techniques of second-language acquisition', + favicon_url: 'https://cdn.sstatic.net/Sites/languagelearningmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/languagelearningmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/languagelearningmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/languagelearningmeta/Img/apple-touch-icon.png', + name: 'Language Learning Meta', + related_sites: [ + { + api_site_parameter: 'languagelearning', + name: 'Language Learning Stack Exchange', + relation: 'parent', + site_url: 'https://languagelearning.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=languagelearning.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://languagelearning.meta.stackexchange.com', + }, + { + closed_beta_date: 1461092400, + audience: + 'vintage-computer hobbyists interested in restoring, preserving, and using the classic computer and gaming systems of yesteryear', + favicon_url: 'https://cdn.sstatic.net/Sites/retrocomputing/Img/favicon.ico', + api_site_parameter: 'retrocomputing', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/retrocomputing/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/retrocomputing/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/retrocomputing/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'retrocomputing.meta', + relation: 'meta', + name: 'Retrocomputing Meta Stack Exchange', + site_url: 'https://retrocomputing.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=retrocomputing.stackexchange.com', + }, + ], + name: 'Retrocomputing', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1462821721, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://retrocomputing.stackexchange.com', + }, + { + aliases: ['https://meta.retrocomputing.stackexchange.com'], + api_site_parameter: 'retrocomputing.meta', + audience: + 'vintage-computer hobbyists interested in restoring, preserving, and using the classic computer and gaming systems of yesteryear', + favicon_url: 'https://cdn.sstatic.net/Sites/retrocomputingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/retrocomputingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/retrocomputingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/retrocomputingmeta/Img/apple-touch-icon.png', + name: 'Retrocomputing Meta', + related_sites: [ + { + api_site_parameter: 'retrocomputing', + name: 'Retrocomputing Stack Exchange', + relation: 'parent', + site_url: 'https://retrocomputing.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=retrocomputing.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://retrocomputing.meta.stackexchange.com', + }, + { + closed_beta_date: 1461697200, + audience: 'artists and crafters', + favicon_url: 'https://cdn.sstatic.net/Sites/crafts/Img/favicon.ico', + api_site_parameter: 'crafts', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/crafts/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/crafts/Img/apple-touch-icon.png', + launch_date: 1639665491, + logo_url: 'https://cdn.sstatic.net/Sites/crafts/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'crafts.meta', + relation: 'meta', + name: 'Arts & Crafts Meta Stack Exchange', + site_url: 'https://crafts.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=crafts.stackexchange.com', + }, + ], + name: 'Arts & Crafts', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1463503115, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://crafts.stackexchange.com', + }, + { + aliases: ['https://meta.crafts.stackexchange.com'], + api_site_parameter: 'crafts.meta', + audience: 'artists and crafters', + favicon_url: 'https://cdn.sstatic.net/Sites/craftsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/craftsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/craftsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/craftsmeta/Img/apple-touch-icon.png', + name: 'Arts & Crafts Meta', + related_sites: [ + { + api_site_parameter: 'crafts', + name: 'Arts & Crafts Stack Exchange', + relation: 'parent', + site_url: 'https://crafts.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=crafts.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://crafts.meta.stackexchange.com', + }, + { + closed_beta_date: 1466535600, + audience: 'linguists, teachers and students of the Korean language', + favicon_url: 'https://cdn.sstatic.net/Sites/korean/Img/favicon.ico', + api_site_parameter: 'korean', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/korean/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/korean/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/korean/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'korean.meta', + relation: 'meta', + name: 'Korean Language Meta Stack Exchange', + site_url: 'https://korean.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=korean.stackexchange.com', + }, + ], + name: 'Korean Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1468341244, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://korean.stackexchange.com', + }, + { + aliases: ['https://meta.korean.stackexchange.com'], + api_site_parameter: 'korean.meta', + audience: 'linguists, teachers and students of the Korean language', + favicon_url: 'https://cdn.sstatic.net/Sites/koreanmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/koreanmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/koreanmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/koreanmeta/Img/apple-touch-icon.png', + name: 'Korean Language Meta', + related_sites: [ + { + api_site_parameter: 'korean', + name: 'Korean Language Stack Exchange', + relation: 'parent', + site_url: 'https://korean.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=korean.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://korean.meta.stackexchange.com', + }, + { + closed_beta_date: 1468954800, + audience: 'developers and users of the secure, private and untraceable cryptocurrency Monero', + favicon_url: 'https://cdn.sstatic.net/Sites/monero/Img/favicon.ico', + api_site_parameter: 'monero', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/monero/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/monero/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/monero/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'monero.meta', + relation: 'meta', + name: 'Monero Meta Stack Exchange', + site_url: 'https://monero.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=monero.stackexchange.com', + }, + ], + name: 'Monero', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1470756590, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://monero.stackexchange.com', + }, + { + aliases: ['https://meta.monero.stackexchange.com'], + api_site_parameter: 'monero.meta', + audience: 'developers and users of the secure, private and untraceable cryptocurrency Monero', + favicon_url: 'https://cdn.sstatic.net/Sites/monerometa/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/monerometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/monerometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/monerometa/Img/apple-touch-icon.png', + name: 'Monero Meta', + related_sites: [ + { + api_site_parameter: 'monero', + name: 'Monero Stack Exchange', + relation: 'parent', + site_url: 'https://monero.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=monero.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://monero.meta.stackexchange.com', + }, + { + closed_beta_date: 1470164400, + audience: + 'people interested in conceptual questions about life and challenges in a world where "cognitive" functions can be mimicked in purely digital environment', + favicon_url: 'https://cdn.sstatic.net/Sites/ai/Img/favicon.ico', + api_site_parameter: 'ai', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ai/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ai/Img/apple-touch-icon.png', + launch_date: 1639665491, + logo_url: 'https://cdn.sstatic.net/Sites/ai/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ai.meta', + relation: 'meta', + name: 'Artificial Intelligence Meta Stack Exchange', + site_url: 'https://ai.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ai.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Artificial Intelligence', + open_beta_date: 1471907237, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ai.stackexchange.com', + }, + { + aliases: ['https://meta.ai.stackexchange.com'], + audience: + 'people interested in conceptual questions about life and challenges in a world where "cognitive" functions can be mimicked in purely digital environment', + api_site_parameter: 'ai.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/aimeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/aimeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/aimeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/aimeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Artificial Intelligence Meta', + related_sites: [ + { + api_site_parameter: 'ai', + relation: 'parent', + name: 'Artificial Intelligence Stack Exchange', + site_url: 'https://ai.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ai.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://ai.meta.stackexchange.com', + }, + { + closed_beta_date: 1471978800, + audience: 'teachers and students of the Esperanto language', + favicon_url: 'https://cdn.sstatic.net/Sites/esperanto/Img/favicon.ico', + api_site_parameter: 'esperanto', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/esperanto/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/esperanto/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/esperanto/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'esperanto.meta', + relation: 'meta', + name: 'Esperanto Language Meta Stack Exchange', + site_url: 'https://esperanto.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=esperanto.stackexchange.com', + }, + ], + name: 'Esperanto Language', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1473795823, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://esperanto.stackexchange.com', + }, + { + aliases: ['https://meta.esperanto.stackexchange.com'], + api_site_parameter: 'esperanto.meta', + audience: 'teachers and students of the Esperanto language', + favicon_url: 'https://cdn.sstatic.net/Sites/esperantometa/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/esperantometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/esperantometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/esperantometa/Img/apple-touch-icon.png', + name: 'Esperanto Language Meta', + related_sites: [ + { + api_site_parameter: 'esperanto', + name: 'Esperanto Language Stack Exchange', + relation: 'parent', + site_url: 'https://esperanto.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=esperanto.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://esperanto.meta.stackexchange.com', + }, + { + closed_beta_date: 1473793200, + audience: 'developers and end users of the Sitecore CMS and multichannel marketing software', + favicon_url: 'https://cdn.sstatic.net/Sites/sitecore/Img/favicon.ico', + api_site_parameter: 'sitecore', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/sitecore/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sitecore/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/sitecore/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'sitecore.meta', + relation: 'meta', + name: 'Sitecore Meta Stack Exchange', + site_url: 'https://sitecore.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sitecore.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Sitecore', + open_beta_date: 1476728764, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://sitecore.stackexchange.com', + }, + { + aliases: ['https://meta.sitecore.stackexchange.com'], + audience: 'developers and end users of the Sitecore CMS and multichannel marketing software', + api_site_parameter: 'sitecore.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/sitecoremeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/sitecoremeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/sitecoremeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/sitecoremeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Sitecore Meta', + related_sites: [ + { + api_site_parameter: 'sitecore', + relation: 'parent', + name: 'Sitecore Stack Exchange', + site_url: 'https://sitecore.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=sitecore.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://sitecore.meta.stackexchange.com', + }, + { + closed_beta_date: 1481050800, + audience: + 'builders and users of networked sensors and control devices in the contexts of smart homes, industry automation, or environmental sensors', + favicon_url: 'https://cdn.sstatic.net/Sites/iot/Img/favicon.ico', + api_site_parameter: 'iot', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/iot/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/iot/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/iot/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'iot.meta', + relation: 'meta', + name: 'Internet of Things Meta Stack Exchange', + site_url: 'https://iot.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=iot.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + name: 'Internet of Things', + open_beta_date: 1483464453, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://iot.stackexchange.com', + }, + { + aliases: ['https://meta.iot.stackexchange.com'], + audience: + 'builders and users of networked sensors and control devices in the contexts of smart homes, industry automation, or environmental sensors', + api_site_parameter: 'iot.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/iotmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/iotmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/iotmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/iotmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Internet of Things Meta', + related_sites: [ + { + api_site_parameter: 'iot', + relation: 'parent', + name: 'Internet of Things Stack Exchange', + site_url: 'https://iot.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=iot.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://iot.meta.stackexchange.com', + }, + { + closed_beta_date: 1484766000, + audience: 'scholars and enthusiasts of literature', + favicon_url: 'https://cdn.sstatic.net/Sites/literature/Img/favicon.ico', + api_site_parameter: 'literature', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/literature/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/literature/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/literature/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'literature.meta', + relation: 'meta', + name: 'Literature Meta Stack Exchange', + site_url: 'https://literature.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=literature.stackexchange.com', + }, + ], + name: 'Literature', + styling: { tag_background_color: '#FFF', tag_foreground_color: '#000', link_color: '#0077CC' }, + open_beta_date: 1486420676, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://literature.stackexchange.com', + }, + { + aliases: ['https://meta.literature.stackexchange.com'], + api_site_parameter: 'literature.meta', + audience: 'scholars and enthusiasts of literature', + favicon_url: 'https://cdn.sstatic.net/Sites/literaturemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/literaturemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/literaturemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/literaturemeta/Img/apple-touch-icon.png', + name: 'Literature Meta', + related_sites: [ + { + api_site_parameter: 'literature', + name: 'Literature Stack Exchange', + relation: 'parent', + site_url: 'https://literature.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=literature.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#FFF', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://literature.meta.stackexchange.com', + }, + { + aliases: ['https://vegetarian.stackexchange.com', 'https://veg.stackexchange.com'], + audience: + 'those committed to a vegan or vegetarian lifestyle and anyone interested in learning more', + api_site_parameter: 'vegetarianism', + closed_beta_date: 1485889200, + favicon_url: 'https://cdn.sstatic.net/Sites/vegetarianism/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/vegetarianism/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/vegetarianism/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/vegetarianism/Img/apple-touch-icon.png', + name: 'Veganism & Vegetarianism', + related_sites: [ + { + api_site_parameter: 'vegetarianism.meta', + relation: 'meta', + name: 'Veganism & Vegetarianism Meta Stack Exchange', + site_url: 'https://vegetarianism.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=vegetarianism.stackexchange.com', + }, + ], + open_beta_date: 1487714325, + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://vegetarianism.stackexchange.com', + }, + { + aliases: [ + 'https://meta.vegetarian.stackexchange.com', + 'https://meta.vegetarianism.stackexchange.com', + 'https://veg.meta.stackexchange.com', + ], + api_site_parameter: 'vegetarianism.meta', + audience: + 'those committed to a vegan or vegetarian lifestyle and anyone interested in learning more', + favicon_url: 'https://cdn.sstatic.net/Sites/vegetarianismmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/vegetarianismmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/vegetarianismmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/vegetarianismmeta/Img/apple-touch-icon.png', + name: 'Veganism & Vegetarianism Meta', + related_sites: [ + { + api_site_parameter: 'vegetarianism', + name: 'Veganism & Vegetarianism Stack Exchange', + relation: 'parent', + site_url: 'https://vegetarianism.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=vegetarianism.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://vegetarianism.meta.stackexchange.com', + }, + { + closed_beta_date: 1486494000, + audience: 'linguists, teachers and students of the Ukrainian language', + favicon_url: 'https://cdn.sstatic.net/Sites/ukrainian/Img/favicon.ico', + api_site_parameter: 'ukrainian', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ukrainian/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ukrainian/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/ukrainian/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'ukrainian.meta', + relation: 'meta', + name: 'Ukrainian Language Meta Stack Exchange', + site_url: 'https://ukrainian.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=ukrainian.stackexchange.com', + }, + ], + name: 'Ukrainian Language', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1488300516, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://ukrainian.stackexchange.com', + }, + { + aliases: ['https://meta.ukrainian.stackexchange.com'], + api_site_parameter: 'ukrainian.meta', + audience: 'linguists, teachers and students of the Ukrainian language', + favicon_url: 'https://cdn.sstatic.net/Sites/ukrainianmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/ukrainianmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ukrainianmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/ukrainianmeta/Img/apple-touch-icon.png', + name: 'Ukrainian Language Meta', + related_sites: [ + { + api_site_parameter: 'ukrainian', + name: 'Ukrainian Language Stack Exchange', + relation: 'parent', + site_url: 'https://ukrainian.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=ukrainian.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://ukrainian.meta.stackexchange.com', + }, + { + closed_beta_date: 1488308400, + audience: + 'software engineers working on automated testing, continuous delivery, service integration and monitoring, and building SDLC infrastructure', + favicon_url: 'https://cdn.sstatic.net/Sites/devops/Img/favicon.ico', + api_site_parameter: 'devops', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/devops/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/devops/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/devops/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'devops.meta', + relation: 'meta', + name: 'DevOps Meta Stack Exchange', + site_url: 'https://devops.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=devops.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'DevOps', + open_beta_date: 1490197325, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://devops.stackexchange.com', + }, + { + aliases: ['https://meta.devops.stackexchange.com'], + audience: + 'software engineers working on automated testing, continuous delivery, service integration and monitoring, and building SDLC infrastructure', + api_site_parameter: 'devops.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/devopsmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/devopsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/devopsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/devopsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'DevOps Meta', + related_sites: [ + { + api_site_parameter: 'devops', + relation: 'parent', + name: 'DevOps Stack Exchange', + site_url: 'https://devops.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=devops.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://devops.meta.stackexchange.com', + }, + { + closed_beta_date: 1494961200, + audience: + 'researchers, developers, students, teachers, and end users interested in bioinformatics', + favicon_url: 'https://cdn.sstatic.net/Sites/bioinformatics/Img/favicon.ico', + api_site_parameter: 'bioinformatics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bioinformatics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bioinformatics/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/bioinformatics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'bioinformatics.meta', + relation: 'meta', + name: 'Bioinformatics Meta Stack Exchange', + site_url: 'https://bioinformatics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bioinformatics.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Bioinformatics', + open_beta_date: 1496770227, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://bioinformatics.stackexchange.com', + }, + { + audience: + 'researchers, developers, students, teachers, and end users interested in bioinformatics', + api_site_parameter: 'bioinformatics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/bioinformaticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bioinformaticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bioinformaticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/bioinformaticsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Bioinformatics Meta', + related_sites: [ + { + api_site_parameter: 'bioinformatics', + relation: 'parent', + name: 'Bioinformatics Stack Exchange', + site_url: 'https://bioinformatics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bioinformatics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://bioinformatics.meta.stackexchange.com', + }, + { + closed_beta_date: 1495566000, + audience: 'those involved in the field of teaching Computer Science', + favicon_url: 'https://cdn.sstatic.net/Sites/cseducators/Img/favicon.ico', + api_site_parameter: 'cseducators', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/cseducators/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cseducators/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/cseducators/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'cseducators.meta', + relation: 'meta', + name: 'Computer Science Educators Meta Stack Exchange', + site_url: 'https://cseducators.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cseducators.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Computer Science Educators', + open_beta_date: 1497369563, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://cseducators.stackexchange.com', + }, + { + audience: 'those involved in the field of teaching Computer Science', + api_site_parameter: 'cseducators.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/cseducatorsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/cseducatorsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cseducatorsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cseducatorsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Computer Science Educators Meta', + related_sites: [ + { + api_site_parameter: 'cseducators', + relation: 'parent', + name: 'Computer Science Educators Stack Exchange', + site_url: 'https://cseducators.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cseducators.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://cseducators.meta.stackexchange.com', + }, + { + aliases: ['https://interpersonalskills.stackexchange.com', 'https://ips.stackexchange.com'], + audience: 'people looking to improve their interpersonal communication skills', + api_site_parameter: 'interpersonal', + closed_beta_date: 1498590000, + favicon_url: 'https://cdn.sstatic.net/Sites/interpersonal/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/interpersonal/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/interpersonal/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/interpersonal/Img/apple-touch-icon.png', + name: 'Interpersonal Skills', + related_sites: [ + { + api_site_parameter: 'interpersonal.meta', + relation: 'meta', + name: 'Interpersonal Skills Meta Stack Exchange', + site_url: 'https://interpersonal.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=interpersonal.stackexchange.com', + }, + ], + open_beta_date: 1500407358, + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://interpersonal.stackexchange.com', + }, + { + aliases: [ + 'https://interpersonalskills.meta.stackexchange.com', + 'https://ips.meta.stackexchange.com', + ], + api_site_parameter: 'interpersonal.meta', + audience: 'people looking to improve their interpersonal communication skills', + favicon_url: 'https://cdn.sstatic.net/Sites/interpersonalmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/interpersonalmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/interpersonalmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/interpersonalmeta/Img/apple-touch-icon.png', + name: 'Interpersonal Skills Meta', + related_sites: [ + { + api_site_parameter: 'interpersonal', + name: 'Interpersonal Skills Stack Exchange', + relation: 'parent', + site_url: 'https://interpersonal.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=interpersonal.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://interpersonal.meta.stackexchange.com', + }, + { + closed_beta_date: 1511895600, + audience: + 'users of Iota, the open-source cryptocurrency for IoT that does not use a blockchain', + favicon_url: 'https://cdn.sstatic.net/Sites/iota/Img/favicon.ico', + api_site_parameter: 'iota', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/iota/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/iota/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/iota/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'iota.meta', + relation: 'meta', + name: 'Iota Meta Stack Exchange', + site_url: 'https://iota.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=iota.stackexchange.com', + }, + ], + name: 'Iota', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1513788798, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://iota.stackexchange.com', + }, + { + api_site_parameter: 'iota.meta', + audience: + 'users of Iota, the open-source cryptocurrency for IoT that does not use a blockchain', + favicon_url: 'https://cdn.sstatic.net/Sites/iotameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/iotameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/iotameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/iotameta/Img/apple-touch-icon.png', + name: 'Iota Meta', + related_sites: [ + { + api_site_parameter: 'iota', + name: 'Iota Stack Exchange', + relation: 'parent', + site_url: 'https://iota.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=iota.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://iota.meta.stackexchange.com', + }, + { + closed_beta_date: 1516215600, + audience: 'developers and users of Stellar and the Stellar Distributed Exchange', + favicon_url: 'https://cdn.sstatic.net/Sites/stellar/Img/favicon.ico', + api_site_parameter: 'stellar', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/stellar/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/stellar/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/stellar/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'stellar.meta', + relation: 'meta', + name: 'Stellar Meta Stack Exchange', + site_url: 'https://stellar.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=stellar.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Stellar', + open_beta_date: 1517947148, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://stellar.stackexchange.com', + }, + { + audience: 'developers and users of Stellar and the Stellar Distributed Exchange', + api_site_parameter: 'stellar.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/stellarmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/stellarmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/stellarmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/stellarmeta/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Stellar Meta', + related_sites: [ + { + api_site_parameter: 'stellar', + relation: 'parent', + name: 'Stellar Stack Exchange', + site_url: 'https://stellar.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=stellar.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://stellar.meta.stackexchange.com', + }, + { + audience: + 'designers and users of artificial or invented languages, consciously developed instead of having developed naturally', + api_site_parameter: 'conlang', + closed_beta_date: 1517943600, + favicon_url: 'https://cdn.sstatic.net/Sites/conlang/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/conlang/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/conlang/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/conlang/Img/apple-touch-icon.png', + name: 'Constructed Languages', + related_sites: [ + { + api_site_parameter: 'conlang.meta', + relation: 'meta', + name: 'Constructed Languages Meta Stack Exchange', + site_url: 'https://conlang.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=conlang.stackexchange.com', + }, + ], + open_beta_date: 1519765141, + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://conlang.stackexchange.com', + }, + { + api_site_parameter: 'conlang.meta', + audience: + 'designers and users of artificial or invented languages, consciously developed instead of having developed naturally', + favicon_url: 'https://cdn.sstatic.net/Sites/conlangmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/conlangmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/conlangmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/conlangmeta/Img/apple-touch-icon.png', + name: 'Constructed Languages Meta', + related_sites: [ + { + api_site_parameter: 'conlang', + name: 'Constructed Languages Stack Exchange', + relation: 'parent', + site_url: 'https://conlang.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=conlang.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://conlang.meta.stackexchange.com', + }, + { + closed_beta_date: 1520881200, + audience: + 'engineers, scientists, programmers, and computing professionals interested in quantum computing', + favicon_url: 'https://cdn.sstatic.net/Sites/quantumcomputing/Img/favicon.ico', + api_site_parameter: 'quantumcomputing', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/quantumcomputing/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/quantumcomputing/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/quantumcomputing/Img/logo.png', + related_sites: [ + { + api_site_parameter: 'quantumcomputing.meta', + relation: 'meta', + name: 'Quantum Computing Meta Stack Exchange', + site_url: 'https://quantumcomputing.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=quantumcomputing.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax', 'Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Quantum Computing', + open_beta_date: 1522779676, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://quantumcomputing.stackexchange.com', + }, + { + audience: + 'engineers, scientists, programmers, and computing professionals interested in quantum computing', + api_site_parameter: 'quantumcomputing.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/quantumcomputingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/quantumcomputingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/quantumcomputingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/quantumcomputingmeta/Img/logo.png', + markdown_extensions: ['MathJax', 'MHChemMathJax', 'Prettify'], + name: 'Quantum Computing Meta', + related_sites: [ + { + api_site_parameter: 'quantumcomputing', + relation: 'parent', + name: 'Quantum Computing Stack Exchange', + site_url: 'https://quantumcomputing.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=quantumcomputing.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://quantumcomputing.meta.stackexchange.com', + }, + { + closed_beta_date: 1525806000, + audience: + 'users and developers of distributed applications built on top of the blockchain operating system, EOS.IO', + favicon_url: 'https://cdn.sstatic.net/Sites/eosio/Img/favicon.ico', + api_site_parameter: 'eosio', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/eosio/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/eosio/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/eosio/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'eosio.meta', + relation: 'meta', + name: 'EOS.IO Meta Stack Exchange', + site_url: 'https://eosio.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=eosio.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'EOS.IO', + open_beta_date: 1527708031, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://eosio.stackexchange.com', + }, + { + audience: + 'users and developers of distributed applications built on top of the blockchain operating system, EOS.IO', + api_site_parameter: 'eosio.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/eosiometa/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/eosiometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/eosiometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/eosiometa/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'EOS.IO Meta', + related_sites: [ + { + api_site_parameter: 'eosio', + relation: 'parent', + name: 'EOS.IO Stack Exchange', + site_url: 'https://eosio.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=eosio.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://eosio.meta.stackexchange.com', + }, + { + closed_beta_date: 1548788400, + audience: 'users, experts, and developers of the Tezos blockchain project', + favicon_url: 'https://cdn.sstatic.net/Sites/tezos/Img/favicon.ico', + api_site_parameter: 'tezos', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tezos/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tezos/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/tezos/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'tezos.meta', + relation: 'meta', + name: 'Tezos Meta Stack Exchange', + site_url: 'https://tezos.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=tezos.stackexchange.com', + }, + ], + name: 'Tezos', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1550690462, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://tezos.stackexchange.com', + }, + { + api_site_parameter: 'tezos.meta', + audience: 'users, experts, and developers of the Tezos blockchain project', + favicon_url: 'https://cdn.sstatic.net/Sites/tezosmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/tezosmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/tezosmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/tezosmeta/Img/apple-touch-icon.png', + name: 'Tezos Meta', + related_sites: [ + { + api_site_parameter: 'tezos', + name: 'Tezos Stack Exchange', + relation: 'parent', + site_url: 'https://tezos.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=tezos.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://tezos.meta.stackexchange.com', + }, + { + closed_beta_date: 1559242800, + audience: 'operations research and analytics professionals, educators, and students', + favicon_url: 'https://cdn.sstatic.net/Sites/or/Img/favicon.ico', + api_site_parameter: 'or', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/or/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/or/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/or/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'or.meta', + relation: 'meta', + name: 'Operations Research Meta Stack Exchange', + site_url: 'https://or.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=or.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Operations Research', + open_beta_date: 1561053444, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://or.stackexchange.com', + }, + { + audience: 'operations research and analytics professionals, educators, and students', + api_site_parameter: 'or.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/ormeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/ormeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/ormeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/ormeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Operations Research Meta', + related_sites: [ + { + api_site_parameter: 'or', + relation: 'parent', + name: 'Operations Research Stack Exchange', + site_url: 'https://or.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=or.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://or.meta.stackexchange.com', + }, + { + closed_beta_date: 1586890800, + audience: 'experienced flyers, pilots, and builders of drones and model aircraft', + favicon_url: 'https://cdn.sstatic.net/Sites/drones/Img/favicon.ico', + api_site_parameter: 'drones', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/drones/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/drones/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/drones/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'drones.meta', + relation: 'meta', + name: 'Drones and Model Aircraft Meta Stack Exchange', + site_url: 'https://drones.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=drones.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Drones and Model Aircraft', + open_beta_date: 1588099735, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://drones.stackexchange.com', + }, + { + audience: 'experienced flyers, pilots, and builders of drones and model aircraft', + api_site_parameter: 'drones.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/dronesmeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/dronesmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/dronesmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/dronesmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Drones and Model Aircraft Meta', + related_sites: [ + { + api_site_parameter: 'drones', + relation: 'parent', + name: 'Drones and Model Aircraft Stack Exchange', + site_url: 'https://drones.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=drones.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://drones.meta.stackexchange.com', + }, + { + aliases: ['https://materials.stackexchange.com'], + closed_beta_date: 1588100400, + audience: 'materials modelers and data scientists', + favicon_url: 'https://cdn.sstatic.net/Sites/mattermodeling/Img/favicon.ico', + api_site_parameter: 'mattermodeling', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mattermodeling/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mattermodeling/Img/apple-touch-icon.png', + launch_date: 1639665691, + logo_url: 'https://cdn.sstatic.net/Sites/mattermodeling/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'mattermodeling.meta', + relation: 'meta', + name: 'Matter Modeling Meta Stack Exchange', + site_url: 'https://mattermodeling.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mattermodeling.stackexchange.com', + }, + ], + markdown_extensions: ['MathJax', 'MHChemMathJax', 'Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Matter Modeling', + open_beta_date: 1589919039, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://mattermodeling.stackexchange.com', + }, + { + aliases: ['https://materials.meta.stackexchange.com'], + audience: 'materials modelers and data scientists', + api_site_parameter: 'mattermodeling.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/mattermodelingmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/mattermodelingmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/mattermodelingmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/mattermodelingmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'MHChemMathJax'], + name: 'Matter Modeling Meta', + related_sites: [ + { + api_site_parameter: 'mattermodeling', + relation: 'parent', + name: 'Matter Modeling Stack Exchange', + site_url: 'https://mattermodeling.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=mattermodeling.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://mattermodeling.meta.stackexchange.com', + }, + { + closed_beta_date: 1619550000, + audience: 'users and developers of the Cardano cryptocurrency ecosystem', + favicon_url: 'https://cdn.sstatic.net/Sites/cardano/Img/favicon.ico', + api_site_parameter: 'cardano', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/cardano/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cardano/Img/apple-touch-icon.png', + launch_date: 1643898670, + logo_url: 'https://cdn.sstatic.net/Sites/cardano/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'cardano.meta', + relation: 'meta', + name: 'Cardano Meta Stack Exchange', + site_url: 'https://cardano.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cardano.stackexchange.com', + }, + ], + markdown_extensions: ['Prettify'], + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + name: 'Cardano', + open_beta_date: 1621959680, + site_state: 'normal', + site_type: 'main_site', + site_url: 'https://cardano.stackexchange.com', + }, + { + audience: 'users and developers of the Cardano cryptocurrency ecosystem', + api_site_parameter: 'cardano.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/cardanometa/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/cardanometa/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/cardanometa/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/cardanometa/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + name: 'Cardano Meta', + related_sites: [ + { + api_site_parameter: 'cardano', + relation: 'parent', + name: 'Cardano Stack Exchange', + site_url: 'https://cardano.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=cardano.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://cardano.meta.stackexchange.com', + }, + { + closed_beta_date: 1644346800, + audience: 'mathematicians and computer scientists who develop and use proof assistants', + favicon_url: 'https://cdn.sstatic.net/Sites/proofassistants/Img/favicon.ico', + api_site_parameter: 'proofassistants', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/proofassistants/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/proofassistants/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/proofassistants/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'proofassistants.meta', + relation: 'meta', + name: 'Proof Assistants Meta Stack Exchange', + site_url: 'https://proofassistants.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=proofassistants.stackexchange.com', + }, + ], + name: 'Proof Assistants', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1647364045, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://proofassistants.stackexchange.com', + }, + { + audience: 'mathematicians and computer scientists who develop and use proof assistants', + api_site_parameter: 'proofassistants.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/proofassistantsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/proofassistantsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/proofassistantsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/proofassistantsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Proof Assistants Meta', + related_sites: [ + { + api_site_parameter: 'proofassistants', + relation: 'parent', + name: 'Proof Assistants Stack Exchange', + site_url: 'https://proofassistants.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=proofassistants.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://proofassistants.meta.stackexchange.com', + }, + { + aliases: ['https://polkadot.stackexchange.com'], + closed_beta_date: 1644346800, + audience: 'developers building blockchains with the Substrate SDK', + favicon_url: 'https://cdn.sstatic.net/Sites/substrate/Img/favicon.ico', + api_site_parameter: 'substrate', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/substrate/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/substrate/Img/apple-touch-icon.png', + markdown_extensions: ['Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/substrate/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'substrate.meta', + relation: 'meta', + name: 'Substrate and Polkadot Meta Stack Exchange', + site_url: 'https://substrate.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=substrate.stackexchange.com', + }, + ], + name: 'Substrate and Polkadot', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1650570592, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://substrate.stackexchange.com', + }, + { + aliases: ['https://polkadot.meta.stackexchange.com'], + api_site_parameter: 'substrate.meta', + audience: 'developers building blockchains with the Substrate SDK', + favicon_url: 'https://cdn.sstatic.net/Sites/substratemeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/substratemeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/substratemeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/substratemeta/Img/apple-touch-icon.png', + name: 'Substrate and Polkadot Meta', + related_sites: [ + { + api_site_parameter: 'substrate', + name: 'Substrate and Polkadot Stack Exchange', + relation: 'parent', + site_url: 'https://substrate.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=substrate.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://substrate.meta.stackexchange.com', + }, + { + closed_beta_date: 1655838000, + audience: + 'people interested in the studies of non-human animal sounds and the impacts of sounds on animals', + favicon_url: 'https://cdn.sstatic.net/Sites/bioacoustics/Img/favicon.ico', + api_site_parameter: 'bioacoustics', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bioacoustics/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bioacoustics/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + logo_url: 'https://cdn.sstatic.net/Sites/bioacoustics/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'bioacoustics.meta', + relation: 'meta', + name: 'Bioacoustics Meta Stack Exchange', + site_url: 'https://bioacoustics.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bioacoustics.stackexchange.com', + }, + ], + name: 'Bioacoustics', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1658867119, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://bioacoustics.stackexchange.com', + }, + { + audience: + 'people interested in the studies of non-human animal sounds and the impacts of sounds on animals', + api_site_parameter: 'bioacoustics.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/bioacousticsmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/bioacousticsmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/bioacousticsmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/bioacousticsmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax'], + name: 'Bioacoustics Meta', + related_sites: [ + { + api_site_parameter: 'bioacoustics', + relation: 'parent', + name: 'Bioacoustics Stack Exchange', + site_url: 'https://bioacoustics.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=bioacoustics.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://bioacoustics.meta.stackexchange.com', + }, + { + audience: 'Solana software users and developers', + api_site_parameter: 'solana', + closed_beta_date: 1657652400, + favicon_url: 'https://cdn.sstatic.net/Sites/solana/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/solana/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/solana/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/solana/Img/apple-touch-icon.png', + name: 'Solana', + related_sites: [ + { + api_site_parameter: 'solana.meta', + relation: 'meta', + name: 'Solana Meta Stack Exchange', + site_url: 'https://solana.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=solana.stackexchange.com', + }, + ], + open_beta_date: 1660677376, + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://solana.stackexchange.com', + }, + { + api_site_parameter: 'solana.meta', + audience: 'Solana software users and developers', + favicon_url: 'https://cdn.sstatic.net/Sites/solanameta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/solanameta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/solanameta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/solanameta/Img/apple-touch-icon.png', + name: 'Solana Meta', + related_sites: [ + { + api_site_parameter: 'solana', + name: 'Solana Stack Exchange', + relation: 'parent', + site_url: 'https://solana.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=solana.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://solana.meta.stackexchange.com', + }, + { + aliases: ['https://languagedesign.stackexchange.com'], + closed_beta_date: 1684263600, + audience: 'designers and implementers of computer programming languages', + favicon_url: 'https://cdn.sstatic.net/Sites/langdev/Img/favicon.ico', + api_site_parameter: 'langdev', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/langdev/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/langdev/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + logo_url: 'https://cdn.sstatic.net/Sites/langdev/Img/apple-touch-icon.png', + related_sites: [ + { + api_site_parameter: 'langdev.meta', + relation: 'meta', + name: 'Programming Language Design and Implementation Meta Stack Exchange', + site_url: 'https://langdev.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=langdev.stackexchange.com', + }, + ], + name: 'Programming Language Design and Implementation', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + open_beta_date: 1687885837, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://langdev.stackexchange.com', + }, + { + aliases: ['https://languagedesign.meta.stackexchange.com'], + audience: 'designers and implementers of computer programming languages', + api_site_parameter: 'langdev.meta', + favicon_url: 'https://cdn.sstatic.net/Sites/langdevmeta/Img/favicon.ico', + high_resolution_icon_url: + 'https://cdn.sstatic.net/Sites/langdevmeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/langdevmeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/langdevmeta/Img/apple-touch-icon.png', + markdown_extensions: ['MathJax', 'Prettify'], + name: 'Programming Language Design and Implementation Meta', + related_sites: [ + { + api_site_parameter: 'langdev', + relation: 'parent', + name: 'Programming Language Design and Implementation Stack Exchange', + site_url: 'https://langdev.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=langdev.stackexchange.com', + }, + ], + site_state: 'linked_meta', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_type: 'meta_site', + site_url: 'https://langdev.meta.stackexchange.com', + }, + { + audience: + 'GenAI enthusiasts and practitioners and those interested in learning more about using GenAI tools', + api_site_parameter: 'genai', + closed_beta_date: 1689617537, + favicon_url: 'https://cdn.sstatic.net/Sites/genai/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/genai/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/genai/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/genai/Img/apple-touch-icon.png', + name: 'GenAI', + related_sites: [ + { + api_site_parameter: 'genai.meta', + relation: 'meta', + name: 'GenAI Meta Stack Exchange', + site_url: 'https://genai.meta.stackexchange.com', + }, + { + relation: 'chat', + name: 'Chat Stack Exchange', + site_url: 'https://chat.stackexchange.com?tab=site&host=genai.stackexchange.com', + }, + ], + open_beta_date: 1690297236, + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#000', + link_color: '#0077CC', + }, + site_state: 'open_beta', + site_type: 'main_site', + site_url: 'https://genai.stackexchange.com', + }, + { + api_site_parameter: 'genai.meta', + audience: + 'GenAI enthusiasts and practitioners and those interested in learning more about using GenAI tools', + favicon_url: 'https://cdn.sstatic.net/Sites/genaimeta/Img/favicon.ico', + high_resolution_icon_url: 'https://cdn.sstatic.net/Sites/genaimeta/Img/apple-touch-icon@2.png', + icon_url: 'https://cdn.sstatic.net/Sites/genaimeta/Img/apple-touch-icon.png', + logo_url: 'https://cdn.sstatic.net/Sites/genaimeta/Img/apple-touch-icon.png', + name: 'GenAI Meta', + related_sites: [ + { + api_site_parameter: 'genai', + name: 'GenAI Stack Exchange', + relation: 'parent', + site_url: 'https://genai.stackexchange.com', + }, + { + name: 'Chat Stack Exchange', + relation: 'chat', + site_url: 'https://chat.stackexchange.com?tab=site&host=genai.stackexchange.com', + }, + ], + site_state: 'linked_meta', + site_type: 'meta_site', + styling: { + tag_background_color: '#E0EAF1', + tag_foreground_color: '#666666', + link_color: '#3D3D3D', + }, + site_url: 'https://genai.meta.stackexchange.com', + }, +]; diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index f661eea..3fe09f5 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -1,4 +1,4 @@ -import { getHeartbeatFromPage } from './utils/heartbeat'; +import { getSite } from './utils/heartbeat'; const oneMinute = 60000; const fiveMinutes = 300000; @@ -56,16 +56,6 @@ const parseMeet = (): DesignProject | undefined => { }; }; -const getParser: { - [key: string]: - | (() => { editor: string; language: string; project: string } | undefined) - | undefined; -} = { - 'meet.google.com': parseMeet, - 'www.canva.com': parseCanva, - 'www.figma.com': parseFigma, -}; - /** * Debounces the execution of a function. * @@ -91,15 +81,22 @@ function debounce(func: () => void, timeout = oneMinute, maxWaitTime = fiveMinut } const sendHeartbeat = debounce(async () => { - const heartbeat = getHeartbeatFromPage(); - chrome.runtime.sendMessage({ heartbeat: heartbeat, task: 'sendHeartbeat' }); + chrome.runtime.sendMessage({ task: 'handleActivity' }); }); -chrome.runtime.onMessage.addListener((request: { message: string }, sender, sendResponse) => { - if (request.message === 'get_html') { - sendResponse({ html: document.documentElement.outerHTML }); - } -}); +chrome.runtime.onMessage.addListener( + (request: { task: string; url: string }, sender, sendResponse) => { + if (request.task === 'getHeartbeatFromPage') { + const site = getSite(request.url); + if (!site) { + sendResponse({ heartbeat: undefined }); + return; + } + + sendResponse({ heartbeat: site.parser(request.url) }); + } + }, +); document.body.addEventListener('click', sendHeartbeat, true); From 9820c22a28203310b3f6abc6ed08da792f168733 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 16:41:26 +0200 Subject: [PATCH 10/18] rename type --- src/core/WakaTimeCore.ts | 4 ++-- src/types/sites.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index fab016a..3949829 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -3,7 +3,7 @@ import browser, { Tabs } from 'webextension-polyfill'; /* eslint-disable no-fallthrough */ /* eslint-disable default-case */ import moment from 'moment'; -import { SiteInfo } from 'src/types/sites'; +import { OptionalHeartbeat } from 'src/types/sites'; import { getOperatingSystem } from '../utils'; import { changeExtensionStatus } from '../utils/changeExtensionStatus'; import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; @@ -139,7 +139,7 @@ class WakaTimeCore { const heartbeat = ( (await browser.tabs.sendMessage(tab.id, { task: 'getHeartbeatFromPage', url })) as { - heartbeat?: SiteInfo; + heartbeat?: OptionalHeartbeat; } ).heartbeat; diff --git a/src/types/sites.ts b/src/types/sites.ts index a2d2cb1..0ae61b7 100644 --- a/src/types/sites.ts +++ b/src/types/sites.ts @@ -14,7 +14,7 @@ export enum KnownSite { zoom = 'zoom', } -export interface SiteInfo { +export interface OptionalHeartbeat { branch?: string | null; category?: Category | null; entity?: string; @@ -23,7 +23,7 @@ export interface SiteInfo { project?: string | null; } -export type HeartbeatParser = (url: string) => SiteInfo | undefined; +export type HeartbeatParser = (url: string) => OptionalHeartbeat | undefined; export interface SiteParser { parser: HeartbeatParser; From 4d08aeb2fe89f559729399a84075bfa92ef2faac Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 20:36:44 +0200 Subject: [PATCH 11/18] finish core --- package-lock.json | 54 +++++-- package.json | 2 + src/components/MainList.tsx | 2 +- src/config/config.test.ts | 8 +- src/config/config.ts | 12 +- src/core/WakaTimeCore.ts | 241 +++++++++++++---------------- src/types/heartbeats.ts | 8 +- src/types/sites.ts | 1 + src/utils/apiKey.ts | 11 -- src/utils/changeExtensionStatus.ts | 8 +- src/utils/user.ts | 4 +- 11 files changed, 175 insertions(+), 176 deletions(-) diff --git a/package-lock.json b/package-lock.json index df738d3..d26469c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react-redux": "^8.0.5", "react-transition-group": "^4.4.5", "redux-logger": "^4.0.0", + "uuid": "^10.0.0", "webextension-polyfill": "^0.10.0" }, "devDependencies": { @@ -49,6 +50,7 @@ "@types/redux-logger": "^3.0.9", "@types/shelljs": "^0.8.8", "@types/sinon-chrome": "^2.2.11", + "@types/uuid": "^10.0.0", "@types/wait-on": "^5.2.0", "@types/webextension-polyfill": "^0.10.0", "@typescript-eslint/eslint-plugin": "^4.33.0", @@ -4096,6 +4098,13 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/wait-on": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", @@ -18779,6 +18788,17 @@ "node": ">=0.8" } }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-at": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", @@ -21388,13 +21408,16 @@ "dev": true }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { @@ -25578,6 +25601,12 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, "@types/wait-on": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", @@ -36628,6 +36657,12 @@ "psl": "^1.1.28", "punycode": "^2.1.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -38625,10 +38660,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" }, "v8-compile-cache": { "version": "2.3.0", diff --git a/package.json b/package.json index ac86170..251cb8a 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-redux": "^8.0.5", "react-transition-group": "^4.4.5", "redux-logger": "^4.0.0", + "uuid": "^10.0.0", "webextension-polyfill": "^0.10.0" }, "devDependencies": { @@ -70,6 +71,7 @@ "@types/redux-logger": "^3.0.9", "@types/shelljs": "^0.8.8", "@types/sinon-chrome": "^2.2.11", + "@types/uuid": "^10.0.0", "@types/wait-on": "^5.2.0", "@types/webextension-polyfill": "^0.10.0", "@typescript-eslint/eslint-plugin": "^4.33.0", diff --git a/src/components/MainList.tsx b/src/components/MainList.tsx index 92ba5e4..26b09a9 100644 --- a/src/components/MainList.tsx +++ b/src/components/MainList.tsx @@ -40,7 +40,7 @@ export default function MainList({ const disableLogging = async (): Promise => { dispatch(setLoggingEnabled(false)); await browser.storage.sync.set({ loggingEnabled: false }); - await changeExtensionState('notLogging'); + await changeExtensionState('trackingDisabled'); }; return ( diff --git a/src/config/config.test.ts b/src/config/config.test.ts index 6fc1980..871be13 100644 --- a/src/config/config.test.ts +++ b/src/config/config.test.ts @@ -29,7 +29,7 @@ describe('wakatime config', () => { "colors": { "allGood": "", "lightTheme": "white", - "notLogging": "gray", + "trackingDisabled": "gray", "notSignedIn": "red", }, "currentUserApiEndPoint": "/users/current", @@ -46,7 +46,7 @@ describe('wakatime config', () => { "udemy.com", "w3schools.com", ], - "heartbeatApiEndPoint": "/users/current/heartbeats", + "heartbeatApiEndPoint": "/users/current/heartbeats.bulk", "hostname": "", "loggingEnabled": true, "loggingStyle": "deny", @@ -71,7 +71,7 @@ describe('wakatime config', () => { ], "states": [ "allGood", - "notLogging", + "trackingDisabled", "notSignedIn", "ignored", ], @@ -80,7 +80,7 @@ describe('wakatime config', () => { "tooltips": { "allGood": "", "ignored": "This URL is ignored", - "notLogging": "Not logging", + "trackingDisabled": "Not logging", "notSignedIn": "Not signed In", }, "trackSocialMedia": true, diff --git a/src/config/config.ts b/src/config/config.ts index 2ffd421..45443fa 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -3,7 +3,7 @@ import browser from 'webextension-polyfill'; /** * Logging */ -export type ExtensionStatus = 'allGood' | 'notLogging' | 'notSignedIn' | 'ignored'; +export type ExtensionStatus = 'allGood' | 'trackingDisabled' | 'notSignedIn' | 'ignored'; /** * Supported logging style */ @@ -35,7 +35,7 @@ interface SuccessOrFailAlert { interface Colors { allGood: ''; lightTheme: 'white'; - notLogging: 'gray'; + trackingDisabled: 'gray'; notSignedIn: 'red'; } /** @@ -44,7 +44,7 @@ interface Colors { interface Tooltips { allGood: string; ignored: string; - notLogging: string; + trackingDisabled: string; notSignedIn: string; } @@ -126,7 +126,7 @@ const config: Config = { colors: { allGood: '', lightTheme: 'white', - notLogging: 'gray', + trackingDisabled: 'gray', notSignedIn: 'red', }, @@ -176,7 +176,7 @@ const config: Config = { 'youtube.com', ], - states: ['allGood', 'notLogging', 'notSignedIn', 'ignored'], + states: ['allGood', 'trackingDisabled', 'notSignedIn', 'ignored'], summariesApiEndPoint: process.env.SUMMARIES_API_URL ?? '/users/current/summaries', @@ -185,7 +185,7 @@ const config: Config = { tooltips: { allGood: '', ignored: 'This URL is ignored', - notLogging: 'Not logging', + trackingDisabled: 'Not logging', notSignedIn: 'Not signed In', }, trackSocialMedia: true, diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index 3949829..0b39caf 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -3,16 +3,15 @@ import browser, { Tabs } from 'webextension-polyfill'; /* eslint-disable no-fallthrough */ /* eslint-disable default-case */ import moment from 'moment'; -import { OptionalHeartbeat } from 'src/types/sites'; -import { getOperatingSystem } from '../utils'; +import { v4 as uuid4 } from 'uuid'; +import { OptionalHeartbeat } from '../types/sites'; +import { getOperatingSystem, IS_EDGE, IS_FIREFOX } from '../utils'; import { changeExtensionStatus } from '../utils/changeExtensionStatus'; import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; import { getSettings, Settings } from '../utils/settings'; import config, { ExtensionStatus } from '../config/config'; -import { EntityType, Heartbeat } from '../types/heartbeats'; -import { getApiKey } from '../utils/apiKey'; -import { getLoggingType } from '../utils/logging'; +import { EntityType, Heartbeat, HeartbeatsBulkResponse } from '../types/heartbeats'; class WakaTimeCore { tabsWithDevtoolsOpen: Tabs.Tab[]; @@ -32,17 +31,15 @@ class WakaTimeCore { const dbConnection = await openDB('wakatime', 1, { upgrade(db, oldVersion) { // Create a store of objects - const store = db.createObjectStore('cacheHeartbeats', { - // The `time` property of the object will be the key, and be incremented automatically - keyPath: 'time', + const store = db.createObjectStore('heartbeatQueue', { + keyPath: 'id', }); // Switch over the oldVersion, *without breaks*, to allow the database to be incrementally upgraded. switch (oldVersion) { case 0: // Placeholder to execute when database is created (oldVersion is 0) case 1: - // Create an index called `type` based on the `type` property of objects in the store - store.createIndex('time', 'time'); + store.createIndex('id', 'id'); } }, }); @@ -95,7 +92,7 @@ class WakaTimeCore { async handleActivity(tabId: number) { const settings = await getSettings(); if (!settings.loggingEnabled) { - await changeExtensionStatus('notLogging'); + await changeExtensionStatus('trackingDisabled'); return; } @@ -118,7 +115,9 @@ class WakaTimeCore { if (!this.shouldSendHeartbeat(heartbeat)) return; // append heartbeat to queue - await this.db?.add('cacheHeartbeats', heartbeat); + await this.db?.add('heartbeatQueue', heartbeat); + + await this.sendHeartbeats(); } async getCurrentTab(tabId: number): Promise { @@ -145,157 +144,125 @@ class WakaTimeCore { const entity = settings.loggingType === 'domain' ? getDomainFromUrl(url) : url; return { - branch: heartbeat?.branch, + branch: heartbeat?.branch ?? '<>', category: heartbeat?.category, entity: heartbeat?.entity ?? entity, - entityType: heartbeat?.entityType ?? (settings.loggingType as EntityType), + id: uuid4(), language: heartbeat?.language, - project: heartbeat?.project, + project: heartbeat?.project ?? '<>', + time: this.getCurrentTime(), + type: heartbeat?.entityType ?? (settings.loggingType as EntityType), }; } - /** - * Given the heartbeat and logging type it creates a payload and - * sends an ajax post request to the API. - * - * @param heartbeat - * @param debug - */ - async sendHeartbeat( - heartbeat: Heartbeat, - apiKey: string, - navigationPayload: Record, - ): Promise { - console.log('Sending Heartbeat', heartbeat); - let payload; - - const loggingType = await getLoggingType(); - // Get only the domain from the entity. - // And send that in heartbeat - if (loggingType == 'domain') { - heartbeat.url = getDomainFromUrl(heartbeat.url); - payload = await this.preparePayload(heartbeat, 'domain'); - await this.sendPostRequestToApi( - { ...payload, ...navigationPayload }, - apiKey, - heartbeat.hostname, - ); - } - // Send entity in heartbeat - else if (loggingType == 'url') { - payload = await this.preparePayload(heartbeat, 'url'); - await this.sendPostRequestToApi( - { ...payload, ...navigationPayload }, - apiKey, - heartbeat.hostname, - ); - } + getCurrentTime(): string { + const m = moment(); + return `${m.format('x').slice(0, -3)}.${m.format('x').slice(-3)}`; } - /** - * Creates payload for the heartbeat and returns it as JSON. - * - * @param heartbeat - * @param type - * @param debug - * @returns {*} - * @private - */ - async preparePayload(heartbeat: Heartbeat, type: string): Promise> { - const os = await getOperatingSystem(); - let browserName = 'chrome'; - let userAgent; - if (IS_FIREFOX) { - browserName = 'firefox'; - userAgent = navigator.userAgent.match(/Firefox\/\S+/g)?.[0]; - } else if (IS_EDGE) { - browserName = 'edge'; - userAgent = navigator.userAgent; - } else { - userAgent = navigator.userAgent.match(/Chrome\/\S+/g)?.[0]; + async sendHeartbeats(): Promise { + const settings = await browser.storage.sync.get({ + apiKey: config.apiKey, + apiUrl: config.apiUrl, + heartbeatApiEndPoint: config.heartbeatApiEndPoint, + hostname: '', + }); + if (!settings.apiKey) { + await changeExtensionStatus('notSignedIn'); + return; } - const payload: Record = { - entity: heartbeat.url, - time: moment().format('X'), - type: type, - user_agent: `${userAgent} ${os} ${browserName}-wakatime/${config.version}`, - }; - payload.project = heartbeat.project ?? '<>'; - payload.branch = heartbeat.branch ?? '<>'; + const heartbeats = (await this.db?.getAll('heartbeatQueue', undefined, 50)) as + | Heartbeat[] + | undefined; + if (!heartbeats || heartbeats.length === 0) return; - return payload; - } + await this.db?.delete( + 'heartbeatQueue', + heartbeats.map((heartbeat) => heartbeat.id), + ); - /** - * Sends AJAX request with payload to the heartbeat API as JSON. - * - * @param payload - * @param method - * @returns {*} - */ - async sendPostRequestToApi( - payload: Record, - apiKey = '', - hostname = '', - ): Promise { - try { - const items = await browser.storage.sync.get({ - apiUrl: config.apiUrl, - heartbeatApiEndPoint: config.heartbeatApiEndPoint, - }); + const userAgent = await this.getUserAgent(); + try { const request: RequestInit = { - body: JSON.stringify(payload), + body: JSON.stringify( + heartbeats.map((heartbeat) => { + return { ...heartbeat, userAgent }; + }), + ), credentials: 'omit', method: 'POST', }; - if (hostname) { + if (typeof settings.hostname === 'string' && settings.hostname) { request.headers = { - 'X-Machine-Name': hostname, + 'X-Machine-Name': settings.hostname, }; } - const response = await fetch( - `${items.apiUrl}${items.heartbeatApiEndPoint}?api_key=${apiKey}`, - request, - ); - await response.json(); - } catch (err: unknown) { - if (this.db) { - await this.db.add('cacheHeartbeats', payload); - } - await changeExtensionStatus('notSignedIn'); + const url = `${settings.apiUrl}${settings.heartbeatApiEndPoint}?api_key=${settings.apiKey}`; + const response = await fetch(url, request); + if (response.status === 401) { + await this.putHeartbeatsBackInQueue(heartbeats); + await changeExtensionStatus('notSignedIn'); + return; + } + const data = (await response.json()) as HeartbeatsBulkResponse; + if (data.error) { + await this.putHeartbeatsBackInQueue(heartbeats); + console.error(data.error); + return; + } + if (response.status === 201) { + await Promise.all( + (data.responses ?? []).map(async (resp, respNumber) => { + if (resp[0].error) { + await this.putHeartbeatsBackInQueue(heartbeats.filter((h, i) => i === respNumber)); + console.error(resp[0].error); + } else if (resp[1] === 201 && resp[0].data?.id) { + await changeExtensionStatus('allGood'); + // await this.db?.delete('heartbeatQueue', resp[0].data.id); + } else { + if (resp[1] !== 400) { + await this.putHeartbeatsBackInQueue(heartbeats.filter((h, i) => i === respNumber)); + } + console.error( + `Heartbeat ${resp[0].data?.id ?? respNumber} returned status: ${resp[1]}`, + ); + } + return resp; + }), + ); + } else { + await this.putHeartbeatsBackInQueue(heartbeats); + console.error(`Heartbeat response status: ${response.status}`); + } + } catch (err: unknown) { + console.error(err); + await this.putHeartbeatsBackInQueue(heartbeats); } } - /** - * Sends cached heartbeats request to wakatime api - * @param requests - */ - async sendCachedHeartbeatsRequest(): Promise { - const apiKey = await getApiKey(); - if (!apiKey) { - return changeExtensionStatus('notLogging'); - } + async putHeartbeatsBackInQueue(heartbeats: Heartbeat[]): Promise { + await Promise.all( + heartbeats.map(async (heartbeat) => this.db?.add('heartbeatQueue', heartbeat)), + ); + } - if (this.db) { - const requests = await this.db.getAll('cacheHeartbeats'); - await this.db.clear('cacheHeartbeats'); - const chunkSize = 50; // Create batches of max 50 request - for (let i = 0; i < requests.length; i += chunkSize) { - const chunk = requests.slice(i, i + chunkSize); - const requestsPromises: Promise[] = []; - chunk.forEach((request: Record) => - requestsPromises.push(this.sendPostRequestToApi(request, apiKey)), - ); - try { - await Promise.all(requestsPromises); - } catch (error: unknown) { - console.log('Error sending heartbeats'); - } - } + async getUserAgent(): Promise { + const os = await getOperatingSystem(); + let browserName = 'chrome'; + let userAgent; + if (IS_FIREFOX) { + browserName = 'firefox'; + userAgent = navigator.userAgent.match(/Firefox\/\S+/g)?.[0]; + } else if (IS_EDGE) { + browserName = 'edge'; + userAgent = navigator.userAgent; + } else { + userAgent = navigator.userAgent.match(/Chrome\/\S+/g)?.[0]; } + return `${userAgent} ${os} ${browserName}-wakatime/${config.version}`; } } diff --git a/src/types/heartbeats.ts b/src/types/heartbeats.ts index e39e6c9..065bdf5 100644 --- a/src/types/heartbeats.ts +++ b/src/types/heartbeats.ts @@ -2,9 +2,11 @@ export interface Heartbeat { branch?: string | null; category?: Category | null; entity: string; - entityType: EntityType; + id: string; language?: string | null; project?: string | null; + time: string; + type: EntityType; } export enum Category { @@ -30,3 +32,7 @@ export interface ProjectDetails { language: string; project: string; } + +export type HeartbeatsBulkResponse = { error?: string; responses?: HeartbeatResponse[] }; + +export type HeartbeatResponse = [{ data?: { id: string }; error?: string }, number]; diff --git a/src/types/sites.ts b/src/types/sites.ts index 0ae61b7..1a7e7d9 100644 --- a/src/types/sites.ts +++ b/src/types/sites.ts @@ -8,6 +8,7 @@ export enum KnownSite { github = 'github', gitlab = 'gitlab', googlemeet = 'googlemeet', + slack = 'slack', stackoverflow = 'stackoverflow', travisci = 'travisci', vercel = 'vercel', diff --git a/src/utils/apiKey.ts b/src/utils/apiKey.ts index 8414635..56c86e4 100644 --- a/src/utils/apiKey.ts +++ b/src/utils/apiKey.ts @@ -1,6 +1,3 @@ -import browser from 'webextension-polyfill'; -import config from '../config/config'; - export default function apiKeyInvalid(key?: string): string { const err = 'Invalid api key... check https://wakatime.com/settings for your key'; if (!key) return err; @@ -11,11 +8,3 @@ export default function apiKeyInvalid(key?: string): string { if (!re.test(key)) return err; return ''; } - -export async function getApiKey(): Promise { - const storage = await browser.storage.sync.get({ - apiKey: config.apiKey, - }); - const apiKey = storage.apiKey as string; - return apiKey; -} diff --git a/src/utils/changeExtensionStatus.ts b/src/utils/changeExtensionStatus.ts index 8ffd9e1..62f6763 100644 --- a/src/utils/changeExtensionStatus.ts +++ b/src/utils/changeExtensionStatus.ts @@ -13,16 +13,16 @@ export async function changeExtensionStatus(status: ExtensionStatus): Promise => { if (items.loggingEnabled === true) { await changeExtensionState('allGood'); } else { - await changeExtensionState('notLogging'); + await changeExtensionState('trackingDisabled'); } } catch (err: unknown) { await changeExtensionState('notSignedIn'); @@ -121,7 +121,7 @@ export const fetchUserData = async ( if (items.loggingEnabled === true) { await changeExtensionState('allGood'); } else { - await changeExtensionState('notLogging'); + await changeExtensionState('trackingDisabled'); } dispatch(setLoggingEnabled(items.loggingEnabled as boolean)); From b84be60b9422b80cc36d1b185458cb5d8affdca1 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 22:27:19 +0200 Subject: [PATCH 12/18] finish refactor --- src/background.ts | 3 +- src/components/Options.tsx | 2 +- src/core/WakaTimeCore.ts | 3 +- src/types/heartbeats.ts | 1 + src/types/sites.ts | 1 + src/utils/changeExtensionStatus.ts | 2 +- src/utils/heartbeat.ts | 232 --------------- src/utils/{index.ts => operatingSystem.ts} | 11 - src/utils/sites.ts | 320 +++++++++++++++++++++ src/wakatimeScript.ts | 57 +--- 10 files changed, 329 insertions(+), 303 deletions(-) delete mode 100644 src/utils/heartbeat.ts rename src/utils/{index.ts => operatingSystem.ts} (60%) create mode 100644 src/utils/sites.ts diff --git a/src/background.ts b/src/background.ts index d357d63..3f0242d 100644 --- a/src/background.ts +++ b/src/background.ts @@ -10,7 +10,7 @@ browser.alarms.onAlarm.addListener(async (alarm) => { // Checks if the user is online and if there are cached heartbeats requests, // if so then procedd to send these payload to wakatime api if (navigator.onLine) { - await WakaTimeCore.sendCachedHeartbeatsRequest(); + await WakaTimeCore.sendHeartbeats(); } } }); @@ -30,7 +30,6 @@ browser.tabs.onActivated.addListener(async (activeInfo) => { */ browser.windows.onFocusChanged.addListener(async (windowId) => { if (windowId != browser.windows.WINDOW_ID_NONE) { - console.log('recording a heartbeat - active window changed'); const tabs: browser.Tabs.Tab[] = await browser.tabs.query({ active: true, currentWindow: true, diff --git a/src/components/Options.tsx b/src/components/Options.tsx index 15de2ca..6dac946 100644 --- a/src/components/Options.tsx +++ b/src/components/Options.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from 'react'; import config, { SuccessOrFailType } from '../config/config'; -import { IS_CHROME } from '../utils'; import apiKeyInvalid from '../utils/apiKey'; +import { IS_CHROME } from '../utils/operatingSystem'; import { getSettings, saveSettings, Settings } from '../utils/settings'; import { logUserIn } from '../utils/user'; import SitesList from './SitesList'; diff --git a/src/core/WakaTimeCore.ts b/src/core/WakaTimeCore.ts index 0b39caf..0f253bd 100644 --- a/src/core/WakaTimeCore.ts +++ b/src/core/WakaTimeCore.ts @@ -5,9 +5,9 @@ import browser, { Tabs } from 'webextension-polyfill'; import moment from 'moment'; import { v4 as uuid4 } from 'uuid'; import { OptionalHeartbeat } from '../types/sites'; -import { getOperatingSystem, IS_EDGE, IS_FIREFOX } from '../utils'; import { changeExtensionStatus } from '../utils/changeExtensionStatus'; import getDomainFromUrl, { getDomain } from '../utils/getDomainFromUrl'; +import { getOperatingSystem, IS_EDGE, IS_FIREFOX } from '../utils/operatingSystem'; import { getSettings, Settings } from '../utils/settings'; import config, { ExtensionStatus } from '../config/config'; @@ -149,6 +149,7 @@ class WakaTimeCore { entity: heartbeat?.entity ?? entity, id: uuid4(), language: heartbeat?.language, + plugin: heartbeat?.plugin, project: heartbeat?.project ?? '<>', time: this.getCurrentTime(), type: heartbeat?.entityType ?? (settings.loggingType as EntityType), diff --git a/src/types/heartbeats.ts b/src/types/heartbeats.ts index 065bdf5..2fdc6f1 100644 --- a/src/types/heartbeats.ts +++ b/src/types/heartbeats.ts @@ -13,6 +13,7 @@ export enum Category { browsing = 'browsing', code_reviewing = 'code reviewing', coding = 'coding', + communicating = 'communicating', debugging = 'debugging', designing = 'designing', meeting = 'meeting', diff --git a/src/types/sites.ts b/src/types/sites.ts index 1a7e7d9..8e27eda 100644 --- a/src/types/sites.ts +++ b/src/types/sites.ts @@ -21,6 +21,7 @@ export interface OptionalHeartbeat { entity?: string; entityType?: EntityType; language?: string | null; + plugin?: string; project?: string | null; } diff --git a/src/utils/changeExtensionStatus.ts b/src/utils/changeExtensionStatus.ts index 62f6763..548f326 100644 --- a/src/utils/changeExtensionStatus.ts +++ b/src/utils/changeExtensionStatus.ts @@ -1,6 +1,6 @@ import browser from 'webextension-polyfill'; import config, { ExtensionStatus } from '../config/config'; -import { IS_FIREFOX } from '.'; +import { IS_FIREFOX } from './operatingSystem'; type ColorIconTypes = 'gray' | 'red' | 'white' | ''; diff --git a/src/utils/heartbeat.ts b/src/utils/heartbeat.ts deleted file mode 100644 index d4b0f79..0000000 --- a/src/utils/heartbeat.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { HeartbeatParser, KnownSite, SiteParser, StackExchangeSite } from '../types/sites'; -import { STACKEXCHANGE_SITES } from './stackexchange-sites'; - -const GitHub: HeartbeatParser = (url: string) => { - const { hostname } = new URL(url); - const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); - - if (match) { - if (hostname.endsWith('.com')) { - const root = parse(html); - const repoName = root - .querySelector('meta[name=octolytics-dimension-repository_nwo]') - ?.getAttribute('content'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - } - return match[0]; - } - - return null; -}; - -const GitLab: HeartbeatParser = (url: string, html: string): string | null => { - const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const repoName = root.querySelector('body')?.getAttribute('data-project-full-path'); - if (!repoName || repoName.split('/')[1] !== match[0]) { - return null; - } - return match[0]; - } - - return null; -}; - -const BitBucket: HeartbeatParser = (url: string, html: string): string | null => { - const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: jhondoe / my-test-repo — Bitbucket - const match2 = root.querySelector('title')?.textContent.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const TravisCI: HeartbeatParser = (url: string, html: string): string | null => { - const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - const projectName = root.querySelector('#ember737')?.textContent; - if (projectName === match[0]) { - return match[0]; - } - } - - return null; -}; - -const CircleCI: HeartbeatParser = (url: string, html: string): string | null => { - const projectPageMatch = url.match( - /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - - if (projectPageMatch) { - const root = parse(html); - const seconndBreadcrumbLabel = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', - )?.textContent; - const seconndBreadcrumbValue = root.querySelector( - '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', - )?.textContent; - if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { - return projectPageMatch[0]; - } - } - - const settingsPageMatch = url.match( - /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, - ); - if (settingsPageMatch) { - const root = parse(html); - const pageTitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', - )?.textContent; - const pageSubtitle = root.querySelector( - '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', - )?.textContent; - if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { - return settingsPageMatch[0]; - } - } - - return null; -}; - -const Vercel: HeartbeatParser = (url: string, html: string): string | null => { - const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: test-website - Overview – Vercel - const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const StackOverflow: HeartbeatParser = (url: string, html: string): string | null => { - const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); - - if (match) { - const root = parse(html); - // this regex extracts the project name from the title - // eg. title: test-website - Overview – Vercel - const match2 = root.querySelector('title')?.textContent.match(/^[^\s]+(?=\s-\s)/); - if (match2 && match2[0] === match[0]) { - return match[0]; - } - } - - return null; -}; - -const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; - -export const isCodeReviewing = (url: string): boolean => { - for (const reg of CODE_REVIEW_URL_REG_LIST) { - if (url.match(reg)) { - return true; - } - } - return false; -}; - -export const getHtmlContentByTabId = async (tabId: number): Promise => { - const response = (await browser.tabs.sendMessage(tabId, { message: 'get_html' })) as { - html: string; - }; - return response.html; -}; - -const _normalizeUrl = (url?: string | null) => { - if (!url) { - return ''; - } - if (url.startsWith('http://')) { - url = url.substring('http://'.length); - } - if (url.startsWith('https://')) { - url = url.substring('https://'.length); - } - if (url.startsWith('www.')) { - url = url.substring('www.'.length); - } - if (url.endsWith('/')) { - url = url.substring(0, url.length - 1); - } - return url; -}; - -const stackExchangeDomains = (STACKEXCHANGE_SITES as StackExchangeSite[]).map((site) => { - return _normalizeUrl(site.site_url); -}); - -const SITES: Record = { - bitbucket: { - parser: BitBucket, - urls: [/^https?:\/\/(.+\.)?bitbucket.org\//], - }, - circleci: { - parser: CircleCI, - urls: [/^https?:\/\/(.+\.)?circleci.com\//], - }, - github: { - parser: GitHub, - urls: [ - /^https?:\/\/(.+\.)?github.com\//, - /^https?:\/\/(.+\.)?github.dev\//, - /^https?:\/\/(.+\.)?github.blog\//, - /^https?:\/\/(.+\.)?github.io\//, - /^https?:\/\/(.+\.)?github.community\//, - // /^https?:\/\/(.+\.)?ghcr.io\//, - // /^https?:\/\/(.+\.)?githubapp.com\//, - // /^https?:\/\/(.+\.)?githubassets.com\//, - // /^https?:\/\/(.+\.)?githubusercontent.com\//, - // /^https?:\/\/(.+\.)?githubnext.com\//, - ], - }, - gitlab: { - parser: GitLab, - urls: [/^https?:\/\/(.+\.)?gitlab.com\//], - }, - stackoverflow: { - parser: StackOverflow, - urls: stackExchangeDomains, - }, - travisci: { - parser: TravisCI, - urls: [/^https?:\/\/(.+\.)?travis-ci.com\//], - }, - vercel: { - parser: Vercel, - urls: [/^https?:\/\/(.+\.)?vercel.com\//], - }, -}; - -const match = (url: string, pattern: RegExp | string): boolean => { - if (typeof pattern === 'string') { - return _normalizeUrl(url).startsWith(_normalizeUrl(pattern)); - } - return pattern.test(url); -}; - -export const getSite = (url: string): SiteParser | undefined => { - return Object.values(SITES).find((site) => { - return site.urls.some((re) => match(url, re)); - }); -}; diff --git a/src/utils/index.ts b/src/utils/operatingSystem.ts similarity index 60% rename from src/utils/index.ts rename to src/utils/operatingSystem.ts index cb3cbbe..1c3f5b6 100644 --- a/src/utils/index.ts +++ b/src/utils/operatingSystem.ts @@ -2,17 +2,6 @@ export const IS_EDGE = navigator.userAgent.includes('Edg'); export const IS_FIREFOX = navigator.userAgent.includes('Firefox'); export const IS_CHROME = IS_EDGE === false && IS_FIREFOX === false; -const CODE_REVIEW_URL_REG_LIST = [/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/]; - -export const isCodeReviewing = (url: string): boolean => { - for (const reg of CODE_REVIEW_URL_REG_LIST) { - if (url.match(reg)) { - return true; - } - } - return false; -}; - export const getOperatingSystem = (): Promise => { return new Promise((resolve) => { chrome.runtime.getPlatformInfo(function (info) { diff --git a/src/utils/sites.ts b/src/utils/sites.ts new file mode 100644 index 0000000..6c1c912 --- /dev/null +++ b/src/utils/sites.ts @@ -0,0 +1,320 @@ +import { Category, EntityType } from '../types/heartbeats'; +import { + HeartbeatParser, + KnownSite, + OptionalHeartbeat, + SiteParser, + StackExchangeSite, +} from '../types/sites'; +import { STACKEXCHANGE_SITES } from './stackexchange-sites'; + +const GitHub: HeartbeatParser = (url: string) => { + const { hostname } = new URL(url); + const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); + if (!match) return; + + if (hostname.endsWith('.dev')) { + return { + project: match[0], + }; + } + + const body = document.getElementsByTagName('body').item(0); + if (!body) return; + + const repo = body + .querySelector('meta[name=octolytics-dimension-repository_nwo]') + ?.getAttribute('content'); + if (repo?.split('/')[1] !== match[0]) return; + + // TODO: parse language associated with this repo from the DOM + // TODO: parse branch associated with the PR url from the DOM + + const re = new RegExp(/github.com\/[^/]+\/[^/]+\/pull\/\d+\/files/); + const category: Category | undefined = re.test(url) ? Category.code_reviewing : undefined; + + return { + category, + project: match[0], + }; +}; + +const GitLab: HeartbeatParser = (url: string) => { + const match = url.match(/(?<=gitlab\.com\/[^/]+\/)([^/?#]+)/); + if (!match) return; + + const repoName = document.querySelector('body')?.getAttribute('data-project-full-path'); + if (!repoName || repoName.split('/')[1] !== match[0]) return; + + return { + project: match[0], + }; +}; + +const BitBucket: HeartbeatParser = (url: string) => { + const match = url.match(/(?<=bitbucket\.org\/[^/]+\/)([^/?#]+)/); + if (!match) return; + + // this regex extracts the project name from the title + // eg. title: jhondoe / my-test-repo — Bitbucket + const match2 = document.querySelector('title')?.textContent?.match(/(?<=\/\s)([^/\s]+)(?=\s—)/); + if (!match2 || match2[0] !== match[0]) return; + + return { + project: match[0], + }; +}; + +const TravisCI: HeartbeatParser = (url: string) => { + const match = url.match(/(?<=app\.travis-ci\.com\/[^/]+\/[^/]+\/)([^/?#]+)/); + if (!match) return; + + const projectName = document.querySelector('#ember737')?.textContent; + if (projectName !== match[0]) return; + + return { + project: match[0], + }; +}; + +const CircleCI: HeartbeatParser = (url: string) => { + const projectPageMatch = url.match( + /(?<=app\.circleci\.com\/projects\/[^/]+\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + + if (projectPageMatch) { + const seconndBreadcrumbLabel = document.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > div > span', + )?.textContent; + const seconndBreadcrumbValue = document.querySelector( + '#__next > div:nth-child(2) > div > div > main > div > header > div:nth-child(1) > ol > li:nth-child(2) > div > span', + )?.textContent; + if (seconndBreadcrumbLabel === 'Project' && seconndBreadcrumbValue === projectPageMatch[0]) { + return { project: projectPageMatch[0] }; + } + } + + const settingsPageMatch = url.match( + /(?<=app\.circleci\.com\/settings\/project\/[^/]+\/[^/]+\/)([^/?#]+)/, + ); + if (settingsPageMatch) { + const pageTitle = document.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > h1', + )?.textContent; + const pageSubtitle = document.querySelector( + '#__next > div > div:nth-child(1) > header > div > div:nth-child(2) > div', + )?.textContent; + if (pageTitle === 'Project Settings' && pageSubtitle === settingsPageMatch[0]) { + return { project: settingsPageMatch[0] }; + } + } + + return undefined; +}; + +const Vercel: HeartbeatParser = (url: string) => { + const match = url.match(/(?<=vercel\.com\/[^/]+\/)([^/?#]+)/); + if (!match) return; + + // this regex extracts the project name from the title + // eg. title: test-website - Overview – Vercel + const match2 = document.querySelector('title')?.textContent?.match(/^[^\s]+(?=\s-\s)/); + if (!match2 || match2[0] !== match[0]) return; + + return { project: match[0] }; +}; + +const StackOverflow: HeartbeatParser = (_url: string) => { + const tags = Array.from(document.querySelectorAll('.post-tag').values()) + .map((el) => el.textContent) + .filter(Boolean) as string[]; + if (tags.length === 0) return; + + const languages = Array.from(document.querySelectorAll('code[data-highlighted="yes"]')) + .map((code) => { + const cls = Array.from(code.classList.values()).find((c) => c.startsWith('language-')); + return cls?.substring('language-'.length); + }) + .filter(Boolean) as string[]; + + for (const lang of languages) { + if (tags.includes(lang)) { + return { language: lang }; + } + } + + return undefined; +}; + +const Canva: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => { + const projectName = (document.head.querySelector('meta[property="og:title"]') as HTMLMetaElement) + .content; + if (!projectName) return; + + // make sure the page title matches the design input element's value, meaning this is a design file + const canvaProjectInput = Array.from( + document.querySelector('nav')?.querySelectorAll('input') ?? [], + ).find((inp) => inp.value === projectName); + if (!canvaProjectInput) return; + + return { + category: Category.designing, + language: 'Image (svg)', + plugin: 'Canva', + project: projectName, + }; +}; + +const Figma: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => { + const figmaProject = document.getElementsByClassName('gpu-view-content'); + if (figmaProject.length === 0) return; + + const project = (document.querySelector('span[data-testid="filename"]') as HTMLElement).innerText; + return { + category: Category.designing, + language: 'Image (svg)', + plugin: 'Figma', + project, + }; +}; + +const GoogleMeet: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => { + const meetId = document.querySelector('[data-meeting-title]')?.getAttribute('data-meeting-title'); + if (!meetId) return; + + return { + category: Category.meeting, + plugin: 'Google Meet', + project: meetId, + }; +}; + +const Slack: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => { + const title = document.querySelector('title')?.textContent?.split(' - '); + if (!title || title.length < 3 || title[-1] !== 'Slack') { + return { + category: Category.communicating, + plugin: 'Slack', + }; + } + + const entity = title[0]; + const project = title[1]; + + return { + category: Category.communicating, + entity, + entityType: EntityType.app, + plugin: 'Slack', + project, + }; +}; + +const Zoom: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => { + const entity = document.querySelector('title')?.textContent; + + return { + category: Category.communicating, + entity: entity ?? undefined, + entityType: entity ? EntityType.app : undefined, + plugin: 'Zoom', + }; +}; + +const _normalizeUrl = (url?: string | null) => { + if (!url) { + return ''; + } + if (url.startsWith('http://')) { + url = url.substring('http://'.length); + } + if (url.startsWith('https://')) { + url = url.substring('https://'.length); + } + if (url.startsWith('www.')) { + url = url.substring('www.'.length); + } + if (url.endsWith('/')) { + url = url.substring(0, url.length - 1); + } + return url; +}; + +const stackExchangeDomains = (STACKEXCHANGE_SITES as StackExchangeSite[]).map((site) => { + return _normalizeUrl(site.site_url); +}); + +const SITES: Record = { + bitbucket: { + parser: BitBucket, + urls: [/^https?:\/\/(.+\.)?bitbucket.org\//], + }, + canva: { + parser: Canva, + urls: ['canva.com'], + }, + circleci: { + parser: CircleCI, + urls: [/^https?:\/\/(.+\.)?circleci.com\//], + }, + figma: { + parser: Figma, + urls: ['figma.com'], + }, + github: { + parser: GitHub, + urls: [ + /^https?:\/\/(.+\.)?github.com\//, + /^https?:\/\/(.+\.)?github.dev\//, + /^https?:\/\/(.+\.)?github.blog\//, + /^https?:\/\/(.+\.)?github.io\//, + /^https?:\/\/(.+\.)?github.community\//, + // /^https?:\/\/(.+\.)?ghcr.io\//, + // /^https?:\/\/(.+\.)?githubapp.com\//, + // /^https?:\/\/(.+\.)?githubassets.com\//, + // /^https?:\/\/(.+\.)?githubusercontent.com\//, + // /^https?:\/\/(.+\.)?githubnext.com\//, + ], + }, + gitlab: { + parser: GitLab, + urls: [/^https?:\/\/(.+\.)?gitlab.com\//], + }, + googlemeet: { + parser: GoogleMeet, + urls: [/^https?:\/\/meet.google.com\//], + }, + slack: { + parser: Slack, + urls: [/^https:\/\/app.slack.com\/client\//], + }, + stackoverflow: { + parser: StackOverflow, + urls: stackExchangeDomains, + }, + travisci: { + parser: TravisCI, + urls: [/^https?:\/\/(.+\.)?travis-ci.com\//], + }, + vercel: { + parser: Vercel, + urls: [/^https?:\/\/(.+\.)?vercel.com\//], + }, + zoom: { + parser: Zoom, + urls: [/^https:\/\/(.+\.)?zoom.us\/[^?]+\/join/], + }, +}; + +const match = (url: string, pattern: RegExp | string): boolean => { + if (typeof pattern === 'string') { + return _normalizeUrl(url).startsWith(_normalizeUrl(pattern)); + } + return pattern.test(url); +}; + +export const getSite = (url: string): SiteParser | undefined => { + return Object.values(SITES).find((site) => { + return site.urls.some((re) => match(url, re)); + }); +}; diff --git a/src/wakatimeScript.ts b/src/wakatimeScript.ts index 3fe09f5..f8c92b7 100644 --- a/src/wakatimeScript.ts +++ b/src/wakatimeScript.ts @@ -1,61 +1,8 @@ -import { getSite } from './utils/heartbeat'; +import { getSite } from './utils/sites'; const oneMinute = 60000; const fiveMinutes = 300000; -interface DesignProject { - category: string; - editor: string; - language: string; - project: string; -} - -const parseCanva = (): DesignProject | undefined => { - const projectName = (document.head.querySelector('meta[property="og:title"]') as HTMLMetaElement) - .content; - if (!projectName) return; - - // make sure the page title matches the design input element's value, meaning this is a design file - const canvaProjectInput = Array.from( - document.querySelector('nav')?.querySelectorAll('input') ?? [], - ).find((inp) => inp.value === projectName); - if (!canvaProjectInput) return; - - return { - category: 'designing', - editor: 'Canva', - language: 'Canva Design', - project: projectName, - }; -}; - -const parseFigma = (): DesignProject | undefined => { - const figmaProject = document.getElementsByClassName('gpu-view-content'); - if (figmaProject.length === 0) return; - - const projectName = (document.querySelector('span[data-testid="filename"]') as HTMLElement) - .innerText; - return { - category: 'designing', - editor: 'Figma', - language: 'Figma Design', - project: projectName, - }; -}; - -const parseMeet = (): DesignProject | undefined => { - const meetId = document.querySelector('[data-meeting-title]')?.getAttribute('data-meeting-title'); - if (!meetId) { - return; - } - return { - category: 'meeting', - editor: 'Meet', - language: 'Google Meet', - project: meetId, - }; -}; - /** * Debounces the execution of a function. * @@ -112,6 +59,6 @@ const checkIfInAMeeting = () => { }; // Google Meet -if (window.location.href.startsWith('https://meet.google.com')) { +if (window.location.href.startsWith('https://meet.google.com/')) { checkIfInAMeeting(); } From 2b7c6a483ea55064433297a34176915c15cd1284 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 22:59:14 +0200 Subject: [PATCH 13/18] parse language from github PRs and code files --- src/utils/sites.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/utils/sites.ts b/src/utils/sites.ts index 6c1c912..7acc71c 100644 --- a/src/utils/sites.ts +++ b/src/utils/sites.ts @@ -8,6 +8,57 @@ import { } from '../types/sites'; import { STACKEXCHANGE_SITES } from './stackexchange-sites'; +const githubLanguage = (): string | undefined => { + const embedData = document.querySelector( + 'script[data-target="react-app.embeddedData"]', + )?.textContent; + if (embedData) { + try { + const data = JSON.parse(embedData) as { payload?: { blob?: { language?: string } } }; + if (data.payload?.blob?.language) return data.payload.blob.language; + } catch (e: unknown) { + console.error('Failed to parse GitHub language', e); + } + } + + const files = Array.from( + document.querySelectorAll('div[data-details-container-group="file"]').values(), + ); + + const languages = files + .sort((a, b) => { + const aSize = + a + .querySelector('.file-info') + ?.querySelector('.sr-only') + ?.textContent?.trim() + .split(':')[1] + .trim() + .split(' ')[0] + .replace(',', '') + .replace('.', '') + .replace('k', '000') + .replace('M', '000000') ?? 0; + const bSize = + b + .querySelector('.file-info') + ?.querySelector('.sr-only') + ?.textContent?.trim() + .split(':')[1] + .trim() + .split(' ')[0] + .replace(',', '') + .replace('.', '') + .replace('k', '000') + .replace('M', '000000') ?? 0; + return Number(bSize) - Number(aSize); + }) + .map((div) => div.getAttribute('data-tagsearch-lang')) + .filter(Boolean) as string[]; + + return languages[0]; +}; + const GitHub: HeartbeatParser = (url: string) => { const { hostname } = new URL(url); const match = url.match(/(?<=github\.(?:com|dev)\/[^/]+\/)([^/?#]+)/); @@ -35,6 +86,7 @@ const GitHub: HeartbeatParser = (url: string) => { return { category, + language: githubLanguage(), project: match[0], }; }; @@ -130,7 +182,7 @@ const StackOverflow: HeartbeatParser = (_url: string) => { .filter(Boolean) as string[]; if (tags.length === 0) return; - const languages = Array.from(document.querySelectorAll('code[data-highlighted="yes"]')) + const languages = Array.from(document.querySelectorAll('code[data-highlighted="yes"]').values()) .map((code) => { const cls = Array.from(code.classList.values()).find((c) => c.startsWith('language-')); return cls?.substring('language-'.length); @@ -153,7 +205,7 @@ const Canva: HeartbeatParser = (_url: string): OptionalHeartbeat | undefined => // make sure the page title matches the design input element's value, meaning this is a design file const canvaProjectInput = Array.from( - document.querySelector('nav')?.querySelectorAll('input') ?? [], + document.querySelector('nav')?.querySelectorAll('input')?.values() ?? [], ).find((inp) => inp.value === projectName); if (!canvaProjectInput) return; From 80644ebb18ca42020173d7dd9faba0a8e3f86f23 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 23:01:36 +0200 Subject: [PATCH 14/18] fix some tests --- tests/utils/changeExtensionIcon.spec.ts | 20 ----------------- tests/utils/changeExtensionState.spec.ts | 20 ----------------- tests/utils/changeExtensionTooltip.spec.ts | 26 ---------------------- 3 files changed, 66 deletions(-) delete mode 100644 tests/utils/changeExtensionIcon.spec.ts delete mode 100644 tests/utils/changeExtensionState.spec.ts delete mode 100644 tests/utils/changeExtensionTooltip.spec.ts diff --git a/tests/utils/changeExtensionIcon.spec.ts b/tests/utils/changeExtensionIcon.spec.ts deleted file mode 100644 index 7934aaa..0000000 --- a/tests/utils/changeExtensionIcon.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import chai from 'chai'; -import changeExtensionIcon from '../../src/utils/changeExtensionIcon'; - -const expect = chai.expect; - -jest.mock('webextension-polyfill', () => { - return { - runtime: { - getManifest: () => { - return { version: 'test-version' }; - }, - }, - }; -}); - -describe('changeExtensionIcon', function () { - it('should be a function', function () { - expect(changeExtensionIcon).to.be.a('function'); - }); -}); diff --git a/tests/utils/changeExtensionState.spec.ts b/tests/utils/changeExtensionState.spec.ts deleted file mode 100644 index d829143..0000000 --- a/tests/utils/changeExtensionState.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import chai from 'chai'; -import changeExtensionState from '../../src/utils/changeExtensionStatus'; - -const expect = chai.expect; - -jest.mock('webextension-polyfill', () => { - return { - runtime: { - getManifest: () => { - return { version: 'test-version' }; - }, - }, - }; -}); - -describe('changeExtensionState', function () { - it('should be a function', function () { - expect(changeExtensionState).to.be.a('function'); - }); -}); diff --git a/tests/utils/changeExtensionTooltip.spec.ts b/tests/utils/changeExtensionTooltip.spec.ts deleted file mode 100644 index d564f2e..0000000 --- a/tests/utils/changeExtensionTooltip.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import chai from 'chai'; -import changeExtensionTooltip from '../../src/utils/changeExtensionTooltip'; - -const expect = chai.expect; - -jest.mock('webextension-polyfill', () => { - return { - runtime: { - getManifest: () => { - return { version: 'test-version' }; - }, - }, - }; -}); - -describe('changeExtensionTooltip', function () { - it('should be a function', function () { - expect(changeExtensionTooltip).to.be.a('function'); - }); - - // it('should change the extension tooltip', function() { - // changeExtensionTooltip('WakaTime'); - // expect(chrome.browserAction.setTitle).toHaveBeenCalledWith({title: 'Wakatime'}); - // sinon.assert.calledWithMatch(chrome.browserAction.setTitle, {title: 'WakaTime'}); - // }); -}); From d2c1bc504f5cd3112777c76156fd2ef34764e71d Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 23:07:59 +0200 Subject: [PATCH 15/18] fix default heartbeats api endpoint --- src/config/config.ts | 10 +++++----- webpack.config.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/config/config.ts b/src/config/config.ts index 45443fa..2cc1c1f 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -35,8 +35,8 @@ interface SuccessOrFailAlert { interface Colors { allGood: ''; lightTheme: 'white'; - trackingDisabled: 'gray'; notSignedIn: 'red'; + trackingDisabled: 'gray'; } /** * Tooltip messages @@ -44,8 +44,8 @@ interface Colors { interface Tooltips { allGood: string; ignored: string; - trackingDisabled: string; notSignedIn: string; + trackingDisabled: string; } export interface Config { @@ -126,8 +126,8 @@ const config: Config = { colors: { allGood: '', lightTheme: 'white', - trackingDisabled: 'gray', notSignedIn: 'red', + trackingDisabled: 'gray', }, currentUserApiEndPoint: process.env.CURRENT_USER_API_URL ?? '/users/current', @@ -147,7 +147,7 @@ const config: Config = { 'w3schools.com', ], - heartbeatApiEndPoint: process.env.HEARTBEAT_API_URL ?? '/users/current/heartbeats', + heartbeatApiEndPoint: process.env.HEARTBEAT_API_URL ?? '/users/current/heartbeats.bulk', hostname: '', @@ -185,8 +185,8 @@ const config: Config = { tooltips: { allGood: '', ignored: 'This URL is ignored', - trackingDisabled: 'Not logging', notSignedIn: 'Not signed In', + trackingDisabled: 'Not logging', }, trackSocialMedia: true, diff --git a/webpack.config.ts b/webpack.config.ts index 2ab8e44..9257261 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -58,7 +58,7 @@ const getConfigByBrowser = (isProd: boolean, browser: BrowserTypes): webpack.Con new webpack.DefinePlugin({ ['process.env.API_URL']: JSON.stringify('https://api.wakatime.com/api/v1'), ['process.env.CURRENT_USER_API_URL']: JSON.stringify('/users/current'), - ['process.env.HEARTBEAT_API_URL']: JSON.stringify('/users/current/heartbeats'), + ['process.env.HEARTBEAT_API_URL']: JSON.stringify('/users/current/heartbeats.bulk'), ['process.env.LOGOUT_USER_URL']: JSON.stringify('https://wakatime.com/logout'), ['process.env.NODE_ENV']: JSON.stringify(isProd ? 'production' : 'development'), ['process.env.SUMMARIES_API_URL']: JSON.stringify('/users/current/summaries'), From 9cfde06cc042e3202ed4da2a11e3d00431f47842 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 23:13:36 +0200 Subject: [PATCH 16/18] fix type --- src/types/heartbeats.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/heartbeats.ts b/src/types/heartbeats.ts index 2fdc6f1..c409e78 100644 --- a/src/types/heartbeats.ts +++ b/src/types/heartbeats.ts @@ -4,6 +4,7 @@ export interface Heartbeat { entity: string; id: string; language?: string | null; + plugin?: string | null; project?: string | null; time: string; type: EntityType; From 577cf554cef2c2d955f7bcd205ee2c69d883a449 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 23:15:07 +0200 Subject: [PATCH 17/18] fix config snapshot --- src/config/config.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config/config.test.ts b/src/config/config.test.ts index 871be13..a6cec52 100644 --- a/src/config/config.test.ts +++ b/src/config/config.test.ts @@ -29,8 +29,8 @@ describe('wakatime config', () => { "colors": { "allGood": "", "lightTheme": "white", - "trackingDisabled": "gray", "notSignedIn": "red", + "trackingDisabled": "gray", }, "currentUserApiEndPoint": "/users/current", "detectionIntervalInSeconds": 60, @@ -71,17 +71,17 @@ describe('wakatime config', () => { ], "states": [ "allGood", - "trackingDisabled", - "notSignedIn", "ignored", + "notSignedIn", + "trackingDisabled", ], "summariesApiEndPoint": "/users/current/summaries", "theme": "light", "tooltips": { "allGood": "", "ignored": "This URL is ignored", - "trackingDisabled": "Not logging", "notSignedIn": "Not signed In", + "trackingDisabled": "Not logging", }, "trackSocialMedia": true, "version": "test-version", From aa3743d32a47cafb1dd58de76f719fb199c03c31 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 27 Aug 2024 23:18:08 +0200 Subject: [PATCH 18/18] fix snapshot test --- src/config/config.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/config.test.ts b/src/config/config.test.ts index a6cec52..865b82a 100644 --- a/src/config/config.test.ts +++ b/src/config/config.test.ts @@ -71,9 +71,9 @@ describe('wakatime config', () => { ], "states": [ "allGood", - "ignored", - "notSignedIn", "trackingDisabled", + "notSignedIn", + "ignored", ], "summariesApiEndPoint": "/users/current/summaries", "theme": "light",