openvibers/openvibe.tools Commits

Verbiage: drop cost claims across SEO strings, hub pages and structured data

OP OpenVibers committed 18 Sept 2026 · f44c0147ea · 23 files, +309 −323

We may add ads or premium features later, so titles, descriptions, hero copy,
stat cards, footers and the JSON-LD (no more price 0 / isAccessibleForFree)
no longer promise anything is free. The community / open-source / built-in-
the-open voice stays; 'no signup' and 'free speech' stay.

Changes

ddiff --git a/apps/audio/public/index.html b/apps/audio/public/index.html
iindex 517737e..6ad3408 100644
---- a/apps/audio/public/index.html
++++ b/apps/audio/public/index.html
@@@ -3,9 +3,9 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>Audio.OpenVibe — Free Online Audio Converter & Tools</title>
-- <meta name="description" content="Convert, trim, merge, pitch-shift, speed-change, and process audio files online for free. Supports MP3, WAV, FLAC, OGG, M4A, OPUS, AAC, WMA, AIFF, and more.">
-- <meta property="og:title" content="Audio.OpenVibe — Free Online Audio Converter & Tools">
++ <title>Audio.OpenVibe — Online Audio Converter & Tools</title>
++ <meta name="description" content="Convert, trim, merge, pitch-shift, speed-change, and process audio files online. Supports MP3, WAV, FLAC, OGG, M4A, OPUS, AAC, WMA, AIFF, and more.">
++ <meta property="og:title" content="Audio.OpenVibe — Online Audio Converter & Tools">
<meta property="og:type" content="website">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@@ -28,7 +28,7 @@
<section class="hero" id="hero">
<div class="hero-icon" id="hero-icon"><i class="fa-solid fa-headphones"></i></div>
<h1 id="hero-title">Audio.OpenVibe</h1>
-- <p class="hero-subtitle" id="hero-subtitle">Free Online Audio Converter & Tools</p>
++ <p class="hero-subtitle" id="hero-subtitle">Online Audio Converter & Tools</p>
</section>
<!-- Tool Selector (visible on hub domain) -->
ddiff --git a/apps/audio/public/js/app.js b/apps/audio/public/js/app.js
iindex ce0b5c1..22bb8c3 100644
---- a/apps/audio/public/js/app.js
++++ b/apps/audio/public/js/app.js
@@@ -49,7 +49,7 @@
toolList = toolsRes.tools || [];
} catch (e) {
console.error('Failed to load context:', e);
-- ctx = { toolId: 'hub', brandName: 'Audio.OpenVibe', seoTitle: 'Audio.OpenVibe', seoDescription: 'Free Online Audio Tools' };
++ ctx = { toolId: 'hub', brandName: 'Audio.OpenVibe', seoTitle: 'Audio.OpenVibe', seoDescription: 'Online Audio Tools' };
toolList = [];
}
@@@ -87,7 +87,7 @@
if (ctx.faIcon) heroIcon.innerHTML = `<i class="fa-solid ${ctx.faIcon}"></i>`;
heroTitle.textContent = ctx.brandName || 'Audio.OpenVibe';
-- heroSub.textContent = ctx.seoDescription || 'Free Online Audio Tools';
++ heroSub.textContent = ctx.seoDescription || 'Online Audio Tools';
// On a specific tool domain, hide tool tabs and subdomains
if (ctx.toolId && ctx.toolId !== 'hub') {
ddiff --git a/apps/audio/server/domain-map.js b/apps/audio/server/domain-map.js
iindex 858d8a3..5db09d5 100644
---- a/apps/audio/server/domain-map.js
++++ b/apps/audio/server/domain-map.js
@@@ -11,69 +11,69 @@ const DOMAIN_MAP = {
'audio.openvibe.tools': {
toolId: 'hub', brandName: 'Audio.OpenVibe', defaultOp: 'convert',
faIcon: 'fa-headphones',
-- seoTitle: 'Audio.OpenVibe — Free Online Audio Converter & Tools',
-- seoDescription: 'Convert, trim, merge, pitch-shift, speed-change, and process audio files online for free. Supports MP3, WAV, FLAC, OGG, M4A, OPUS, AAC, WMA, AIFF, and more.',
++ seoTitle: 'Audio.OpenVibe — Online Audio Converter & Tools',
++ seoDescription: 'Convert, trim, merge, pitch-shift, speed-change, and process audio files online. Supports MP3, WAV, FLAC, OGG, M4A, OPUS, AAC, WMA, AIFF, and more.',
},
// ── Format-specific converters ───────────────────────────
'mp3.openvibe.tools': {
toolId: 'mp3', brandName: 'OpenVibeMP3', defaultOp: 'convert', defaultFormat: 'mp3',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeMP3 — Convert Audio to MP3 Online Free',
-- seoDescription: 'Convert WAV, FLAC, OGG, M4A, AAC, WMA, AIFF and more to MP3 format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeMP3 — Convert Audio to MP3 Online',
++ seoDescription: 'Convert WAV, FLAC, OGG, M4A, AAC, WMA, AIFF and more to MP3 format online. Fast, no sign-up required.',
},
'wav.openvibe.tools': {
toolId: 'wav', brandName: 'OpenVibeWAV', defaultOp: 'convert', defaultFormat: 'wav',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeWAV — Convert Audio to WAV Online Free',
-- seoDescription: 'Convert MP3, FLAC, OGG, M4A, AAC and more to lossless WAV format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeWAV — Convert Audio to WAV Online',
++ seoDescription: 'Convert MP3, FLAC, OGG, M4A, AAC and more to lossless WAV format online. Fast, no sign-up required.',
},
'flac.openvibe.tools': {
toolId: 'flac', brandName: 'OpenVibeFLAC', defaultOp: 'convert', defaultFormat: 'flac',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeFLAC — Convert Audio to FLAC Online Free',
-- seoDescription: 'Convert MP3, WAV, OGG, M4A, AAC and more to lossless FLAC format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeFLAC — Convert Audio to FLAC Online',
++ seoDescription: 'Convert MP3, WAV, OGG, M4A, AAC and more to lossless FLAC format online. Fast, no sign-up required.',
},
'ogg.openvibe.tools': {
toolId: 'ogg', brandName: 'OpenVibeOGG', defaultOp: 'convert', defaultFormat: 'ogg',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeOGG — Convert Audio to OGG Vorbis Online Free',
-- seoDescription: 'Convert MP3, WAV, FLAC, M4A, AAC and more to OGG Vorbis format online. Free, open-source codec.',
++ seoTitle: 'OpenVibeOGG — Convert Audio to OGG Vorbis Online',
++ seoDescription: 'Convert MP3, WAV, FLAC, M4A, AAC and more to OGG Vorbis format online. Open-source codec.',
},
'm4a.openvibe.tools': {
toolId: 'm4a', brandName: 'OpenVibeM4A', defaultOp: 'convert', defaultFormat: 'm4a',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeM4A — Convert Audio to M4A (AAC) Online Free',
++ seoTitle: 'OpenVibeM4A — Convert Audio to M4A (AAC) Online',
seoDescription: 'Convert MP3, WAV, FLAC, OGG, WMA and more to M4A/AAC format online. Great quality at small file sizes.',
},
'opus.openvibe.tools': {
toolId: 'opus', brandName: 'OpenVibeOpus', defaultOp: 'convert', defaultFormat: 'opus',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeOpus — Convert Audio to Opus Online Free',
++ seoTitle: 'OpenVibeOpus — Convert Audio to Opus Online',
seoDescription: 'Convert audio files to Opus format — the modern open-source codec. Best quality-to-size ratio for voice and music.',
},
'aac.openvibe.tools': {
toolId: 'aac', brandName: 'OpenVibeAAC', defaultOp: 'convert', defaultFormat: 'aac',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeAAC — Convert Audio to AAC Online Free',
-- seoDescription: 'Convert MP3, WAV, FLAC, OGG and more to AAC format online. Free, fast, great for mobile devices.',
++ seoTitle: 'OpenVibeAAC — Convert Audio to AAC Online',
++ seoDescription: 'Convert MP3, WAV, FLAC, OGG and more to AAC format online. Fast, great for mobile devices.',
},
'wma.openvibe.tools': {
toolId: 'wma', brandName: 'OpenVibeWMA', defaultOp: 'convert', defaultFormat: 'wma',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeWMA — Convert Audio to WMA Online Free',
-- seoDescription: 'Convert MP3, WAV, FLAC and more to Windows Media Audio format. Free online WMA converter.',
++ seoTitle: 'OpenVibeWMA — Convert Audio to WMA Online',
++ seoDescription: 'Convert MP3, WAV, FLAC and more to Windows Media Audio format. Online WMA converter.',
},
'aiff.openvibe.tools': {
toolId: 'aiff', brandName: 'OpenVibeAIFF', defaultOp: 'convert', defaultFormat: 'aiff',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeAIFF — Convert Audio to AIFF Online Free',
++ seoTitle: 'OpenVibeAIFF — Convert Audio to AIFF Online',
seoDescription: 'Convert audio files to Apple AIFF format. Lossless quality for music production and archiving.',
},
'ac3.openvibe.tools': {
toolId: 'ac3', brandName: 'OpenVibeAC3', defaultOp: 'convert', defaultFormat: 'ac3',
faIcon: 'fa-file-audio',
-- seoTitle: 'OpenVibeAC3 — Convert Audio to AC3 (Dolby Digital) Online Free',
++ seoTitle: 'OpenVibeAC3 — Convert Audio to AC3 (Dolby Digital) Online',
seoDescription: 'Convert audio files to AC3 Dolby Digital format. Perfect for surround sound and home theater.',
},
@@@ -81,176 +81,176 @@ const DOMAIN_MAP = {
'trim.openvibe.tools': {
toolId: 'trim', brandName: 'OpenVibeTrim', defaultOp: 'trim',
faIcon: 'fa-scissors',
-- seoTitle: 'OpenVibeTrim — Trim & Cut Audio Online Free',
-- seoDescription: 'Cut and trim audio files to any length. Set start and end times with precision. Free online audio trimmer.',
++ seoTitle: 'OpenVibeTrim — Trim & Cut Audio Online',
++ seoDescription: 'Cut and trim audio files to any length. Set start and end times with precision. Online audio trimmer.',
},
'merge.openvibe.tools': {
toolId: 'merge', brandName: 'OpenVibeMerge', defaultOp: 'merge',
faIcon: 'fa-object-group',
-- seoTitle: 'OpenVibeMerge — Merge & Join Audio Files Online Free',
-- seoDescription: 'Combine multiple audio files into one. Merge MP3, WAV, FLAC and more. Free online audio joiner.',
++ seoTitle: 'OpenVibeMerge — Merge & Join Audio Files Online',
++ seoDescription: 'Combine multiple audio files into one. Merge MP3, WAV, FLAC and more. Online audio joiner.',
},
'pitch.openvibe.tools': {
toolId: 'pitch', brandName: 'OpenVibePitch', defaultOp: 'pitch',
faIcon: 'fa-wave-square',
-- seoTitle: 'OpenVibePitch — Change Audio Pitch Online Free',
-- seoDescription: 'Shift audio pitch up or down by semitones without changing speed. Free online pitch changer for music and voice.',
++ seoTitle: 'OpenVibePitch — Change Audio Pitch Online',
++ seoDescription: 'Shift audio pitch up or down by semitones without changing speed. Online pitch changer for music and voice.',
},
'speed.openvibe.tools': {
toolId: 'speed', brandName: 'OpenVibeSpeed', defaultOp: 'speed',
faIcon: 'fa-gauge-high',
-- seoTitle: 'OpenVibeSpeed — Change Audio Speed Online Free',
-- seoDescription: 'Speed up or slow down audio playback. Adjust tempo without affecting pitch. Free online speed changer.',
++ seoTitle: 'OpenVibeSpeed — Change Audio Speed Online',
++ seoDescription: 'Speed up or slow down audio playback. Adjust tempo without affecting pitch. Online speed changer.',
},
'reverse.openvibe.tools': {
toolId: 'reverse', brandName: 'OpenVibeReverse', defaultOp: 'reverse',
faIcon: 'fa-backward',
-- seoTitle: 'OpenVibeReverse — Reverse Audio Online Free',
-- seoDescription: 'Reverse any audio file instantly. Play it backwards — great for creative effects and fun. Free online tool.',
++ seoTitle: 'OpenVibeReverse — Reverse Audio Online',
++ seoDescription: 'Reverse any audio file instantly. Play it backwards — great for creative effects and fun. Online tool.',
},
'normalize.openvibe.tools': {
toolId: 'normalize', brandName: 'OpenVibeNormalize', defaultOp: 'normalize',
faIcon: 'fa-sliders',
-- seoTitle: 'OpenVibeNormalize — Normalize Audio Volume Online Free',
-- seoDescription: 'Normalize audio loudness to a consistent level. Fix quiet or too-loud recordings. Free online audio normalizer.',
++ seoTitle: 'OpenVibeNormalize — Normalize Audio Volume Online',
++ seoDescription: 'Normalize audio loudness to a consistent level. Fix quiet or too-loud recordings. Online audio normalizer.',
},
'fade.openvibe.tools': {
toolId: 'fade', brandName: 'OpenVibeFade', defaultOp: 'fade',
faIcon: 'fa-volume-low',
-- seoTitle: 'OpenVibeFade — Add Fade In/Out to Audio Online Free',
-- seoDescription: 'Add smooth fade-in and fade-out effects to audio files. Professional transitions, free online tool.',
++ seoTitle: 'OpenVibeFade — Add Fade In/Out to Audio Online',
++ seoDescription: 'Add smooth fade-in and fade-out effects to audio files. Professional transitions, online tool.',
},
'loop.openvibe.tools': {
toolId: 'loop', brandName: 'OpenVibeLoop', defaultOp: 'loop',
faIcon: 'fa-repeat',
-- seoTitle: 'OpenVibeLoop — Loop Audio Online Free',
-- seoDescription: 'Loop audio files a set number of times. Create repeated versions of any sound. Free online audio looper.',
++ seoTitle: 'OpenVibeLoop — Loop Audio Online',
++ seoDescription: 'Loop audio files a set number of times. Create repeated versions of any sound. Online audio looper.',
},
'bass.openvibe.tools': {
toolId: 'bass', brandName: 'OpenVibeBass', defaultOp: 'bass',
faIcon: 'fa-volume-high',
-- seoTitle: 'OpenVibeBass — Boost Bass Online Free',
-- seoDescription: 'Boost or reduce bass frequencies in audio files. Enhance that low end. Free online bass booster.',
++ seoTitle: 'OpenVibeBass — Boost Bass Online',
++ seoDescription: 'Boost or reduce bass frequencies in audio files. Enhance that low end. Online bass booster.',
},
'equalizer.openvibe.tools': {
toolId: 'equalizer', brandName: 'OpenVibeEQ', defaultOp: 'equalizer',
faIcon: 'fa-bars-staggered',
-- seoTitle: 'OpenVibeEQ — Online Audio Equalizer Free',
-- seoDescription: 'Apply equalizer presets to audio files. Boost bass, treble, vocals and more. Free online EQ tool.',
++ seoTitle: 'OpenVibeEQ — Online Audio Equalizer',
++ seoDescription: 'Apply equalizer presets to audio files. Boost bass, treble, vocals and more. Online EQ tool.',
},
'vocal.openvibe.tools': {
toolId: 'vocal', brandName: 'OpenVibeVocal', defaultOp: 'vocal',
faIcon: 'fa-microphone',
-- seoTitle: 'OpenVibeVocal — Remove/Isolate Vocals Online Free',
-- seoDescription: 'Remove or isolate vocals from audio tracks. Create karaoke versions or extract vocals. Free online tool.',
++ seoTitle: 'OpenVibeVocal — Remove/Isolate Vocals Online',
++ seoDescription: 'Remove or isolate vocals from audio tracks. Create karaoke versions or extract vocals. Online tool.',
},
'karaoke.openvibe.tools': {
toolId: 'vocal', brandName: 'OpenVibeKaraoke', defaultOp: 'vocal',
faIcon: 'fa-microphone-lines', alias: 'vocal.openvibe.tools',
-- seoTitle: 'OpenVibeKaraoke — Make Karaoke Tracks Online Free',
-- seoDescription: 'Remove vocals from any song to create karaoke backing tracks. Free online karaoke maker.',
++ seoTitle: 'OpenVibeKaraoke — Make Karaoke Tracks Online',
++ seoDescription: 'Remove vocals from any song to create karaoke backing tracks. Online karaoke maker.',
},
// ── Extraction / Analysis ────────────────────────────────
'extract.openvibe.tools': {
toolId: 'extract', brandName: 'OpenVibeExtract', defaultOp: 'extract',
faIcon: 'fa-music',
-- seoTitle: 'OpenVibeExtract — Extract Audio from Video Online Free',
-- seoDescription: 'Extract and rip audio tracks from video files. MP4, MKV, AVI, WebM to MP3/WAV/FLAC. Free online extractor.',
++ seoTitle: 'OpenVibeExtract — Extract Audio from Video Online',
++ seoDescription: 'Extract and rip audio tracks from video files. MP4, MKV, AVI, WebM to MP3/WAV/FLAC. Online extractor.',
},
'waveform.openvibe.tools': {
toolId: 'waveform', brandName: 'OpenVibeWaveform', defaultOp: 'waveform',
faIcon: 'fa-chart-line',
-- seoTitle: 'OpenVibeWaveform — Generate Audio Waveform Images Online Free',
-- seoDescription: 'Generate beautiful waveform visualizations from audio files. PNG or SVG output. Free online waveform generator.',
++ seoTitle: 'OpenVibeWaveform — Generate Audio Waveform Images Online',
++ seoDescription: 'Generate beautiful waveform visualizations from audio files. PNG or SVG output. Online waveform generator.',
},
// ── Specialized / Fun ────────────────────────────────────
'ringtone.openvibe.tools': {
toolId: 'ringtone', brandName: 'OpenVibeRingtone', defaultOp: 'ringtone',
faIcon: 'fa-bell',
-- seoTitle: 'OpenVibeRingtone — Create Ringtones Online Free',
-- seoDescription: 'Create custom ringtones from any audio file. Trim, fade, and export as M4R (iPhone) or MP3 (Android). Free tool.',
++ seoTitle: 'OpenVibeRingtone — Create Ringtones Online',
++ seoDescription: 'Create custom ringtones from any audio file. Trim, fade, and export as M4R (iPhone) or MP3 (Android). Online tool.',
},
'podcast.openvibe.tools': {
toolId: 'podcast', brandName: 'OpenVibePodcast', defaultOp: 'podcast',
faIcon: 'fa-podcast',
-- seoTitle: 'OpenVibePodcast — Optimize Audio for Podcasts Online Free',
++ seoTitle: 'OpenVibePodcast — Optimize Audio for Podcasts Online',
seoDescription: 'Optimize audio for podcast publishing. Normalize loudness, compress dynamics, convert to podcast-ready format.',
},
'voice.openvibe.tools': {
toolId: 'voice', brandName: 'OpenVibeVoice', defaultOp: 'voice',
faIcon: 'fa-user-astronaut',
-- seoTitle: 'OpenVibeVoice — Voice Effects & Changer Online Free',
-- seoDescription: 'Apply fun voice effects — chipmunk, deep, robot, echo, and more. Free online voice changer.',
++ seoTitle: 'OpenVibeVoice — Voice Effects & Changer Online',
++ seoDescription: 'Apply fun voice effects — chipmunk, deep, robot, echo, and more. Online voice changer.',
},
'noise.openvibe.tools': {
toolId: 'noise', brandName: 'OpenVibeNoise', defaultOp: 'noise',
faIcon: 'fa-broom',
-- seoTitle: 'OpenVibeNoise — Reduce Background Noise Online Free',
-- seoDescription: 'Remove background noise from audio recordings. Clean up interviews, podcasts, and voice memos. Free tool.',
++ seoTitle: 'OpenVibeNoise — Reduce Background Noise Online',
++ seoDescription: 'Remove background noise from audio recordings. Clean up interviews, podcasts, and voice memos. Online tool.',
},
'bitcrusher.openvibe.tools': {
toolId: 'bitcrusher', brandName: 'OpenVibeBitcrusher', defaultOp: 'bitcrusher',
faIcon: 'fa-microchip',
-- seoTitle: 'OpenVibeBitcrusher — Lo-Fi Bitcrusher Audio Effect Online Free',
-- seoDescription: 'Apply lo-fi bitcrusher and sample rate reduction effects. Create retro 8-bit or crunchy audio textures. Free tool.',
++ seoTitle: 'OpenVibeBitcrusher — Lo-Fi Bitcrusher Audio Effect Online',
++ seoDescription: 'Apply lo-fi bitcrusher and sample rate reduction effects. Create retro 8-bit or crunchy audio textures. Online tool.',
},
'echo.openvibe.tools': {
toolId: 'echo', brandName: 'OpenVibeEcho', defaultOp: 'echo',
faIcon: 'fa-tower-broadcast',
-- seoTitle: 'OpenVibeEcho — Add Echo & Delay to Audio Online Free',
-- seoDescription: 'Add echo, delay, and repeat effects to audio files. Customizable timing and decay. Free online tool.',
++ seoTitle: 'OpenVibeEcho — Add Echo & Delay to Audio Online',
++ seoDescription: 'Add echo, delay, and repeat effects to audio files. Customizable timing and decay. Online tool.',
},
'reverb.openvibe.tools': {
toolId: 'reverb', brandName: 'OpenVibeReverb', defaultOp: 'reverb',
faIcon: 'fa-church',
-- seoTitle: 'OpenVibeReverb — Add Reverb to Audio Online Free',
-- seoDescription: 'Add room reverb, hall, cathedral, and plate reverb effects to audio. Free online reverb tool.',
++ seoTitle: 'OpenVibeReverb — Add Reverb to Audio Online',
++ seoDescription: 'Add room reverb, hall, cathedral, and plate reverb effects to audio. Online reverb tool.',
},
'chorus.openvibe.tools': {
toolId: 'chorus', brandName: 'OpenVibeChorus', defaultOp: 'chorus',
faIcon: 'fa-people-group',
-- seoTitle: 'OpenVibeChorus — Add Chorus Effect to Audio Online Free',
-- seoDescription: 'Apply lush chorus effect to audio tracks. Thicken vocals and instruments. Free online chorus tool.',
++ seoTitle: 'OpenVibeChorus — Add Chorus Effect to Audio Online',
++ seoDescription: 'Apply lush chorus effect to audio tracks. Thicken vocals and instruments. Online chorus tool.',
},
'distortion.openvibe.tools': {
toolId: 'distortion', brandName: 'OpenVibeDistortion', defaultOp: 'distortion',
faIcon: 'fa-bolt',
-- seoTitle: 'OpenVibeDistortion — Add Distortion to Audio Online Free',
++ seoTitle: 'OpenVibeDistortion — Add Distortion to Audio Online',
seoDescription: 'Apply overdrive, fuzz, and distortion effects to audio. Great for guitars and creative sound design.',
},
'compressor.openvibe.tools': {
toolId: 'compressor', brandName: 'OpenVibeCompressor', defaultOp: 'compressor',
faIcon: 'fa-compress',
-- seoTitle: 'OpenVibeCompressor — Compress Audio Dynamics Online Free',
-- seoDescription: 'Apply dynamic range compression to audio. Even out volume levels for professional-sounding results. Free tool.',
++ seoTitle: 'OpenVibeCompressor — Compress Audio Dynamics Online',
++ seoDescription: 'Apply dynamic range compression to audio. Even out volume levels for professional-sounding results. Online tool.',
},
'stereo.openvibe.tools': {
toolId: 'stereo', brandName: 'OpenVibeStereo', defaultOp: 'stereo',
faIcon: 'fa-arrows-left-right',
-- seoTitle: 'OpenVibeStereo — Stereo/Mono Audio Converter Online Free',
-- seoDescription: 'Convert audio between stereo and mono. Adjust stereo width and channel balance. Free online tool.',
++ seoTitle: 'OpenVibeStereo — Stereo/Mono Audio Converter Online',
++ seoDescription: 'Convert audio between stereo and mono. Adjust stereo width and channel balance. Online tool.',
},
'silence.openvibe.tools': {
toolId: 'silence', brandName: 'OpenVibeSilence', defaultOp: 'silence',
faIcon: 'fa-volume-xmark',
-- seoTitle: 'OpenVibeSilence — Remove Silence from Audio Online Free',
-- seoDescription: 'Automatically detect and remove silent sections from audio files. Perfect for editing recordings. Free tool.',
++ seoTitle: 'OpenVibeSilence — Remove Silence from Audio Online',
++ seoDescription: 'Automatically detect and remove silent sections from audio files. Perfect for editing recordings. Online tool.',
},
'metadata.openvibe.tools': {
toolId: 'metadata', brandName: 'OpenVibeMeta', defaultOp: 'metadata',
faIcon: 'fa-tags',
-- seoTitle: 'OpenVibeMeta — Edit Audio Metadata & Tags Online Free',
-- seoDescription: 'View and edit audio file metadata — title, artist, album, genre, year, artwork. ID3 tags for MP3. Free tool.',
++ seoTitle: 'OpenVibeMeta — Edit Audio Metadata & Tags Online',
++ seoDescription: 'View and edit audio file metadata — title, artist, album, genre, year, artwork. ID3 tags for MP3. Online tool.',
},
// ── Aliases ──────────────────────────────────────────────
'convert.audio.openvibe.tools': {
toolId: 'hub', brandName: 'Audio.OpenVibe', defaultOp: 'convert',
faIcon: 'fa-headphones', alias: 'audio.openvibe.tools',
-- seoTitle: 'Audio.OpenVibe — Convert Audio Files Online Free',
-- seoDescription: 'Convert between 20+ audio formats online. Free, fast audio converter.',
++ seoTitle: 'Audio.OpenVibe — Convert Audio Files Online',
++ seoDescription: 'Convert between 20+ audio formats online. Fast audio converter.',
},
};
ddiff --git a/apps/docs/public/index.html b/apps/docs/public/index.html
iindex 30fc866..aa974be 100644
---- a/apps/docs/public/index.html
++++ b/apps/docs/public/index.html
@@@ -3,9 +3,9 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>Docs.OpenVibe — Free Online PDF & Document Tools</title>
-- <meta name="description" content="Merge, split, compress, convert, rotate, reorder, watermark, and sign PDFs online for free. No sign-up required.">
-- <meta property="og:title" content="Docs.OpenVibe — Free Online PDF & Document Tools">
++ <title>Docs.OpenVibe — Online PDF & Document Tools</title>
++ <meta name="description" content="Merge, split, compress, convert, rotate, reorder, watermark, and sign PDFs online. No sign-up required.">
++ <meta property="og:title" content="Docs.OpenVibe — Online PDF & Document Tools">
<meta property="og:type" content="website">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@@ -28,7 +28,7 @@
<section class="hero" id="hero">
<div class="hero-icon" id="hero-icon"><i class="fa-solid fa-file-pdf"></i></div>
<h1 id="hero-title">Docs.OpenVibe</h1>
-- <p class="hero-subtitle" id="hero-subtitle">Free Online PDF & Document Tools</p>
++ <p class="hero-subtitle" id="hero-subtitle">Online PDF & Document Tools</p>
</section>
<!-- Tool Selector (visible on hub domain) -->
ddiff --git a/apps/docs/public/js/app.js b/apps/docs/public/js/app.js
iindex 86e7f2f..caa05f2 100644
---- a/apps/docs/public/js/app.js
++++ b/apps/docs/public/js/app.js
@@@ -69,22 +69,22 @@
// ── Branding ─────────────────────────────────────────────
function applyBranding() {
-- document.title = ctx.seoTitle || `${ctx.brandName} — Free Document Tools`;
++ document.title = ctx.seoTitle || `${ctx.brandName} — Document Tools`;
heroIcon.innerHTML = `<i class="fa-solid ${ctx.faIcon || 'fa-file-pdf'}"></i>`;
heroTitle.textContent = ctx.brandName || 'Docs.OpenVibe';
const subtitles = {
-- hub: 'Free Online PDF & Document Tools',
-- merge: 'Combine PDF Files Online Free',
-- split: 'Split PDF Files Online Free',
-- compress: 'Compress PDF Files Online Free',
-- rotate: 'Rotate PDF Pages Online Free',
-- reorder: 'Rearrange PDF Pages Online Free',
-- watermark: 'Add Watermarks to PDFs Online Free',
-- protect: 'Password Protect PDFs Online Free',
-- unlock: 'Remove PDF Password Online Free',
-- img2pdf: 'Convert Images to PDF Online Free',
-- pdf2img: 'Convert PDF to Images Online Free',
++ hub: 'Online PDF & Document Tools',
++ merge: 'Combine PDF Files Online',
++ split: 'Split PDF Files Online',
++ compress: 'Compress PDF Files Online',
++ rotate: 'Rotate PDF Pages Online',
++ reorder: 'Rearrange PDF Pages Online',
++ watermark: 'Add Watermarks to PDFs Online',
++ protect: 'Password Protect PDFs Online',
++ unlock: 'Remove PDF Password Online',
++ img2pdf: 'Convert Images to PDF Online',
++ pdf2img: 'Convert PDF to Images Online',
};
heroSubtitle.textContent = subtitles[ctx.toolId] || ctx.seoDescription || subtitles.hub;
ddiff --git a/apps/docs/server/domain-map.js b/apps/docs/server/domain-map.js
iindex ee99b2f..261110a 100644
---- a/apps/docs/server/domain-map.js
++++ b/apps/docs/server/domain-map.js
@@@ -11,98 +11,98 @@ const DOMAIN_MAP = {
'docs.openvibe.tools': {
toolId: 'hub', brandName: 'Docs.OpenVibe', defaultOp: null,
faIcon: 'fa-file-pdf',
-- seoTitle: 'Docs.OpenVibe — Free Online PDF & Document Tools',
-- seoDescription: 'Merge, split, compress, convert, rotate, reorder, watermark, and sign PDFs online for free. No sign-up required.',
++ seoTitle: 'Docs.OpenVibe — Online PDF & Document Tools',
++ seoDescription: 'Merge, split, compress, convert, rotate, reorder, watermark, and sign PDFs online. No sign-up required.',
},
// ── PDF Hub alias ────────────────────────────────────────
'pdf.openvibe.tools': {
toolId: 'hub', brandName: 'OpenVibePDF', defaultOp: null,
faIcon: 'fa-file-pdf',
-- seoTitle: 'OpenVibePDF — Free Online PDF Tools',
-- seoDescription: 'All the PDF tools you need in one place. Merge, split, compress, convert, rotate, watermark and more — free and online.',
++ seoTitle: 'OpenVibePDF — Online PDF Tools',
++ seoDescription: 'All the PDF tools you need in one place. Merge, split, compress, convert, rotate, watermark and more — online.',
},
// ── PDF Manipulation ─────────────────────────────────────
'mergepdf.openvibe.tools': {
toolId: 'merge', brandName: 'MergePDF', defaultOp: 'merge',
faIcon: 'fa-object-group',
-- seoTitle: 'MergePDF — Combine PDF Files Online Free',
-- seoDescription: 'Merge multiple PDF files into one document. Drag and drop to reorder pages. Free, fast, no sign-up required.',
++ seoTitle: 'MergePDF — Combine PDF Files Online',
++ seoDescription: 'Merge multiple PDF files into one document. Drag and drop to reorder pages. Fast, no sign-up required.',
},
'splitpdf.openvibe.tools': {
toolId: 'split', brandName: 'SplitPDF', defaultOp: 'split',
faIcon: 'fa-scissors',
-- seoTitle: 'SplitPDF — Split PDF Files Online Free',
-- seoDescription: 'Split a PDF into multiple files by page range or extract individual pages. Free online PDF splitter.',
++ seoTitle: 'SplitPDF — Split PDF Files Online',
++ seoDescription: 'Split a PDF into multiple files by page range or extract individual pages. Online PDF splitter.',
},
'compresspdf.openvibe.tools': {
toolId: 'compress', brandName: 'CompressPDF', defaultOp: 'compress',
faIcon: 'fa-compress',
-- seoTitle: 'CompressPDF — Compress PDF Files Online Free',
-- seoDescription: 'Reduce PDF file size while maintaining quality. Compress PDFs for email, web, or storage. Free online.',
++ seoTitle: 'CompressPDF — Compress PDF Files Online',
++ seoDescription: 'Reduce PDF file size while maintaining quality. Compress PDFs for email, web, or storage. Online.',
},
'rotatepdf.openvibe.tools': {
toolId: 'rotate', brandName: 'RotatePDF', defaultOp: 'rotate',
faIcon: 'fa-rotate',
-- seoTitle: 'RotatePDF — Rotate PDF Pages Online Free',
-- seoDescription: 'Rotate individual pages or entire PDFs by 90°, 180°, or 270°. Fix upside-down or sideways scans. Free online.',
++ seoTitle: 'RotatePDF — Rotate PDF Pages Online',
++ seoDescription: 'Rotate individual pages or entire PDFs by 90°, 180°, or 270°. Fix upside-down or sideways scans. Online.',
},
'reorderpdf.openvibe.tools': {
toolId: 'reorder', brandName: 'ReorderPDF', defaultOp: 'reorder',
faIcon: 'fa-sort',
-- seoTitle: 'ReorderPDF — Rearrange PDF Pages Online Free',
-- seoDescription: 'Drag and drop to reorder pages in your PDF. Remove unwanted pages. Free online PDF page organizer.',
++ seoTitle: 'ReorderPDF — Rearrange PDF Pages Online',
++ seoDescription: 'Drag and drop to reorder pages in your PDF. Remove unwanted pages. Online PDF page organizer.',
},
'watermarkpdf.openvibe.tools': {
toolId: 'watermark', brandName: 'WatermarkPDF', defaultOp: 'watermark',
faIcon: 'fa-stamp',
-- seoTitle: 'WatermarkPDF — Add Watermarks to PDFs Online Free',
-- seoDescription: 'Add text or image watermarks to PDF documents. Customize position, opacity, rotation, and font. Free online.',
++ seoTitle: 'WatermarkPDF — Add Watermarks to PDFs Online',
++ seoDescription: 'Add text or image watermarks to PDF documents. Customize position, opacity, rotation, and font. Online.',
},
'protectpdf.openvibe.tools': {
toolId: 'protect', brandName: 'ProtectPDF', defaultOp: 'protect',
faIcon: 'fa-lock',
-- seoTitle: 'ProtectPDF — Password Protect PDFs Online Free',
-- seoDescription: 'Add password protection to your PDF files. Set owner and user passwords. Free online PDF encryption.',
++ seoTitle: 'ProtectPDF — Password Protect PDFs Online',
++ seoDescription: 'Add password protection to your PDF files. Set owner and user passwords. Online PDF encryption.',
},
'unlockpdf.openvibe.tools': {
toolId: 'unlock', brandName: 'UnlockPDF', defaultOp: 'unlock',
faIcon: 'fa-lock-open',
-- seoTitle: 'UnlockPDF — Remove PDF Password Online Free',
-- seoDescription: 'Remove password protection from PDFs. Unlock PDF files for editing and printing. Free online.',
++ seoTitle: 'UnlockPDF — Remove PDF Password Online',
++ seoDescription: 'Remove password protection from PDFs. Unlock PDF files for editing and printing. Online.',
},
// ── Image ↔ PDF Conversion ───────────────────────────────
'image2pdf.openvibe.tools': {
toolId: 'img2pdf', brandName: 'Image2PDF', defaultOp: 'img2pdf',
faIcon: 'fa-file-image',
-- seoTitle: 'Image2PDF — Convert Images to PDF Online Free',
++ seoTitle: 'Image2PDF — Convert Images to PDF Online',
seoDescription: 'Convert JPG, PNG, WebP, AVIF, TIFF, BMP, GIF images to PDF documents. Combine multiple images into one PDF.',
},
'jpg2pdf.openvibe.tools': {
toolId: 'img2pdf', brandName: 'JPG2PDF', defaultOp: 'img2pdf',
faIcon: 'fa-file-image',
-- seoTitle: 'JPG2PDF — Convert JPG to PDF Online Free',
-- seoDescription: 'Convert JPG and JPEG images to PDF documents. Combine multiple JPGs into one PDF file. Free and fast.',
++ seoTitle: 'JPG2PDF — Convert JPG to PDF Online',
++ seoDescription: 'Convert JPG and JPEG images to PDF documents. Combine multiple JPGs into one PDF file. And fast.',
},
'png2pdf.openvibe.tools': {
toolId: 'img2pdf', brandName: 'PNG2PDF', defaultOp: 'img2pdf',
faIcon: 'fa-file-image',
-- seoTitle: 'PNG2PDF — Convert PNG to PDF Online Free',
-- seoDescription: 'Convert PNG images to PDF documents. Combine multiple PNGs into one PDF file. Free and fast.',
++ seoTitle: 'PNG2PDF — Convert PNG to PDF Online',
++ seoDescription: 'Convert PNG images to PDF documents. Combine multiple PNGs into one PDF file. And fast.',
},
'pdf2jpg.openvibe.tools': {
toolId: 'pdf2img', brandName: 'PDF2JPG', defaultOp: 'pdf2img', defaultFormat: 'jpg',
faIcon: 'fa-image',
-- seoTitle: 'PDF2JPG — Convert PDF to JPG Online Free',
-- seoDescription: 'Convert PDF pages to JPG images. Extract high-quality JPG images from any PDF document. Free online.',
++ seoTitle: 'PDF2JPG — Convert PDF to JPG Online',
++ seoDescription: 'Convert PDF pages to JPG images. Extract high-quality JPG images from any PDF document. Online.',
},
'pdf2png.openvibe.tools': {
toolId: 'pdf2img', brandName: 'PDF2PNG', defaultOp: 'pdf2img', defaultFormat: 'png',
faIcon: 'fa-image',
-- seoTitle: 'PDF2PNG — Convert PDF to PNG Online Free',
-- seoDescription: 'Convert PDF pages to PNG images. Extract high-quality transparent PNG images from any PDF. Free online.',
++ seoTitle: 'PDF2PNG — Convert PDF to PNG Online',
++ seoDescription: 'Convert PDF pages to PNG images. Extract high-quality transparent PNG images from any PDF. Online.',
},
};
ddiff --git a/apps/gateway/public/audio.html b/apps/gateway/public/audio.html
iindex c581414..1ac3a6b 100644
---- a/apps/gateway/public/audio.html
++++ b/apps/gateway/public/audio.html
@@@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Audio.OpenVibe — Audio Converter & Editor</title>
-- <meta name="description" content="Free online audio tools — convert, trim, merge, mix, apply effects, extract vocals, and more. MP3, WAV, FLAC, OGG, and 50+ formats. No login required.">
++ <meta name="description" content="Online audio tools — convert, trim, merge, mix, apply effects, extract vocals, and more. MP3, WAV, FLAC, OGG, and 50+ formats. No login required.">
<meta property="og:title" content="Audio.OpenVibe — Audio Converter & Editor">
-- <meta property="og:description" content="Free online audio tools — convert, trim, merge, and apply effects. No login required.">
++ <meta property="og:description" content="Online audio tools — convert, trim, merge, and apply effects. No login required.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://audio.openvibe.tools">
<link rel="canonical" href="https://audio.openvibe.tools">
@@@ -110,7 +110,7 @@
<div class="container">
<header>
<h1><i class="fa-solid fa-headphones"></i> Audio.OpenVibe</h1>
-- <p class="subtitle">Free online audio tools. Convert, edit, mix, and enhance audio files instantly. MP3, WAV, FLAC, OGG, and 50+ formats supported.</p>
++ <p class="subtitle">Online audio tools. Convert, edit, mix, and enhance audio files instantly. MP3, WAV, FLAC, OGG, and 50+ formats supported.</p>
</header>
<div id="showcase-section">
@@@ -173,7 +173,7 @@
stats.innerHTML = `
<div class="stat-card"><div class="stat-card-value">50+</div><div class="stat-card-label">Formats</div></div>
<div class="stat-card"><div class="stat-card-value">0%</div><div class="stat-card-label">Login</div></div>
-- <div class="stat-card"><div class="stat-card-value">∞</div><div class="stat-card-label">Free</div></div>
++ <div class="stat-card"><div class="stat-card-value">∞</div><div class="stat-card-label">Open</div></div>
<div class="stat-card"><div class="stat-card-value">⚡</div><div class="stat-card-label">Fast</div></div>
`;
}
ddiff --git a/apps/gateway/public/dev.html b/apps/gateway/public/dev.html
iindex f13594e..abb6f72 100644
---- a/apps/gateway/public/dev.html
++++ b/apps/gateway/public/dev.html
@@@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dev.OpenVibe — Developer & SEO Tools</title>
--<meta name="description" content="Free online developer tools — JSON formatter, Base64 encoder, JWT decoder, UUID generator, regex tester, diff checker, cron parser, curl converter, webhook inspector, and more.">
++<meta name="description" content="Online developer tools — JSON formatter, Base64 encoder, JWT decoder, UUID generator, regex tester, diff checker, cron parser, curl converter, webhook inspector, and more.">
<meta property="og:title" content="Dev.OpenVibe — Developer & SEO Tools">
--<meta property="og:description" content="Free developer tools — JSON formatter, Base64, JWT decoder, UUID generator, regex tester, diff checker, cron parser, curl converter, and more.">
++<meta property="og:description" content="Developer tools — JSON formatter, Base64, JWT decoder, UUID generator, regex tester, diff checker, cron parser, curl converter, and more.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://dev.openvibe.tools">
<link rel="canonical" href="https://dev.openvibe.tools">
@@@ -77,7 +77,7 @@ a{color:inherit;text-decoration:none}
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "Dev.OpenVibe — Developer & SEO Tools",
-- "description": "Free online developer tools for formatting, encoding, decoding, and converting code. Includes JSON formatter, Base64 encoder, JWT decoder, UUID generator, regex tester, and more.",
++ "description": "Online developer tools for formatting, encoding, decoding, and converting code. Includes JSON formatter, Base64 encoder, JWT decoder, UUID generator, regex tester, and more.",
"url": "https://dev.openvibe.tools",
"inLanguage": "en-US",
"isPartOf": {
@@@ -88,15 +88,10 @@ a{color:inherit;text-decoration:none}
"mainEntity": {
"@type": "SoftwareApplication",
"name": "Dev.OpenVibe Toolkit",
-- "description": "Collection of 25+ free developer and SEO tools",
++ "description": "Collection of 25+ developer and SEO tools",
"url": "https://dev.openvibe.tools",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Any",
-- "offers": {
-- "@type": "Offer",
-- "price": "0",
-- "priceCurrency": "USD"
-- },
"tools": [
{"@type": "SoftwareApplication", "name": "JSON Formatter"},
{"@type": "SoftwareApplication", "name": "YAML Parser"},
ddiff --git a/apps/gateway/public/img.html b/apps/gateway/public/img.html
iindex 4dc75f5..dd518c1 100644
---- a/apps/gateway/public/img.html
++++ b/apps/gateway/public/img.html
@@@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Img.OpenVibe — Image Editor & Converter</title>
-- <meta name="description" content="Free online image tools — convert, compress, resize, crop, edit, and more. PNG, JPG, WebP, AVIF, GIF, TIFF, BMP, and 30+ formats. No login required.">
++ <meta name="description" content="Online image tools — convert, compress, resize, crop, edit, and more. PNG, JPG, WebP, AVIF, GIF, TIFF, BMP, and 30+ formats. No login required.">
<meta property="og:title" content="Img.OpenVibe — Image Editor & Converter">
-- <meta property="og:description" content="Free online image tools — convert, compress, resize, crop. No login required.">
++ <meta property="og:description" content="Online image tools — convert, compress, resize, crop. No login required.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://img.openvibe.tools">
<link rel="canonical" href="https://img.openvibe.tools">
@@@ -110,7 +110,7 @@
<div class="container">
<header>
<h1><i class="fa-solid fa-images"></i> Img.OpenVibe</h1>
-- <p class="subtitle">Free online image tools. Convert, compress, resize, crop, edit, and more. PNG, JPG, WebP, AVIF, GIF, TIFF, BMP, and 30+ formats supported.</p>
++ <p class="subtitle">Online image tools. Convert, compress, resize, crop, edit, and more. PNG, JPG, WebP, AVIF, GIF, TIFF, BMP, and 30+ formats supported.</p>
</header>
<div id="showcase-section">
@@@ -173,7 +173,7 @@
stats.innerHTML = `
<div class="stat-card"><div class="stat-card-value">30+</div><div class="stat-card-label">Formats</div></div>
<div class="stat-card"><div class="stat-card-value">0%</div><div class="stat-card-label">Login</div></div>
-- <div class="stat-card"><div class="stat-card-value">∞</div><div class="stat-card-label">Free</div></div>
++ <div class="stat-card"><div class="stat-card-value">∞</div><div class="stat-card-label">Open</div></div>
<div class="stat-card"><div class="stat-card-value">⚡</div><div class="stat-card-label">Fast</div></div>
`;
}
ddiff --git a/apps/gateway/public/index.html b/apps/gateway/public/index.html
iindex 94b2a63..e8cbca3 100644
---- a/apps/gateway/public/index.html
++++ b/apps/gateway/public/index.html
@@@ -3,25 +3,25 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>OpenVibe.Tools — Free Online Tools Directory</title>
-- <meta name="description" content="OpenVibe.Tools: 200+ free online tools. Network diagnostics, developer utilities, pastes, image & audio converters, text generators, logo makers, PDF tools, survival maps, and more. One OpenVibe account, everywhere.">
-- <meta name="keywords" content="openvibe tools, free online tools, network diagnostics, developer tools, image converter, audio converter, text generator, logo maker, pdf tools, pastebin">
++ <title>OpenVibe.Tools — Online Tools Directory</title>
++ <meta name="description" content="OpenVibe.Tools: 200+ online tools. Network diagnostics, developer utilities, pastes, image & audio converters, text generators, logo makers, PDF tools, survival maps, and more. One OpenVibe account, everywhere.">
++ <meta name="keywords" content="openvibe tools, online tools, network diagnostics, developer tools, image converter, audio converter, text generator, logo maker, pdf tools, pastebin">
<meta name="author" content="OpenVibe">
<meta name="theme-color" content="#8b5cf6">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://openvibe.tools/">
-- <meta property="og:title" content="OpenVibe.Tools — Free Online Tools Directory">
-- <meta property="og:description" content="200+ free online tools: network diagnostics, developer utilities, image & audio converters, text generators, PDF tools, and more.">
++ <meta property="og:title" content="OpenVibe.Tools — Online Tools Directory">
++ <meta property="og:description" content="200+ online tools: network diagnostics, developer utilities, image & audio converters, text generators, PDF tools, and more.">
<meta property="og:site_name" content="OpenVibe.Tools">
<meta property="og:locale" content="en_US">
<!-- Twitter -->
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content="https://openvibe.tools/">
-- <meta name="twitter:title" content="OpenVibe.Tools — Free Online Tools Directory">
-- <meta name="twitter:description" content="200+ free online tools under one roof. Part of the OpenVibe network.">
++ <meta name="twitter:title" content="OpenVibe.Tools — Online Tools Directory">
++ <meta name="twitter:description" content="200+ online tools under one roof. Part of the OpenVibe network.">
<link rel="canonical" href="https://openvibe.tools/">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect fill='%238b5cf6' width='32' height='32' rx='8'/%3E%3Ccircle cx='16' cy='10' r='3' fill='white'/%3E%3Ccircle cx='9' cy='22' r='3' fill='white'/%3E%3Ccircle cx='23' cy='22' r='3' fill='white'/%3E%3Cpath d='M16 10L9 22M16 10l7 12M9 22h14' stroke='white' stroke-width='1.6'/%3E%3C/svg%3E">
@@@ -47,7 +47,7 @@
"@type": "WebSite",
"name": "OpenVibe.Tools",
"url": "https://openvibe.tools/",
-- "description": "200+ free online tools: network diagnostics, developer utilities, converters, generators, and more.",
++ "description": "200+ online tools: network diagnostics, developer utilities, converters, generators, and more.",
"publisher": { "@type": "Organization", "name": "OpenVibe", "url": "https://openvibe.network" }
}
</script>
@@@ -293,7 +293,7 @@
<!-- ─── Hero ─── -->
<section class="hero">
<h1>Every tool you need,<br><span class="grad">one vibe apart.</span></h1>
-- <p class="tag">200+ free online tools — network diagnostics, developer utilities, converters, generators, maps, and more. One OpenVibe account works everywhere. Free to use, open source.</p>
++ <p class="tag">200+ online tools — network diagnostics, developer utilities, converters, generators, maps, and more. One OpenVibe account works everywhere. Open source, built in the open.</p>
<div class="hero-search" onclick="openDirectory()">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="text" placeholder="Search tools — try 'mp3', 'resize', 'zalgo', 'whois'…" readonly>
@@@ -303,7 +303,7 @@
<div class="hero-stat"><b id="stat-tools">200+</b><span>Tools</span></div>
<div class="hero-stat"><b>10</b><span>Suites</span></div>
<div class="hero-stat"><b>1</b><span>Account</span></div>
-- <div class="hero-stat"><b>$0</b><span>Forever</span></div>
++ <div class="hero-stat"><b>Open</b><span>source</span></div>
</div>
</section>
@@@ -396,7 +396,7 @@
<div class="net-grid">
<a class="net-card" href="https://openvibe.live" style="--card-accent:#e74c3c">
<div class="icon"><i class="fa-solid fa-tower-broadcast"></i></div>
-- <div><h3>OpenVibe.Live</h3><p>Free &amp; open live streaming — browser or OBS, clips, VODs, chat.</p></div>
++ <div><h3>OpenVibe.Live</h3><p>Open live streaming — browser or OBS, clips, VODs, chat.</p></div>
</a>
<a class="net-card" href="https://openvibe.games" style="--card-accent:#8b5cf6">
<div class="icon"><i class="fa-solid fa-gamepad"></i></div>
@@@ -428,7 +428,7 @@
<footer>
<div class="shell foot">
-- <div>© OpenVibe — free &amp; open tools. <a href="https://openvibe.network">One Account. All of OpenVibe.</a></div>
++ <div>© OpenVibe — open tools, community run. <a href="https://openvibe.network">One Account. All of OpenVibe.</a></div>
<div class="foot-links">
<a href="https://openvibe.live">Live</a>
<a href="https://openvibe.games">Games</a>
ddiff --git a/apps/gateway/public/net.html b/apps/gateway/public/net.html
iindex 3af44a6..861050e 100644
---- a/apps/gateway/public/net.html
++++ b/apps/gateway/public/net.html
@@@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Net.OpenVibe — Network & Internet Diagnostics</title>
-- <meta name="description" content="Free online network tools — ping, DNS lookup, GeoIP, SSL checker, HTTP headers, Whois/RDAP, traceroute, port scanner, and more. No login required.">
++ <meta name="description" content="Online network tools — ping, DNS lookup, GeoIP, SSL checker, HTTP headers, Whois/RDAP, traceroute, port scanner, and more. No login required.">
<meta property="og:title" content="Net.OpenVibe — Network & Internet Diagnostics">
-- <meta property="og:description" content="Free online network tools — ping, DNS lookup, GeoIP, SSL checker, HTTP headers, Whois/RDAP, and more.">
++ <meta property="og:description" content="Online network tools — ping, DNS lookup, GeoIP, SSL checker, HTTP headers, Whois/RDAP, and more.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://net.openvibe.tools">
<link rel="canonical" href="https://net.openvibe.tools">
@@@ -489,7 +489,7 @@
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "Net.OpenVibe — Network & Utilities Tools",
-- "description": "Free online network and utility tools for IP lookup, DNS, SSL certificate checking, port scanning, WHOIS lookup, traceroute, and more.",
++ "description": "Online network and utility tools for IP lookup, DNS, SSL certificate checking, port scanning, WHOIS lookup, traceroute, and more.",
"url": "https://net.openvibe.tools",
"inLanguage": "en-US",
"isPartOf": {
@@@ -500,15 +500,10 @@
"mainEntity": {
"@type": "SoftwareApplication",
"name": "Net.OpenVibe Toolkit",
-- "description": "Collection of 8+ free network and system utilities",
++ "description": "Collection of 8+ network and system utilities",
"url": "https://net.openvibe.tools",
"applicationCategory": "UtilityApplication",
"operatingSystem": "Any",
-- "offers": {
-- "@type": "Offer",
-- "price": "0",
-- "priceCurrency": "USD"
-- },
"tools": [
{"@type": "SoftwareApplication", "name": "My IP Address"},
{"@type": "SoftwareApplication", "name": "DNS Lookup"},
@@@ -533,7 +528,7 @@
<div class="hero shell" id="hero">
<div class="hero-icon"><i class="fa-solid fa-network-wired"></i></div>
<h1><span class="accent">OpenVibe</span>Net</h1>
-- <p class="sub">Free online network diagnostics — DNS, GeoIP, ping, SSL, Whois, HTTP headers, and more. No login required.</p>
++ <p class="sub">Online network diagnostics — DNS, GeoIP, ping, SSL, Whois, HTTP headers, and more. No login required.</p>
</div>
<!-- Search -->
@@@ -571,7 +566,7 @@
</div>
<div class="stat-card">
<div class="stat-value">∞</div>
-- <div class="stat-label">Free Queries</div>
++ <div class="stat-label">Queries</div>
</div>
<div class="stat-card">
<div class="stat-value">⚡</div>
@@@ -600,7 +595,7 @@
<a href="https://openvibe.live">OpenVibe.Live</a>
<a href="https://openvibe.games">Scraplandia</a>
</div>
-- <p>Part of the <a href="https://openvibe.network">OpenVibe</a>. Free. Open source. Built in the open.</p>
++ <p>Part of the <a href="https://openvibe.network">OpenVibe</a>. Open source. Built in the open.</p>
</div>
</div>
@@@ -760,7 +755,7 @@
heroIcon.innerHTML = `<i class="fa-solid ${tool.icon}"></i>`;
if (isHub) {
heroH1.innerHTML = '<span class="accent">OpenVibe</span>Net';
-- heroSub.textContent = 'Free online network diagnostics — DNS, GeoIP, ping, SSL, Whois, HTTP headers, and more. No login required.';
++ heroSub.textContent = 'Online network diagnostics — DNS, GeoIP, ping, SSL, Whois, HTTP headers, and more. No login required.';
} else {
heroH1.innerHTML = tool.name.replace('OpenVibe', '<span class="accent">OpenVibe</span>');
heroSub.textContent = tool.placeholder || '';
ddiff --git a/apps/gateway/public/paste.html b/apps/gateway/public/paste.html
iindex 7777709..0d1b480 100644
---- a/apps/gateway/public/paste.html
++++ b/apps/gateway/public/paste.html
@@@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Paste.OpenVibe — Code & Text Sharing</title>
-- <meta name="description" content="Free paste / snippet sharing with syntax highlighting, screenshots, forks, likes, and comments. Part of the OpenVibe.">
++ <meta name="description" content="Paste / snippet sharing with syntax highlighting, screenshots, forks, likes, and comments. Part of the OpenVibe.">
<meta property="og:title" content="Paste.OpenVibe — Code & Text Sharing">
-- <meta property="og:description" content="Free paste / snippet sharing with syntax highlighting, screenshots, forks, likes, and comments.">
++ <meta property="og:description" content="Paste / snippet sharing with syntax highlighting, screenshots, forks, likes, and comments.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://pastes.openvibe.tools">
<link rel="canonical" href="https://pastes.openvibe.tools">
ddiff --git a/apps/gateway/server/seo/catalog.js b/apps/gateway/server/seo/catalog.js
iindex 82e8440..e53058c 100644
---- a/apps/gateway/server/seo/catalog.js
++++ b/apps/gateway/server/seo/catalog.js
@@@ -23,87 +23,87 @@ const BRAND = 'OpenVibe';
// ── Dev & SEO tools (dev.openvibe.tools) ─────────────────────
const DEV = {
dev: {
-- name: 'Developer Tools', title: 'Free Online Developer Tools — Formatters, Encoders & Validators',
-- desc: 'A fast, free developer toolbox: JSON, YAML and XML formatters, Base64 and JWT decoders, regex tester, diff checker, hash generator and more. No signup, nothing leaves your browser.',
-- kw: 'developer tools, online tools, free dev tools, formatter, encoder, decoder, validator',
++ name: 'Developer Tools', title: 'Online Developer Tools — Formatters, Encoders & Validators',
++ desc: 'A fast developer toolbox: JSON, YAML and XML formatters, Base64 and JWT decoders, regex tester, diff checker, hash generator and more. No signup, nothing leaves your browser.',
++ kw: 'developer tools, online tools, dev tools, formatter, encoder, decoder, validator',
about: 'A collection of small, fast developer utilities that run entirely in your browser. Nothing is uploaded, nothing is logged, and there is no account to create — open a tool, paste your data, get your answer.',
bullets: ['Every tool works client-side: your data never leaves the browser', 'No signup and no rate limits on the offline tools', 'Open source and part of the wider OpenVibe network'],
-- faq: [['Are these developer tools really free?', 'Yes. Every tool here is free with no account, no trial and no usage cap. The project is community-run and open source.'], ['Is my data sent to a server?', 'The formatting, encoding and generation tools run entirely in your browser, so your data never leaves your machine. Only tools that must reach the network (like the Open Graph preview and webhook inspector) send a request, and they say so on the page.']],
++ faq: [['Do I need an account?', 'No. Every tool here works with no account, no trial and no usage cap. The project is community-run and open source.'], ['Is my data sent to a server?', 'The formatting, encoding and generation tools run entirely in your browser, so your data never leaves your machine. Only tools that must reach the network (like the Open Graph preview and webhook inspector) send a request, and they say so on the page.']],
},
jsonfmt: {
-- name: 'JSON Formatter', title: 'JSON Formatter & Validator — Free Online JSON Beautifier',
-- desc: 'Format, validate and minify JSON online. Pretty-print messy JSON, catch syntax errors with line numbers, and compact it back down. Free, instant, runs in your browser.',
++ name: 'JSON Formatter', title: 'JSON Formatter & Validator — Online JSON Beautifier',
++ desc: 'Format, validate and minify JSON online. Pretty-print messy JSON, catch syntax errors with line numbers, and compact it back down. Instant, runs in your browser.',
kw: 'json formatter, json validator, json beautifier, json minifier, pretty print json, json parser online',
about: 'Paste any JSON to pretty-print it with consistent indentation, validate it against the JSON spec, or minify it for production. Errors are reported with the exact position so you can find the stray comma fast.',
bullets: ['Beautify with clean indentation, or minify to the smallest valid output', 'Validation errors point at the line and character that broke the parse', 'Handles large documents without uploading them anywhere'],
faq: [['How do I fix "Unexpected token" errors in JSON?', 'Paste the JSON here and press Validate. The error message names the exact character position, which is almost always a trailing comma, a single quote instead of a double quote, or an unquoted key.'], ['Does this JSON formatter upload my data?', 'No. Parsing and formatting happen in your browser, so the JSON never reaches our servers.']],
},
yaml: {
-- name: 'YAML to JSON Converter', title: 'YAML to JSON Converter & YAML Validator — Free Online',
-- desc: 'Convert YAML to JSON and JSON to YAML online, and validate YAML syntax instantly. Ideal for Kubernetes manifests, CI pipelines and config files. Free, no signup.',
++ name: 'YAML to JSON Converter', title: 'YAML to JSON Converter & YAML Validator — Online Tool',
++ desc: 'Convert YAML to JSON and JSON to YAML online, and validate YAML syntax instantly. Ideal for Kubernetes manifests, CI pipelines and config files. No signup.',
kw: 'yaml to json, json to yaml, yaml converter, yaml validator, yaml parser online, kubernetes yaml',
about: 'Convert between YAML and JSON in either direction and check that your YAML actually parses. Useful whenever you are moving between a config file and an API payload, or debugging an indentation mistake in a CI or Kubernetes file.',
bullets: ['YAML → JSON and JSON → YAML with one click', 'Catches the indentation and tab errors that break YAML parsers', 'Keeps nested structures, lists and multi-line strings intact'],
faq: [['Why does my YAML fail to parse?', 'YAML forbids tab characters for indentation and is strict about consistent spacing. Paste it here and the parser reports the line where the structure breaks.'], ['Can I convert Kubernetes manifests to JSON?', 'Yes. Kubernetes accepts both formats, and converting to JSON is a quick way to verify exactly what a manifest resolves to.']],
},
xml: {
-- name: 'XML Formatter', title: 'XML Formatter & Validator — Free Online XML Beautifier',
-- desc: 'Format, validate and minify XML online. Pretty-print nested XML, check that tags are well-formed, and compact documents. Free and instant in your browser.',
++ name: 'XML Formatter', title: 'XML Formatter & Validator — Online XML Beautifier',
++ desc: 'Format, validate and minify XML online. Pretty-print nested XML, check that tags are well-formed, and compact documents. Instant in your browser.',
kw: 'xml formatter, xml validator, xml beautifier, pretty print xml, xml parser online, format xml',
about: 'Pretty-print XML with proper nesting, confirm a document is well-formed, or strip whitespace to minify it. Handy for SOAP payloads, RSS feeds, sitemaps and configuration files.',
bullets: ['Readable indentation for deeply nested documents', 'Well-formedness checks with the position of the offending tag', 'Minify mode strips insignificant whitespace'],
faq: [['What does "not well-formed" mean?', 'It means the document breaks a structural rule: an unclosed tag, mismatched case, or a stray angle bracket. The validator names the position so you can fix it.'], ['Can I format an RSS feed or sitemap with this?', 'Yes. Both are XML, so paste the feed or sitemap and it formats like any other document.']],
},
csv: {
-- name: 'CSV to JSON Converter', title: 'CSV to JSON Converter & CSV Viewer — Free Online',
-- desc: 'Convert CSV to JSON and view CSV as a sortable table online. Handles quoted fields, commas inside values and custom headers. Free, instant, no upload.',
++ name: 'CSV to JSON Converter', title: 'CSV to JSON Converter & CSV Viewer — Online Tool',
++ desc: 'Convert CSV to JSON and view CSV as a sortable table online. Handles quoted fields, commas inside values and custom headers. Instant, no upload.',
kw: 'csv to json, csv viewer, csv converter, csv parser online, convert csv, csv table viewer',
about: 'Paste CSV to see it as a clean table or convert it straight to a JSON array of objects using the first row as keys. Quoted fields and embedded commas are parsed correctly.',
bullets: ['Table view for scanning a file quickly', 'CSV → JSON using the header row as object keys', 'Correctly handles quoted values containing commas and newlines'],
faq: [['How does the converter handle commas inside a field?', 'Fields wrapped in double quotes are parsed as single values, so embedded commas and line breaks survive the conversion.'], ['Can I convert a spreadsheet export?', 'Yes. Export the sheet as CSV, paste it here, and convert to JSON or read it as a table.']],
},
sql: {
-- name: 'SQL Formatter', title: 'SQL Formatter & Beautifier — Free Online Query Formatter',
-- desc: 'Format and beautify SQL queries online. Turn one-line queries into readable, indented SQL with keyword highlighting. Free, works with any SQL dialect.',
++ name: 'SQL Formatter', title: 'SQL Formatter & Beautifier — Online Query Formatter',
++ desc: 'Format and beautify SQL queries online. Turn one-line queries into readable, indented SQL with keyword highlighting. Works with any SQL dialect.',
kw: 'sql formatter, sql beautifier, format sql online, sql pretty print, query formatter',
about: 'Turn a long single-line query into properly indented SQL with keywords aligned, so joins and nested conditions are readable in a code review or a bug report.',
bullets: ['Readable indentation for joins, subqueries and CTEs', 'Uppercase keyword mode for a consistent house style', 'Compact mode to put a query back on one line'],
faq: [['Which SQL dialects are supported?', 'The formatter works on standard SQL syntax, which covers the vast majority of PostgreSQL, MySQL, SQLite and SQL Server queries.'], ['Is my query sent anywhere?', 'No. Formatting happens in your browser, so queries containing table or column names never leave your machine.']],
},
md: {
-- name: 'Markdown Editor', title: 'Markdown Editor with Live Preview — Free Online Markdown to HTML',
-- desc: 'Write Markdown and see the rendered HTML live. Convert Markdown to HTML, preview README files and copy the output. Free, no signup, runs in your browser.',
++ name: 'Markdown Editor', title: 'Markdown Editor with Live Preview — Online Markdown to HTML',
++ desc: 'Write Markdown and see the rendered HTML live. Convert Markdown to HTML, preview README files and copy the output. No signup, runs in your browser.',
kw: 'markdown editor, markdown to html, markdown preview, online markdown, readme preview',
about: 'Type Markdown on one side and watch the rendered result on the other. Useful for drafting a README, checking how a comment will render, or converting Markdown into HTML you can paste elsewhere.',
bullets: ['Live side-by-side preview as you type', 'Headings, lists, tables, code blocks and links', 'Copy the generated HTML in one click'],
faq: [['Does it support GitHub-flavoured Markdown?', 'The common extensions are covered: tables, fenced code blocks, task lists and strikethrough.'], ['Can I use this to preview a README before pushing?', 'Yes. Paste the file contents and the preview shows how the structure will render.']],
},
html: {
-- name: 'HTML Formatter', title: 'HTML Formatter, Minifier & Entity Encoder — Free Online',
-- desc: 'Format, minify and escape HTML online. Beautify messy markup, compress it for production, or encode HTML entities safely. Free and instant.',
++ name: 'HTML Formatter', title: 'HTML Formatter, Minifier & Entity Encoder — Online Tool',
++ desc: 'Format, minify and escape HTML online. Beautify messy markup, compress it for production, or encode HTML entities safely. Instant.',
kw: 'html formatter, html minifier, html beautifier, html entity encoder, format html online',
about: 'Clean up unreadable markup, shrink it for production, or convert characters to HTML entities so user content can be displayed without breaking the page.',
bullets: ['Beautify with consistent tag indentation', 'Minify by stripping comments and redundant whitespace', 'Entity encoding for safely displaying markup as text'],
faq: [['When should I encode HTML entities?', 'Any time you display text that a user supplied. Encoding turns characters like < and > into entities so the browser renders them as text instead of executing them as markup.'], ['Does minifying HTML break my page?', 'The minifier only removes whitespace and comments that do not affect rendering. Content inside pre and textarea elements is preserved.']],
},
base64: {
-- name: 'Base64 Encoder & Decoder', title: 'Base64 Encode & Decode Online — Free Base64 Converter',
-- desc: 'Encode text to Base64 and decode Base64 back to text online. UTF-8 safe, handles data URIs, and runs entirely in your browser. Free, no signup.',
++ name: 'Base64 Encoder & Decoder', title: 'Base64 Encode & Decode Online — Base64 Converter',
++ desc: 'Encode text to Base64 and decode Base64 back to text online. UTF-8 safe, handles data URIs, and runs entirely in your browser. No signup.',
kw: 'base64 encode, base64 decode, base64 converter, base64 online, decode base64 string',
about: 'Convert text to Base64 and back. Useful for reading an encoded token, building a data URI, or inspecting a value copied out of a config file or HTTP header.',
bullets: ['Encode and decode with full UTF-8 support', 'Decodes padded and unpadded input', 'Everything runs locally — safe for tokens and credentials'],
faq: [['Is Base64 encryption?', 'No. Base64 is an encoding, not encryption — anyone can decode it. It exists to move binary data safely through text-only channels.'], ['Is it safe to decode a token here?', 'Yes. Decoding happens in your browser and nothing is transmitted or stored.']],
},
url: {
-- name: 'URL Encoder & Decoder', title: 'URL Encode & Decode Online — Free Percent-Encoding Tool',
-- desc: 'Encode and decode URLs online, and break any URL into its parts. Handles percent-encoding, query strings and parameters. Free and instant.',
++ name: 'URL Encoder & Decoder', title: 'URL Encode & Decode Online — Percent-Encoding Tool',
++ desc: 'Encode and decode URLs online, and break any URL into its parts. Handles percent-encoding, query strings and parameters. Instant.',
kw: 'url encode, url decode, percent encoding, url parser, query string parser, urlencode online',
about: 'Percent-encode a string for safe use in a URL, decode one you have been handed, or split a full URL into protocol, host, path, query parameters and fragment.',
bullets: ['Encode and decode with correct percent-encoding rules', 'Parse a URL into its components and query parameters', 'Useful for debugging redirects, callbacks and tracking links'],
faq: [['What is the difference between encodeURI and encodeURIComponent?', 'encodeURI leaves characters that have meaning in a URL (like / and ?) alone, while encodeURIComponent encodes them too. Use the component version for individual query values.'], ['Why does my query parameter break?', 'Usually an unencoded ampersand or equals sign inside a value. Encoding the value fixes it.']],
},
jwt: {
-- name: 'JWT Decoder', title: 'JWT Decoder — Decode JSON Web Tokens Online, Free',
++ name: 'JWT Decoder', title: 'JWT Decoder — Decode JSON Web Tokens Online',
desc: 'Decode a JWT to inspect its header, payload and expiry. See claims, issued-at and expiration times in readable form. Runs in your browser — tokens are never sent.',
kw: 'jwt decoder, decode jwt, json web token decoder, jwt parser, jwt payload viewer',
about: 'Paste a JSON Web Token to read its header and payload, with timestamps rendered as dates and the expiry checked against the current time. Decoding happens locally, so tokens stay on your machine.',
@@@ -111,103 +111,103 @@ const DEV = {
faq: [['Does decoding a JWT verify its signature?', 'No. Decoding only reads the token contents. Verifying the signature needs the issuer\'s secret or public key, which should only ever happen on your server.'], ['Is it safe to paste a live token here?', 'Yes. The token is parsed in your browser and never sent over the network.']],
},
uuid: {
-- name: 'UUID Generator', title: 'UUID Generator — Free Online UUID v4 Generator & Validator',
-- desc: 'Generate random UUID v4 identifiers, create them in bulk, and validate existing UUIDs. Cryptographically random, instant, free, no signup.',
++ name: 'UUID Generator', title: 'UUID Generator — Online UUID v4 Generator & Validator',
++ desc: 'Generate random UUID v4 identifiers, create them in bulk, and validate existing UUIDs. Cryptographically random, instant, no signup.',
kw: 'uuid generator, guid generator, uuid v4, random uuid, uuid validator, generate uuid online',
about: 'Generate version 4 UUIDs using your browser\'s cryptographic random source, produce a batch for seeding a database, or check whether a string is a valid UUID.',
bullets: ['Cryptographically random UUID v4 values', 'Bulk generation for test data and migrations', 'Validation for UUIDs of any version'],
faq: [['Are these UUIDs safe to use in production?', 'Yes. They come from the browser\'s crypto random generator, the same source server-side libraries use.'], ['What is the difference between a UUID and a GUID?', 'They are the same thing. GUID is Microsoft\'s name for the same 128-bit identifier format.']],
},
hash: {
-- name: 'Hash Generator', title: 'SHA-256 Hash Generator — Free Online SHA-1, SHA-256 & SHA-512',
-- desc: 'Generate SHA-1, SHA-256 and SHA-512 hashes from any text online. Useful for checksums, fingerprints and integrity checks. Free and computed in your browser.',
++ name: 'Hash Generator', title: 'SHA-256 Hash Generator — Online SHA-1, SHA-256 & SHA-512',
++ desc: 'Generate SHA-1, SHA-256 and SHA-512 hashes from any text online. Useful for checksums, fingerprints and integrity checks. Computed in your browser.',
kw: 'sha256 generator, hash generator, sha1 hash, sha512, checksum generator, hash text online',
about: 'Produce a cryptographic hash of any text using SHA-1, SHA-256 or SHA-512. Handy for verifying a checksum, generating a fingerprint, or comparing two values without storing the originals.',
bullets: ['SHA-1, SHA-256 and SHA-512 from the same input', 'Uses the browser\'s native Web Crypto implementation', 'Nothing is uploaded — safe for sensitive strings'],
faq: [['Can a hash be reversed?', 'No. Hashes are one-way. Identical input always produces identical output, but you cannot recover the input from the hash.'], ['Which algorithm should I use?', 'SHA-256 for almost everything. SHA-1 is only useful for compatibility with older systems, as it is no longer considered collision-resistant.']],
},
hex: {
-- name: 'Hex Converter', title: 'Hex to Text Converter — Free Online Hex, Binary & ASCII Tool',
-- desc: 'Convert text to hexadecimal, decode hex back to text, and switch between hex, binary and decimal. Free, instant, runs in your browser.',
++ name: 'Hex Converter', title: 'Hex to Text Converter — Online Hex, Binary & ASCII Tool',
++ desc: 'Convert text to hexadecimal, decode hex back to text, and switch between hex, binary and decimal. Instant, runs in your browser.',
kw: 'hex to text, text to hex, hex converter, hex decoder, binary converter, ascii to hex',
about: 'Convert between text, hexadecimal and binary. Useful when reading a memory dump, decoding a protocol payload, or converting a byte sequence you found in a log.',
bullets: ['Text ⇄ hex with UTF-8 handling', 'Hex ⇄ binary and decimal conversion', 'Accepts spaced, prefixed or continuous hex input'],
faq: [['What do the 0x prefixes mean?', 'They mark a number as hexadecimal in most programming languages. The converter accepts input with or without them.'], ['Why do some characters become several hex bytes?', 'Non-ASCII characters take more than one byte in UTF-8, so an emoji or accented letter maps to several hex pairs.']],
},
entities: {
-- name: 'String Escape Tool', title: 'HTML, JavaScript & URL Escape Tool — Free Online Escaper',
-- desc: 'Escape and unescape strings for HTML, JavaScript and URLs. Prevent injection bugs and safely embed text in code. Free and instant.',
++ name: 'String Escape Tool', title: 'HTML, JavaScript & URL Escape Tool — Online Escaper',
++ desc: 'Escape and unescape strings for HTML, JavaScript and URLs. Prevent injection bugs and safely embed text in code. Instant.',
kw: 'escape html, unescape string, javascript escape, escape characters online, string escaper',
about: 'Escape a string so it can be safely embedded in HTML, in a JavaScript literal, or in a URL — and reverse the process when you need the original text back.',
bullets: ['HTML entity escaping for safe display of user content', 'JavaScript string escaping including quotes and newlines', 'URL escaping for query values and path segments'],
faq: [['Why does escaping matter for security?', 'Unescaped user input is how cross-site scripting happens. Escaping ensures text is displayed as text rather than executed as markup or code.'], ['Which mode should I use?', 'Match the destination: HTML escaping for page content, JavaScript escaping for code literals, URL escaping for anything going into a link.']],
},
timestamp: {
-- name: 'Unix Timestamp Converter', title: 'Unix Timestamp Converter — Epoch to Date, Free Online',
-- desc: 'Convert Unix timestamps to human-readable dates and back, with timezone support. Handles seconds and milliseconds. Free, instant, no signup.',
++ name: 'Unix Timestamp Converter', title: 'Unix Timestamp Converter — Epoch to Date',
++ desc: 'Convert Unix timestamps to human-readable dates and back, with timezone support. Handles seconds and milliseconds. Instant, no signup.',
kw: 'unix timestamp converter, epoch converter, timestamp to date, date to timestamp, epoch time',
about: 'Turn an epoch timestamp into a readable date in any timezone, or convert a date back into a timestamp. Both seconds and milliseconds are detected automatically.',
bullets: ['Epoch ⇄ date in both directions', 'Automatic detection of seconds vs milliseconds', 'Timezone-aware output including UTC and local time'],
faq: [['Is my timestamp in seconds or milliseconds?', 'Ten digits is seconds, thirteen is milliseconds. The converter detects which you pasted and labels the result.'], ['What is the Unix epoch?', 'Midnight UTC on 1 January 1970. A Unix timestamp counts the seconds elapsed since that moment.']],
},
cron: {
-- name: 'Cron Expression Parser', title: 'Cron Expression Parser — Explain Cron Schedules Online, Free',
-- desc: 'Decode any cron expression into plain English and see the next run times. Validate crontab syntax before you deploy it. Free and instant.',
++ name: 'Cron Expression Parser', title: 'Cron Expression Parser — Explain Cron Schedules Online',
++ desc: 'Decode any cron expression into plain English and see the next run times. Validate crontab syntax before you deploy it. Instant.',
kw: 'cron expression parser, crontab generator, cron schedule explained, next run time, cron validator',
about: 'Paste a cron expression to read it in plain English and see exactly when it will fire next. Saves guessing whether a schedule means every five minutes or five past the hour.',
bullets: ['Plain-English description of any cron expression', 'A list of upcoming run times so you can sanity-check the schedule', 'Validates the syntax before you commit it to a crontab'],
faq: [['What does */5 * * * * mean?', 'Every five minutes, on every hour, day and month. Paste any expression here for a written explanation and the next run times.'], ['Why did my cron job not run?', 'Most often the field order is wrong (minute, hour, day of month, month, day of week) or the day-of-week and day-of-month fields conflict. The parser shows the interpreted schedule so you can spot it.']],
},
beautify: {
-- name: 'Code Beautifier', title: 'Code Beautifier — Free Online JS, CSS, HTML, JSON & SQL Formatter',
-- desc: 'Beautify JavaScript, CSS, HTML, JSON and SQL online. Turn minified or messy code into clean, indented, readable source. Free, instant, no signup.',
++ name: 'Code Beautifier', title: 'Code Beautifier — Online JS, CSS, HTML, JSON & SQL Formatter',
++ desc: 'Beautify JavaScript, CSS, HTML, JSON and SQL online. Turn minified or messy code into clean, indented, readable source. Instant, no signup.',
kw: 'code beautifier, javascript formatter, css formatter, unminify, code formatter online, prettify code',
about: 'Paste minified or badly formatted code and get readable, consistently indented source back. Works across JavaScript, CSS, HTML, JSON and SQL, which makes it useful for reading third-party bundles.',
bullets: ['One tool for JS, CSS, HTML, JSON and SQL', 'Consistent indentation and line breaks', 'Great for reading minified production code'],
faq: [['Can this recover minified code?', 'It restores structure and indentation so the code is readable, but names that a minifier shortened cannot be recovered.'], ['Does beautifying change what the code does?', 'No. Only whitespace and line breaks change; the code is functionally identical.']],
},
minify: {
-- name: 'Code Minifier', title: 'Code Minifier — Free Online JS, CSS, HTML & JSON Minifier',
-- desc: 'Minify JavaScript, CSS, HTML and JSON online to cut file size and speed up your site. Free, instant, runs entirely in your browser.',
++ name: 'Code Minifier', title: 'Code Minifier — Online JS, CSS, HTML & JSON Minifier',
++ desc: 'Minify JavaScript, CSS, HTML and JSON online to cut file size and speed up your site. Instant, runs entirely in your browser.',
kw: 'minify javascript, css minifier, html minifier, json minifier, compress code online',
about: 'Strip comments and unnecessary whitespace to shrink files before shipping them. Smaller payloads mean faster page loads, which is one of the ranking signals search engines actually measure.',
bullets: ['JavaScript, CSS, HTML and JSON in one place', 'Shows the size saved by the minification', 'Runs locally — no upload, no build step required'],
faq: [['How much smaller will my file get?', 'Typically 20–60% before compression, depending on how much whitespace and commenting the source contains. The tool reports the exact saving.'], ['Should I minify if my server uses gzip?', 'Yes. Minification and gzip compound: minifying first removes content gzip would otherwise have to encode.']],
},
codediff: {
-- name: 'Diff Checker', title: 'Diff Checker — Compare Text & Code Online, Free',
-- desc: 'Compare two blocks of text or code side by side and see every addition, deletion and change highlighted. Free, instant, private to your browser.',
++ name: 'Diff Checker', title: 'Diff Checker — Compare Text & Code Online',
++ desc: 'Compare two blocks of text or code side by side and see every addition, deletion and change highlighted. Instant, private to your browser.',
kw: 'diff checker, compare text, text comparison, code diff, file compare online, difference checker',
about: 'Paste two versions of a file, a config or a paragraph and see exactly what changed, line by line, with additions and removals highlighted.',
bullets: ['Side-by-side comparison with highlighted changes', 'Works on prose, code, config files and logs', 'Nothing is uploaded, so it is safe for private files'],
faq: [['Can I compare two config files?', 'Yes. Paste each version into one side; the differences are highlighted line by line.'], ['Is there a size limit?', 'The comparison runs in your browser, so the practical limit is your machine\'s memory rather than an upload cap.']],
},
regex: {
-- name: 'Regex Tester', title: 'Regex Tester — Test Regular Expressions Online, Free',
-- desc: 'Test regular expressions against sample text with live match highlighting and capture groups. Debug patterns before shipping them. Free and instant.',
++ name: 'Regex Tester', title: 'Regex Tester — Test Regular Expressions Online',
++ desc: 'Test regular expressions against sample text with live match highlighting and capture groups. Debug patterns before shipping them. Instant.',
kw: 'regex tester, regular expression tester, regex online, test regex, regex match, regex debugger',
about: 'Write a pattern, paste sample text, and watch matches highlight as you type. Capture groups are listed separately so you can confirm a pattern extracts what you expect before it reaches production.',
bullets: ['Live highlighting of every match as you type', 'Named and numbered capture groups listed per match', 'Flag toggles for global, case-insensitive and multiline'],
faq: [['Which regex flavour does this use?', 'JavaScript regular expressions, which are close to PCRE for everyday patterns. Lookbehind and named groups are supported in modern browsers.'], ['Why does my pattern match nothing?', 'Common causes are an unescaped special character, a missing global flag when you expect several matches, or anchors that assume single-line input.']],
},
slugify: {
-- name: 'Slug Generator', title: 'URL Slug Generator — Free SEO-Friendly Slug Maker',
-- desc: 'Turn any title into a clean, SEO-friendly URL slug. Removes accents and punctuation, lowercases and hyphenates. Free and instant.',
++ name: 'Slug Generator', title: 'URL Slug Generator — SEO-Friendly Slug Maker',
++ desc: 'Turn any title into a clean, SEO-friendly URL slug. Removes accents and punctuation, lowercases and hyphenates. Instant.',
kw: 'slug generator, url slug, seo friendly url, permalink generator, slugify text online',
about: 'Convert a headline into a tidy URL slug: lowercase, hyphen-separated, accents folded and punctuation removed. Readable slugs help both people and search engines understand a page before they open it.',
bullets: ['Accent folding so international titles produce clean ASCII slugs', 'Punctuation and stop-character stripping', 'Consistent hyphenation with no double separators'],
faq: [['Do slugs affect SEO?', 'A short, descriptive slug containing your main keyword helps search engines and gives people a readable link, which improves click-through from search results.'], ['Should slugs contain dates or IDs?', 'Usually not. Keep them short and descriptive; dates age the URL and IDs mean nothing to a reader.']],
},
lorem: {
-- name: 'Lorem Ipsum Generator', title: 'Lorem Ipsum Generator — Free Placeholder Text Generator',
-- desc: 'Generate lorem ipsum placeholder text by words, sentences or paragraphs. Perfect for mockups, layouts and design drafts. Free, instant, no signup.',
++ name: 'Lorem Ipsum Generator', title: 'Lorem Ipsum Generator — Placeholder Text Generator',
++ desc: 'Generate lorem ipsum placeholder text by words, sentences or paragraphs. Perfect for mockups, layouts and design drafts. Instant, no signup.',
kw: 'lorem ipsum generator, placeholder text, dummy text generator, filler text, lipsum',
about: 'Produce as much placeholder copy as your mockup needs, measured in words, sentences or paragraphs, so a layout can be reviewed without waiting on the real content.',
bullets: ['Generate by word, sentence or paragraph count', 'Classic lorem ipsum text for familiar typographic colour', 'Copy straight into a design tool or HTML'],
faq: [['Why use lorem ipsum instead of real text?', 'It has roughly the same letter distribution as natural prose, so a layout reads realistically without reviewers getting distracted by the wording.'], ['Can I generate a specific number of words?', 'Yes. Choose the unit and the amount, and the generator produces exactly that much text.']],
},
curlconvert: {
-- name: 'curl Converter', title: 'curl Converter — Convert curl to fetch, Python & Node.js, Free',
++ name: 'curl Converter', title: 'curl Converter — Convert curl to fetch, Python & Node.js',
desc: 'Paste a curl command and convert it to JavaScript fetch, Python requests or Node.js code. Great for turning browser "Copy as cURL" into working code.',
kw: 'curl to fetch, curl converter, curl to python, curl to javascript, convert curl command',
about: 'Take a curl command — including one copied straight from your browser\'s network tab — and turn it into equivalent code, with headers, method and body carried across.',
@@@ -215,7 +215,7 @@ const DEV = {
faq: [['Where do I get a curl command to convert?', 'In any browser\'s devtools, right-click a request in the Network tab and choose "Copy as cURL". Paste it here to get code.'], ['Are my headers sent anywhere?', 'No. The conversion is pure text processing in your browser, so authorization headers stay local.']],
},
webhook: {
-- name: 'Webhook Tester', title: 'Webhook Tester — Free Online Request Bin & Inspector',
++ name: 'Webhook Tester', title: 'Webhook Tester — Online Request Bin & Inspector',
desc: 'Get a temporary webhook URL and inspect every request it receives: headers, body, method and query. Debug integrations without deploying anything.',
kw: 'webhook tester, request bin, webhook debugger, http request inspector, test webhook online',
about: 'Create a throwaway endpoint, point your integration at it, and read exactly what arrives — method, headers, query string and body — so you can confirm a provider is sending what its docs claim.',
@@@ -223,15 +223,15 @@ const DEV = {
faq: [['How long does a webhook bin last?', 'Bins expire after about an hour and hold a capped number of recent requests, which is plenty for debugging an integration.'], ['Can I use this for production traffic?', 'No. It is a debugging aid — bins are temporary and publicly addressable by anyone with the URL.']],
},
color: {
-- name: 'Color Converter', title: 'Color Picker & HEX to RGB Converter — Free Online Color Tool',
-- desc: 'Pick colors and convert between HEX, RGB and HSL, then generate matching palettes. Free, instant, perfect for CSS and design work.',
++ name: 'Color Converter', title: 'Color Picker & HEX to RGB Converter — Online Color Tool',
++ desc: 'Pick colors and convert between HEX, RGB and HSL, then generate matching palettes. Instant, perfect for CSS and design work.',
kw: 'hex to rgb, color converter, color picker, rgb to hex, hsl converter, color palette generator',
about: 'Convert a color between HEX, RGB and HSL notation, pick one visually, and generate a palette of related shades for a design system or a CSS variable set.',
bullets: ['HEX, RGB and HSL conversion in every direction', 'Visual picker with live preview', 'Palette generation for tints, shades and complements'],
faq: [['What is the difference between HEX and RGB?', 'They describe the same color in different notation — HEX is a compact hexadecimal form of the same red, green and blue values. HSL instead describes hue, saturation and lightness, which is easier to adjust by hand.'], ['How do I make a lighter version of a brand color?', 'Convert it to HSL and raise the lightness value. The palette generator does this for you.']],
},
opengraph: {
-- name: 'Open Graph Preview', title: 'Open Graph Preview & Meta Tag Checker — Free Social Card Tester',
++ name: 'Open Graph Preview', title: 'Open Graph Preview & Meta Tag Checker — Social Card Tester',
desc: 'Preview how any URL appears when shared on social media and validate its Open Graph and Twitter Card tags. Spot missing images and titles before you post.',
kw: 'open graph preview, og tag checker, twitter card validator, social media preview, meta tag checker',
about: 'Enter a URL to fetch its Open Graph and Twitter Card tags and see the link preview a social platform would build from them, along with a list of any tags that are missing or truncated.',
@@@ -243,51 +243,51 @@ const DEV = {
// ── Network & diagnostics tools (net.openvibe.tools) ─────────
const NET = {
net: {
-- name: 'Network Tools', title: 'Free Online Network Tools — Ping, DNS, Whois & SSL Diagnostics',
-- desc: 'Run ping, traceroute, DNS lookups, Whois, SSL checks, port scans and HTTP header tests from the browser. Free network diagnostics with no signup.',
++ name: 'Network Tools', title: 'Online Network Tools — Ping, DNS, Whois & SSL Diagnostics',
++ desc: 'Run ping, traceroute, DNS lookups, Whois, SSL checks, port scans and HTTP header tests from the browser. Network diagnostics with no signup.',
kw: 'network tools, online network diagnostics, ping test, dns lookup, whois, ssl checker',
about: 'A set of network diagnostics that run from our servers so you can test a host from outside your own connection — useful when you need to know whether a problem is yours or theirs.',
-- bullets: ['Tests run from our infrastructure, not your browser', 'Covers DNS, email deliverability, HTTP, TLS and routing', 'Free with no account required'],
-- faq: [['Why test from a server instead of my machine?', 'Testing from outside your network rules out your own DNS cache, firewall or ISP, which is exactly what you need when a site works for you but not for someone else.'], ['Are these tools free?', 'Yes, with reasonable rate limits to keep them available for everyone.']],
++ bullets: ['Tests run from our infrastructure, not your browser', 'Covers DNS, email deliverability, HTTP, TLS and routing', 'No account required'],
++ faq: [['Why test from a server instead of my machine?', 'Testing from outside your network rules out your own DNS cache, firewall or ISP, which is exactly what you need when a site works for you but not for someone else.'], ['Do I need an account?', 'No. There are reasonable rate limits to keep them available for everyone.']],
},
-- lookup: { name: 'Domain & IP Lookup', title: 'Domain & IP Lookup — All-in-One Free Online Lookup Tool', desc: 'Look up everything about a domain or IP in one go: DNS records, Whois, geolocation, SSL and HTTP headers. Free, instant, no signup.', kw: 'domain lookup, ip lookup, whois lookup, dns lookup, all in one lookup tool', about: 'Enter a domain or IP address and get a complete report in one pass: registration details, DNS records, hosting location, certificate status and HTTP response headers.', bullets: ['One query returns DNS, Whois, geolocation and TLS detail', 'Works with domains, IPv4 and IPv6 addresses', 'A fast first step when diagnosing any site problem'], faq: [['What can I learn from a domain lookup?', 'Who registered the domain and when it expires, which nameservers and mail servers it uses, where it is hosted, and whether its certificate is valid.'], ['Does this work for IP addresses too?', 'Yes. Enter an IP to see its owner, network range, geolocation and reverse DNS name.']] },
-- myip: { name: 'What Is My IP', title: 'What Is My IP Address — Free IP, ISP & Location Checker', desc: 'See your public IP address, ISP, approximate location and reverse DNS instantly. Works for both IPv4 and IPv6. Free, no signup.', kw: 'what is my ip, my ip address, public ip, ip location, my isp', about: 'Shows the public IP address the internet sees for your connection, along with the network operator, approximate location and reverse DNS name.', bullets: ['Detects both your IPv4 and IPv6 address', 'ISP, autonomous system and approximate location', 'Confirms at a glance whether a VPN is actually active'], faq: [['Why does my IP differ from the one in my router?', 'Your router shows a private address used inside your network. The public address shown here is what websites actually see.'], ['How do I check whether my VPN is working?', 'Load this page with the VPN off, then on. If the address and location change, traffic is going through the VPN.']] },
-- ip: { name: 'IP Address Lookup', title: 'IP Address Lookup — Free IPv4 & IPv6 Information Tool', desc: 'Look up any IP address to see its owner, network, geolocation, reverse DNS and abuse contact. Supports IPv4 and IPv6. Free and instant.', kw: 'ip address lookup, ip checker, ip information, ip details, ip owner lookup', about: 'Enter any IP address to find out which organisation announces it, which network block it belongs to, roughly where it is, and what its reverse DNS name says.', bullets: ['Owner, network range and autonomous system', 'Geolocation with country, region and city', 'Reverse DNS and abuse contact where published'], faq: [['Can an IP address identify a person?', 'No. It identifies a network connection and usually resolves only to a city-level area and an internet provider.'], ['Why is the location wrong?', 'Geolocation is inferred from registry and routing data. Mobile networks and VPNs often report the location of a gateway hundreds of miles away.']] },
-- ipv4: { name: 'IPv4 Lookup & CIDR Calculator', title: 'IPv4 Lookup & CIDR Subnet Calculator — Free Online', desc: 'Look up IPv4 addresses and calculate CIDR subnets: network range, broadcast address, usable hosts and mask. Free and instant.', kw: 'ipv4 lookup, cidr calculator, subnet calculator, ip range calculator, netmask calculator', about: 'Inspect an IPv4 address or work out a subnet: given a CIDR block you get the network address, broadcast address, usable host range and the total address count.', bullets: ['CIDR to range, mask and host count', 'Address class and reserved-range detection', 'Useful for firewall rules and allowlists'], faq: [['How many hosts are in a /24?', '256 addresses, of which 254 are usable — the first is the network address and the last is the broadcast address.'], ['What does the /number in CIDR mean?', 'It is the count of leading bits that identify the network. A larger number means a smaller subnet.']] },
-- ipv6: { name: 'IPv6 Lookup', title: 'IPv6 Address Lookup & Expander — Free Online IPv6 Tool', desc: 'Look up IPv6 addresses, expand or compress notation, and identify address type and scope. Free, instant, no signup.', kw: 'ipv6 lookup, ipv6 expander, ipv6 address checker, expand ipv6, ipv6 notation', about: 'Expand a shortened IPv6 address to its full form, compress it back, and see what kind of address it is — global unicast, link-local, unique local or multicast.', bullets: ['Expand and compress IPv6 notation', 'Address type, scope and prefix detection', 'Owner and routing information for global addresses'], faq: [['What does the :: in an IPv6 address mean?', 'It replaces one run of consecutive zero groups. It can appear only once in an address, which is why expansion is unambiguous.'], ['Why do I have several IPv6 addresses?', 'Devices normally hold a link-local address plus one or more global addresses, often including a rotating privacy address.']] },
-- geoip: { name: 'IP Geolocation', title: 'IP Geolocation Lookup — Find the Location of Any IP, Free', desc: 'Find the country, region, city, timezone and coordinates behind any IP address, shown on a map. Free IP geolocation with no signup.', kw: 'ip geolocation, ip location lookup, find ip location, geoip, ip to location', about: 'Resolve an IP address to its most likely physical location, including country, region, city, timezone and approximate coordinates plotted on a map.', bullets: ['Country, region, city and timezone', 'Coordinates plotted on a map', 'Network operator shown alongside the location'], faq: [['How accurate is IP geolocation?', 'Country level is highly reliable; city level is a good guess and often off for mobile and satellite connections. It should never be treated as a precise location.'], ['Why does my own IP show the wrong city?', 'Your provider may route traffic through a regional hub, so the registered location of the gateway is what gets reported.']] },
-- hostname: { name: 'Hostname Lookup', title: 'Hostname Lookup — Resolve Hostnames to IP Addresses, Free', desc: 'Resolve a hostname to its IP addresses or find the hostname behind an IP. Forward and reverse lookups in one tool. Free and instant.', kw: 'hostname lookup, resolve hostname, host to ip, ip to hostname, dns resolve', about: 'Resolve a hostname to every address it answers with, or go the other way and find the name registered for an IP.', bullets: ['Forward resolution to IPv4 and IPv6 addresses', 'Reverse resolution from an address to a name', 'Shows every record when a host is load balanced'], faq: [['Why does one hostname return several IPs?', 'Large sites publish multiple addresses for load balancing and redundancy; your resolver picks one.'], ['What if the reverse lookup returns nothing?', 'Reverse records are optional and set by whoever controls the IP block, so many addresses simply have none.']] },
-- isp: { name: 'ISP Lookup', title: 'ISP Lookup — Find the Internet Provider Behind Any IP, Free', desc: 'Identify the ISP, hosting company or organisation that owns any IP address, plus its network range. Free and instant.', kw: 'isp lookup, ip owner, who owns this ip, hosting provider lookup, organization lookup', about: 'Find out which company is responsible for an address — a residential ISP, a mobile carrier, a cloud provider or a hosting company — along with the network block it sits in.', bullets: ['Provider and organisation name', 'Network block and autonomous system', 'Distinguishes residential, mobile and datacentre addresses'], faq: [['How can I tell if traffic came from a datacentre?', 'The owner name is the giveaway: cloud and hosting providers appear instead of a consumer ISP, which usually means automated traffic or a VPN.'], ['Is the ISP always accurate?', 'It reflects registry data, which is reliable for the owning organisation but may lag when address blocks are transferred or leased.']] },
-- asn: { name: 'ASN Lookup', title: 'ASN Lookup — Autonomous System Number Info, Free Online', desc: 'Look up any autonomous system number to see its operator, announced prefixes and peers. Free BGP and routing information.', kw: 'asn lookup, autonomous system number, bgp lookup, as number, network prefix lookup', about: 'Inspect an autonomous system: who operates it, which address prefixes it announces to the internet, and how it connects to the wider routing table.', bullets: ['Operator name, country and registry', 'Announced IPv4 and IPv6 prefixes', 'Useful for routing investigations and abuse reports'], faq: [['What is an autonomous system?', 'A group of IP networks under one operator with a single routing policy. Every ISP and large hosting provider has at least one, identified by an AS number.'], ['How do I find the ASN for a website?', 'Look up the site\'s IP address first — the result includes the AS number announcing it.']] },
-- rdns: { name: 'Reverse DNS Lookup', title: 'Reverse DNS Lookup — Find the Hostname of an IP (PTR), Free', desc: 'Run a reverse DNS lookup to find the PTR hostname for any IPv4 or IPv6 address. Essential for mail server checks. Free and instant.', kw: 'reverse dns lookup, ptr record lookup, rdns, ip to hostname, reverse ip lookup', about: 'Query the PTR record for an address to find the hostname its operator has registered. Mail servers check this, which makes it a required step when diagnosing delivery problems.', bullets: ['PTR lookups for both IPv4 and IPv6', 'Shows whether forward and reverse records agree', 'Key check for mail server configuration'], faq: [['Why does my mail get rejected for missing reverse DNS?', 'Receiving mail servers treat a missing or mismatched PTR record as a spam signal. Your hosting provider sets this record for you.'], ['What is forward-confirmed reverse DNS?', 'It means the PTR name resolves back to the same IP. Mail servers prefer it, and this tool shows whether it matches.']] },
-- whois: { name: 'Whois Lookup', title: 'Whois Lookup — Free Domain Registration & Ownership Checker', desc: 'Look up domain registration details: registrar, creation and expiry dates, nameservers and status codes. Free Whois lookup, no signup.', kw: 'whois lookup, domain whois, domain registration lookup, check domain owner, domain expiry', about: 'Query registration records for a domain to see who registered it, when it was created, when it expires, which registrar holds it and what status codes are applied.', bullets: ['Registrar, creation, update and expiry dates', 'Nameservers and domain status codes', 'Works for domains and IP address blocks'], faq: [['Why is the registrant hidden?', 'Privacy rules mean most registrars replace personal details with a privacy service. Registrar, dates and nameservers remain public.'], ['How do I tell when a domain expires?', 'The expiry date is in the record here, though domains usually stay in redemption for weeks afterwards before becoming available again.']] },
-- rdap: { name: 'RDAP Lookup', title: 'RDAP Lookup — Modern Domain & IP Registration Data, Free', desc: 'Query RDAP for structured domain and IP registration data — the modern replacement for Whois. Free, instant, standards-compliant.', kw: 'rdap lookup, rdap query, domain registration data, whois alternative, registration data access', about: 'RDAP is the structured successor to Whois: the same registration data delivered as predictable JSON, with consistent fields across registries.', bullets: ['Structured, machine-readable registration data', 'Consistent field names across every registry', 'Covers both domains and IP allocations'], faq: [['How is RDAP different from Whois?', 'Whois returns free-form text that differs by registry. RDAP returns structured data with standard field names, so it is far easier to parse reliably.'], ['Is RDAP replacing Whois?', 'Yes, gradually. Registries are required to run RDAP, and Whois is being retired over time.']] },
-- dns: { name: 'DNS Lookup', title: 'DNS Lookup — Free Online DNS Record Checker (A, MX, TXT)', desc: 'Look up DNS records for any domain: A, AAAA, MX, TXT, CNAME, NS, SOA and more. Free DNS lookup with instant results.', kw: 'dns lookup, dns record checker, check dns records, a record lookup, mx lookup, txt record', about: 'Query any DNS record type for a domain and see the answers exactly as a resolver receives them, including TTL values so you know how long a change will take to spread.', bullets: ['All common record types: A, AAAA, MX, TXT, CNAME, NS, SOA', 'TTL values shown so you can predict propagation', 'Queried from our resolvers, bypassing your local cache'], faq: [['Why do I still see the old DNS record?', 'Resolvers cache answers for the length of the TTL. This tool queries directly, so it usually shows the new value before your machine does.'], ['Which record do I need for a website?', 'An A record (or AAAA for IPv6) pointing at your server\'s IP, or a CNAME pointing at another hostname.']] },
-- dig: { name: 'Online dig', title: 'Online dig Command — Free Web-Based DNS Query Tool', desc: 'Run dig from your browser to query any DNS record type and read the full answer, authority and additional sections. Free, no install.', kw: 'online dig, dig command online, dns query tool, dig web interface, dns debugging', about: 'The dig command without a terminal: choose a record type, query any domain, and read the complete response including the authority and additional sections.', bullets: ['Full response sections, not just the answer', 'Any record type, including less common ones', 'No local install — useful from a locked-down machine'], faq: [['What is the difference between dig and nslookup?', 'dig shows the complete DNS response including flags and section detail, which makes it the better tool for debugging. nslookup is simpler and shows just the answer.'], ['Can I query a specific nameserver?', 'Yes — that is the usual way to confirm an authoritative server has your change before caches expire.']] },
-- nslookup: { name: 'NSLookup', title: 'NSLookup Online — Free Web-Based DNS Lookup Tool', desc: 'Run nslookup from your browser to resolve domains and check DNS records. Simple, fast, free and no install required.', kw: 'nslookup online, nslookup tool, dns lookup command, resolve domain online', about: 'A simple DNS query in the familiar nslookup style: enter a domain, get the addresses and records it resolves to.', bullets: ['Straightforward answers without protocol noise', 'Common record types covered', 'Runs from our resolvers, so it ignores your local cache'], faq: [['Why does nslookup show a different answer than my browser?', 'Your browser and operating system cache DNS answers. A direct query shows the current published record.'], ['Is nslookup still worth using?', 'For a quick "what does this resolve to" check, yes. For debugging, dig gives far more detail.']] },
-- dnspropagation: { name: 'DNS Propagation Checker', title: 'DNS Propagation Checker — Test DNS Worldwide, Free', desc: 'Check whether a DNS change has propagated by querying resolvers around the world and comparing the answers. Free and instant.', kw: 'dns propagation checker, dns propagation test, global dns check, dns worldwide, check dns update', about: 'Query the same record from resolvers in different regions to see which ones have picked up your change and which are still serving the cached answer.', bullets: ['Answers from multiple global regions side by side', 'Highlights resolvers still serving the old value', 'Works for any record type, not just A records'], faq: [['How long does DNS propagation take?', 'Up to the record\'s previous TTL — commonly an hour, sometimes 24 or 48 hours if the TTL was set high. Lowering the TTL before a planned change makes the next one faster.'], ['Why do some regions still show the old IP?', 'Those resolvers cached the previous answer and will keep serving it until that cache entry expires.']] },
-- mx: { name: 'MX Record Lookup', title: 'MX Record Lookup — Find Mail Servers for Any Domain, Free', desc: 'Look up the MX records for a domain to see which mail servers handle its email and in what priority order. Free and instant.', kw: 'mx record lookup, mail server lookup, mx check, email dns records, find mail server', about: 'See which servers accept mail for a domain and their priority order — the first thing to check when email is bouncing or arriving somewhere unexpected.', bullets: ['All MX records with priority values', 'Resolves each mail server to its address', 'Flags domains with no MX record at all'], faq: [['What does the MX priority number mean?', 'Lower numbers are tried first. Equal values are used in rotation, which spreads load across servers.'], ['Why is my email bouncing?', 'Start here: a missing MX record, or one pointing at a host that no longer exists, stops delivery outright.']] },
-- txt: { name: 'TXT Record Lookup', title: 'TXT Record Lookup — Check SPF, DKIM & Verification Records', desc: 'Look up TXT records for any domain, including SPF, DKIM, DMARC and site verification strings. Free, instant DNS TXT checker.', kw: 'txt record lookup, spf record check, dns txt records, domain verification record, check txt record', about: 'Read every TXT record published for a domain — the place where SPF policies, domain verification tokens and assorted service strings all live.', bullets: ['Every TXT record, shown in full', 'Highlights SPF, DKIM and verification entries', 'Useful for confirming a verification token is live'], faq: [['Why is my domain verification failing?', 'Usually the record was added to the wrong host name, or the provider wrapped it in extra quotes. This shows exactly what is published.'], ['Can a domain have more than one TXT record?', 'Yes, and most do. The exception is SPF: exactly one SPF record is allowed, and multiple ones cause failures.']] },
-- ns: { name: 'Nameserver Lookup', title: 'NS Record Lookup — Find the Nameservers for Any Domain, Free', desc: 'Look up the NS records for a domain to see which nameservers are authoritative for it. Free and instant nameserver checker.', kw: 'ns record lookup, nameserver lookup, find nameservers, authoritative dns, dns delegation check', about: 'Find which nameservers a domain is delegated to, and confirm the delegation at the registry matches what the nameservers themselves claim.', bullets: ['Authoritative nameservers for the domain', 'Reveals mismatches between registry and zone', 'First check when a DNS change has no effect'], faq: [['Why do my DNS changes have no effect?', 'Often the domain is delegated to different nameservers than the ones you edited. This shows which servers are actually authoritative.'], ['How many nameservers should a domain have?', 'At least two, on separate networks, so the domain still resolves if one goes down.']] },
-- spf: { name: 'SPF Record Checker', title: 'SPF Record Checker — Validate Your Email SPF Policy, Free', desc: 'Check and validate a domain\'s SPF record. See which servers may send mail, catch syntax errors and count DNS lookups. Free and instant.', kw: 'spf record checker, spf validator, check spf, email authentication, spf lookup limit', about: 'Read a domain\'s SPF policy, expand every include, and confirm it stays inside the ten-lookup limit that causes silent failures when exceeded.', bullets: ['Full expansion of includes and redirects', 'Counts DNS lookups against the limit of ten', 'Flags syntax errors and multiple SPF records'], faq: [['What happens if SPF exceeds ten DNS lookups?', 'Receiving servers return a permanent error and may treat your mail as unauthenticated, so legitimate messages can land in spam.'], ['Can I have two SPF records?', 'No. A domain must publish exactly one; two records cause validation to fail entirely.']] },
-- dkim: { name: 'DKIM Record Lookup', title: 'DKIM Record Lookup & Validator — Free Email Auth Checker', desc: 'Look up and validate DKIM records by selector. Confirm your signing key is published correctly for email authentication. Free and instant.', kw: 'dkim record lookup, dkim checker, dkim validator, dkim selector, email authentication', about: 'Fetch the DKIM public key for a given selector and confirm it is published and well-formed, so signed mail can be verified by receiving servers.', bullets: ['Selector-based lookup for any domain', 'Validates key format and flags', 'Confirms the record is reachable before you go live'], faq: [['What is a DKIM selector?', 'A label that identifies which key to use, published at selector._domainkey.yourdomain.com. Your mail provider tells you which selector it signs with.'], ['Why is DKIM failing after a provider change?', 'The new provider signs with a different selector and key, so the old record no longer matches. Publish the new one they supply.']] },
-- dmarc: { name: 'DMARC Checker', title: 'DMARC Record Checker — Validate Your DMARC Policy, Free', desc: 'Check a domain\'s DMARC record and policy. See enforcement level, reporting addresses and alignment settings. Free and instant.', kw: 'dmarc checker, dmarc record lookup, dmarc validator, dmarc policy, email security check', about: 'Read a domain\'s DMARC policy: whether failures are monitored, quarantined or rejected, where reports are sent, and how strictly alignment is enforced.', bullets: ['Policy level, percentage and alignment settings', 'Reporting addresses for aggregate and forensic reports', 'Syntax validation with clear explanations'], faq: [['What DMARC policy should I start with?', 'Start at p=none with a reporting address. That monitors without affecting delivery, so you can find legitimate senders before moving to quarantine and then reject.'], ['Do I need SPF and DKIM for DMARC to work?', 'Yes. DMARC builds on both, and requires that at least one passes and aligns with the visible From domain.']] },
-- ping: { name: 'Ping Test', title: 'Online Ping Test — Check if a Host Is Up, Free', desc: 'Ping any host or IP from multiple global regions to check reachability and latency. Free online ping test with no install.', kw: 'ping test, online ping, ping ip, check if server is up, latency test, ping tool', about: 'Send ICMP pings from our servers to check whether a host answers and how long the round trip takes, from several regions at once.', bullets: ['Results from multiple global regions', 'Round-trip time, jitter and packet loss', 'Confirms whether an outage is local to you or global'], faq: [['Why does a site load but not respond to ping?', 'Many hosts and firewalls block ICMP on purpose. A failed ping does not always mean a site is down — check HTTP headers instead.'], ['What is a good ping time?', 'Under 50 ms feels instant, under 100 ms is fine for most uses, and over 200 ms is noticeable in calls and games.']] },
-- traceroute: { name: 'Traceroute', title: 'Online Traceroute — Trace the Network Path to Any Host, Free', desc: 'Run a traceroute from our servers to see every hop between us and a host, with latency per hop. Free, no install required.', kw: 'traceroute online, trace route, network path, tracert online, hop by hop latency', about: 'Map the route packets take to a destination, hop by hop, with timing at each step so you can see where latency is introduced or where the path stops.', bullets: ['Every hop with per-hop latency', 'Reverse DNS names to identify the networks in the path', 'Shows exactly where a broken path terminates'], faq: [['Why do some hops show stars?', 'Those routers are configured not to reply to probes. It is normal and does not mean the path is broken.'], ['How do I read a traceroute?', 'Look for the point where latency jumps sharply or replies stop. The hop before it usually names the network where the trouble starts.']] },
-- mtr: { name: 'MTR Report', title: 'Online MTR — Combined Ping & Traceroute Report, Free', desc: 'Run MTR to combine traceroute and ping into one report with per-hop packet loss and latency over time. Free network path analysis.', kw: 'mtr online, mtr report, my traceroute, packet loss test, network path analysis', about: 'MTR repeats a traceroute continuously and aggregates the results, so intermittent packet loss at a single hop shows up clearly instead of hiding behind one lucky probe.', bullets: ['Per-hop loss percentage over many probes', 'Best, average and worst latency for each hop', 'The report network operators ask for in support tickets'], faq: [['Why is MTR better than traceroute for support tickets?', 'It samples repeatedly, so it distinguishes a genuinely lossy hop from a single dropped probe. That is the evidence a network operator needs.'], ['Loss shows at one hop but not later ones — is that a problem?', 'No. That router is just rate-limiting its own replies. Real trouble shows as loss that continues at every hop after it.']] },
-- port: { name: 'Port Checker', title: 'Open Port Checker — Test if a Port Is Open, Free Online', desc: 'Check whether a TCP port is open on any host, from outside your network. Test common services or any custom port. Free and instant.', kw: 'port checker, open port test, port scanner online, check port open, tcp port test', about: 'Test whether a port accepts connections from the public internet — the definitive check on whether a port forward, firewall rule or service binding actually works.', bullets: ['Tests from outside your network, as a real client would', 'Common service ports or any custom port', 'Distinguishes closed ports from filtered ones'], faq: [['My service runs but the port shows closed — why?', 'Either a firewall is dropping the traffic, the port forward is missing, or the service is bound to localhost instead of all interfaces.'], ['What is the difference between closed and filtered?', 'Closed means the host actively refused the connection. Filtered means nothing answered at all, which usually indicates a firewall dropping packets silently.']] },
-- headers: { name: 'HTTP Header Checker', title: 'HTTP Header Checker — Inspect Response Headers Free Online', desc: 'Check the HTTP response headers of any URL, including security, caching and compression headers. Free header analysis tool.', kw: 'http header checker, response headers, security headers check, cache headers, view http headers', about: 'Fetch any URL and read the full response headers, with the security and caching headers called out so you can see what a browser is being told to do.', bullets: ['Complete response headers exactly as sent', 'Security header review including HSTS and CSP', 'Cache and compression headers explained'], faq: [['Which security headers should I have?', 'At minimum Strict-Transport-Security, X-Content-Type-Options and a Content-Security-Policy. The report lists what is present and what is missing.'], ['Why is my page not being cached?', 'Look at Cache-Control. A no-store or no-cache directive, or a missing max-age, prevents browsers and CDNs from reusing the response.']] },
-- redirects: { name: 'Redirect Checker', title: 'Redirect Checker — Trace Redirect Chains Online, Free', desc: 'Follow every hop in a redirect chain and see each status code and destination. Find redirect loops and SEO-damaging chains. Free and instant.', kw: 'redirect checker, redirect chain, 301 checker, url redirect tracer, redirect loop finder', about: 'Follow a URL through every redirect to its final destination, with the status code at each step, so you can spot long chains and loops that waste crawl budget and lose link value.', bullets: ['Every hop with its status code and target', 'Detects loops and unnecessarily long chains', 'Flags temporary redirects used where permanent ones belong'], faq: [['Do redirect chains hurt SEO?', 'Yes. Each extra hop slows the page and search engines limit how many they follow. Point the first URL straight at the final destination.'], ['301 or 302 — which should I use?', 'Use 301 for permanent moves so ranking signals transfer. Use 302 only when the original URL will genuinely return.']] },
-- ssl: { name: 'SSL Certificate Checker', title: 'SSL Certificate Checker — Free Online TLS & Expiry Test', desc: 'Check any site\'s SSL certificate: expiry date, issuer, chain completeness and supported TLS versions. Free SSL checker, instant results.', kw: 'ssl checker, ssl certificate checker, tls check, certificate expiry, ssl chain test', about: 'Inspect a site\'s TLS certificate — who issued it, when it expires, whether the chain is complete and which protocol versions the server negotiates.', bullets: ['Expiry date with days remaining', 'Chain validation that catches missing intermediates', 'Issuer, subject and alternative names'], faq: [['My certificate works in Chrome but fails elsewhere — why?', 'Almost always a missing intermediate certificate. Browsers often cache intermediates from other sites; other clients do not. This check shows whether the chain your server sends is complete.'], ['How early should I renew?', 'Automate renewal at around 30 days remaining. Most issuers allow renewal well before expiry.']] },
-- curl: { name: 'Online curl', title: 'Online curl — Free Web-Based HTTP Request Tester', desc: 'Send HTTP requests from your browser and inspect the full response: status, headers and body. Test APIs without installing anything.', kw: 'online curl, http request tester, api tester online, send http request, rest client online', about: 'Make an HTTP request from our servers and read the complete response. Useful for testing an API from outside your network or from a machine where you cannot install tools.', bullets: ['Any method, with custom headers and body', 'Full response: status, headers and body', 'Requests originate from our servers, not your IP'], faq: [['How is this different from the curl converter?', 'This sends a real request and shows the response. The converter turns a curl command into code without sending anything.'], ['Can I test an internal service?', 'No. Requests come from our servers, so the target must be reachable from the public internet.']] },
-- httpstatus: { name: 'HTTP Status Codes', title: 'HTTP Status Codes — Full Reference & Online Checker, Free', desc: 'Look up what any HTTP status code means and check the code any URL returns. Complete reference from 100 to 599. Free and instant.', kw: 'http status codes, status code meaning, 404 meaning, 301 vs 302, http response codes list', about: 'A full reference for HTTP status codes with plain-English explanations, plus a live check of what code any URL actually returns.', bullets: ['Every status code with a practical explanation', 'Live check of the code a URL returns', 'Notes on which codes search engines act on'], faq: [['What is the difference between 301 and 302?', '301 is permanent and transfers ranking signals to the new URL. 302 is temporary and tells search engines to keep indexing the original.'], ['Should a missing page return 404 or 410?', '404 means not found and may be retried. 410 means permanently gone and gets pages dropped from an index faster.']] },
-- latency: { name: 'Latency Test', title: 'Latency Test — Measure Response Time to Any Host, Free', desc: 'Measure response times to any host from multiple regions and compare latency worldwide. Free online latency and speed check.', kw: 'latency test, response time test, server speed test, ttfb test, network latency check', about: 'Measure how long a host takes to respond from several regions, so you can see where your site feels fast and where it drags.', bullets: ['Response times from multiple global regions', 'Connection versus first-byte timing separated', 'Useful for deciding whether a CDN would help'], faq: [['What is a good time to first byte?', 'Under 200 ms is good, under 500 ms acceptable. Beyond that, visitors notice and search engines record the page as slow.'], ['Why is latency high from one region only?', 'Your server is probably far from it with no edge cache in between. A CDN usually fixes exactly this.']] },
-- blacklist: { name: 'Blacklist Checker', title: 'IP & Domain Blacklist Checker — Free RBL Lookup', desc: 'Check whether an IP or domain is listed on major email blacklists and RBLs. Find out why your mail is being rejected. Free and instant.', kw: 'blacklist check, rbl lookup, ip blacklist checker, email blacklist, spam list check', about: 'Query the major real-time blacklists to see whether an address or domain is listed — the usual explanation when mail is being rejected or silently dropped.', bullets: ['Checks many major blacklists in one query', 'Shows which list flagged you and why', 'Includes delisting links where the operator provides them'], faq: [['How do I get removed from a blacklist?', 'Fix the cause first — an open relay, a compromised account or a bad sending pattern — then use the operator\'s delisting form. Requesting removal without fixing the cause gets you relisted.'], ['Does one listing stop all my mail?', 'Not always. Different providers consult different lists, so a single listing often causes partial rather than total failure.']] },
-- reputation: { name: 'Domain Reputation Checker', title: 'Domain & IP Reputation Checker — Free Online Trust Score', desc: 'Check the reputation of a domain or IP across blacklists, email authentication and security signals. Free reputation report.', kw: 'domain reputation, ip reputation checker, email reputation, sender score, domain trust check', about: 'A combined view of the signals that decide whether other systems trust you: blacklist status, email authentication records, certificate health and hosting details.', bullets: ['Blacklist status combined with authentication checks', 'SPF, DKIM and DMARC presence in one report', 'Practical notes on what to fix first'], faq: [['What hurts domain reputation most?', 'Sending mail without SPF, DKIM and DMARC, appearing on blacklists, and hosting alongside abusive neighbours on a shared IP.'], ['How long does reputation take to recover?', 'Weeks of consistent, authenticated sending. There is no way to reset it instantly.']] },
-- smtp: { name: 'SMTP Server Test', title: 'SMTP Server Test — Check Mail Server Connectivity, Free', desc: 'Test an SMTP server\'s connectivity, banner, STARTTLS support and authentication requirements. Free online mail server check.', kw: 'smtp test, smtp server check, mail server test, starttls check, smtp connectivity', about: 'Connect to a mail server and report what it says: the greeting banner, the extensions it advertises, whether STARTTLS is offered and whether it accepts mail for a domain.', bullets: ['Connection test with the full server greeting', 'STARTTLS and authentication support detection', 'Checks the common submission ports'], faq: [['Which SMTP port should I use?', 'Port 587 with STARTTLS for sending mail from a client, or 465 for implicit TLS. Port 25 is for server-to-server delivery and is blocked by most consumer ISPs.'], ['What does an open relay mean?', 'A server that accepts mail for domains it does not handle. It will be blacklisted quickly, so this test flags it.']] },
-- uptime: { name: 'Website Uptime Checker', title: 'Website Uptime Checker — Is a Site Down? Free Online Test', desc: 'Check whether a website is up from multiple regions and see its response time and status code. Free "is it down" checker.', kw: 'uptime checker, is this site down, website down checker, site availability test, server status check', about: 'Check a site from several regions at once to settle the "is it down for everyone or just me" question, with status code and response time for each.', bullets: ['Checks from multiple global regions at once', 'Status code and response time per region', 'Distinguishes a genuine outage from a local problem'], faq: [['The site works for me but not for a friend — what now?', 'Run this check. If some regions fail, it is a routing or DNS propagation issue rather than the server being down.'], ['Does this monitor continuously?', 'No, this is an on-demand check. It tells you the state right now.']] },
-- robots: { name: 'Robots.txt Tester', title: 'Robots.txt Tester & Analyzer — Free Online Checker', desc: 'Fetch and analyse any site\'s robots.txt, check which URLs are blocked, and catch rules that hide your site from search engines.', kw: 'robots.txt tester, robots txt checker, crawl rules, disallow checker, seo crawl test', about: 'Read a site\'s robots.txt, see the rules that apply to each crawler, and test whether a specific URL would be allowed or blocked — the file where an accidental line can remove a whole site from search.', bullets: ['Rules grouped by user-agent', 'Test any URL against the live rules', 'Flags the accidental site-wide disallow'], faq: [['Does robots.txt remove a page from Google?', 'No. It stops crawling, not indexing — a blocked URL can still appear without a description. Use a noindex meta tag to remove a page properly.'], ['Should robots.txt list my sitemap?', 'Yes. A Sitemap line is the simplest way to point every crawler at your sitemap without registering anywhere.']] },
-- sitemap: { name: 'Sitemap Validator', title: 'Sitemap.xml Validator — Free Online XML Sitemap Checker', desc: 'Validate an XML sitemap, check its structure and URL count, and catch errors that stop search engines indexing your pages. Free.', kw: 'sitemap validator, sitemap.xml checker, xml sitemap test, sitemap errors, seo sitemap check', about: 'Fetch and validate a sitemap against the protocol: structure, URL count, lastmod formatting and index files, so you can be sure crawlers can actually read it.', bullets: ['Structure and schema validation', 'URL count against the 50,000 entry limit', 'Follows sitemap index files to their children'], faq: [['How many URLs can one sitemap hold?', '50,000 URLs or 50 MB uncompressed. Beyond that, split it and reference the parts from a sitemap index.'], ['Does lastmod matter?', 'Yes, when it is accurate. Crawlers use it to prioritise re-crawling, but they learn to ignore it if every URL claims to have changed today.']] },
++ lookup: { name: 'Domain & IP Lookup', title: 'Domain & IP Lookup — All-in-One Online Lookup Tool', desc: 'Look up everything about a domain or IP in one go: DNS records, Whois, geolocation, SSL and HTTP headers. Instant, no signup.', kw: 'domain lookup, ip lookup, whois lookup, dns lookup, all in one lookup tool', about: 'Enter a domain or IP address and get a complete report in one pass: registration details, DNS records, hosting location, certificate status and HTTP response headers.', bullets: ['One query returns DNS, Whois, geolocation and TLS detail', 'Works with domains, IPv4 and IPv6 addresses', 'A fast first step when diagnosing any site problem'], faq: [['What can I learn from a domain lookup?', 'Who registered the domain and when it expires, which nameservers and mail servers it uses, where it is hosted, and whether its certificate is valid.'], ['Does this work for IP addresses too?', 'Yes. Enter an IP to see its owner, network range, geolocation and reverse DNS name.']] },
++ myip: { name: 'What Is My IP', title: 'What Is My IP Address — IP, ISP & Location Checker', desc: 'See your public IP address, ISP, approximate location and reverse DNS instantly. Works for both IPv4 and IPv6. No signup.', kw: 'what is my ip, my ip address, public ip, ip location, my isp', about: 'Shows the public IP address the internet sees for your connection, along with the network operator, approximate location and reverse DNS name.', bullets: ['Detects both your IPv4 and IPv6 address', 'ISP, autonomous system and approximate location', 'Confirms at a glance whether a VPN is actually active'], faq: [['Why does my IP differ from the one in my router?', 'Your router shows a private address used inside your network. The public address shown here is what websites actually see.'], ['How do I check whether my VPN is working?', 'Load this page with the VPN off, then on. If the address and location change, traffic is going through the VPN.']] },
++ ip: { name: 'IP Address Lookup', title: 'IP Address Lookup — IPv4 & IPv6 Information Tool', desc: 'Look up any IP address to see its owner, network, geolocation, reverse DNS and abuse contact. Supports IPv4 and IPv6. Instant.', kw: 'ip address lookup, ip checker, ip information, ip details, ip owner lookup', about: 'Enter any IP address to find out which organisation announces it, which network block it belongs to, roughly where it is, and what its reverse DNS name says.', bullets: ['Owner, network range and autonomous system', 'Geolocation with country, region and city', 'Reverse DNS and abuse contact where published'], faq: [['Can an IP address identify a person?', 'No. It identifies a network connection and usually resolves only to a city-level area and an internet provider.'], ['Why is the location wrong?', 'Geolocation is inferred from registry and routing data. Mobile networks and VPNs often report the location of a gateway hundreds of miles away.']] },
++ ipv4: { name: 'IPv4 Lookup & CIDR Calculator', title: 'IPv4 Lookup & CIDR Subnet Calculator — Online Tool', desc: 'Look up IPv4 addresses and calculate CIDR subnets: network range, broadcast address, usable hosts and mask. Instant.', kw: 'ipv4 lookup, cidr calculator, subnet calculator, ip range calculator, netmask calculator', about: 'Inspect an IPv4 address or work out a subnet: given a CIDR block you get the network address, broadcast address, usable host range and the total address count.', bullets: ['CIDR to range, mask and host count', 'Address class and reserved-range detection', 'Useful for firewall rules and allowlists'], faq: [['How many hosts are in a /24?', '256 addresses, of which 254 are usable — the first is the network address and the last is the broadcast address.'], ['What does the /number in CIDR mean?', 'It is the count of leading bits that identify the network. A larger number means a smaller subnet.']] },
++ ipv6: { name: 'IPv6 Lookup', title: 'IPv6 Address Lookup & Expander — Online IPv6 Tool', desc: 'Look up IPv6 addresses, expand or compress notation, and identify address type and scope. Instant, no signup.', kw: 'ipv6 lookup, ipv6 expander, ipv6 address checker, expand ipv6, ipv6 notation', about: 'Expand a shortened IPv6 address to its full form, compress it back, and see what kind of address it is — global unicast, link-local, unique local or multicast.', bullets: ['Expand and compress IPv6 notation', 'Address type, scope and prefix detection', 'Owner and routing information for global addresses'], faq: [['What does the :: in an IPv6 address mean?', 'It replaces one run of consecutive zero groups. It can appear only once in an address, which is why expansion is unambiguous.'], ['Why do I have several IPv6 addresses?', 'Devices normally hold a link-local address plus one or more global addresses, often including a rotating privacy address.']] },
++ geoip: { name: 'IP Geolocation', title: 'IP Geolocation Lookup — Find the Location of Any IP', desc: 'Find the country, region, city, timezone and coordinates behind any IP address, shown on a map. IP geolocation with no signup.', kw: 'ip geolocation, ip location lookup, find ip location, geoip, ip to location', about: 'Resolve an IP address to its most likely physical location, including country, region, city, timezone and approximate coordinates plotted on a map.', bullets: ['Country, region, city and timezone', 'Coordinates plotted on a map', 'Network operator shown alongside the location'], faq: [['How accurate is IP geolocation?', 'Country level is highly reliable; city level is a good guess and often off for mobile and satellite connections. It should never be treated as a precise location.'], ['Why does my own IP show the wrong city?', 'Your provider may route traffic through a regional hub, so the registered location of the gateway is what gets reported.']] },
++ hostname: { name: 'Hostname Lookup', title: 'Hostname Lookup — Resolve Hostnames to IP Addresses', desc: 'Resolve a hostname to its IP addresses or find the hostname behind an IP. Forward and reverse lookups in one tool. Instant.', kw: 'hostname lookup, resolve hostname, host to ip, ip to hostname, dns resolve', about: 'Resolve a hostname to every address it answers with, or go the other way and find the name registered for an IP.', bullets: ['Forward resolution to IPv4 and IPv6 addresses', 'Reverse resolution from an address to a name', 'Shows every record when a host is load balanced'], faq: [['Why does one hostname return several IPs?', 'Large sites publish multiple addresses for load balancing and redundancy; your resolver picks one.'], ['What if the reverse lookup returns nothing?', 'Reverse records are optional and set by whoever controls the IP block, so many addresses simply have none.']] },
++ isp: { name: 'ISP Lookup', title: 'ISP Lookup — Find the Internet Provider Behind Any IP', desc: 'Identify the ISP, hosting company or organisation that owns any IP address, plus its network range. Instant.', kw: 'isp lookup, ip owner, who owns this ip, hosting provider lookup, organization lookup', about: 'Find out which company is responsible for an address — a residential ISP, a mobile carrier, a cloud provider or a hosting company — along with the network block it sits in.', bullets: ['Provider and organisation name', 'Network block and autonomous system', 'Distinguishes residential, mobile and datacentre addresses'], faq: [['How can I tell if traffic came from a datacentre?', 'The owner name is the giveaway: cloud and hosting providers appear instead of a consumer ISP, which usually means automated traffic or a VPN.'], ['Is the ISP always accurate?', 'It reflects registry data, which is reliable for the owning organisation but may lag when address blocks are transferred or leased.']] },
++ asn: { name: 'ASN Lookup', title: 'ASN Lookup — Autonomous System Number Info', desc: 'Look up any autonomous system number to see its operator, announced prefixes and peers. BGP and routing information.', kw: 'asn lookup, autonomous system number, bgp lookup, as number, network prefix lookup', about: 'Inspect an autonomous system: who operates it, which address prefixes it announces to the internet, and how it connects to the wider routing table.', bullets: ['Operator name, country and registry', 'Announced IPv4 and IPv6 prefixes', 'Useful for routing investigations and abuse reports'], faq: [['What is an autonomous system?', 'A group of IP networks under one operator with a single routing policy. Every ISP and large hosting provider has at least one, identified by an AS number.'], ['How do I find the ASN for a website?', 'Look up the site\'s IP address first — the result includes the AS number announcing it.']] },
++ rdns: { name: 'Reverse DNS Lookup', title: 'Reverse DNS Lookup — Find the Hostname of an IP (PTR)', desc: 'Run a reverse DNS lookup to find the PTR hostname for any IPv4 or IPv6 address. Essential for mail server checks. Instant.', kw: 'reverse dns lookup, ptr record lookup, rdns, ip to hostname, reverse ip lookup', about: 'Query the PTR record for an address to find the hostname its operator has registered. Mail servers check this, which makes it a required step when diagnosing delivery problems.', bullets: ['PTR lookups for both IPv4 and IPv6', 'Shows whether forward and reverse records agree', 'Key check for mail server configuration'], faq: [['Why does my mail get rejected for missing reverse DNS?', 'Receiving mail servers treat a missing or mismatched PTR record as a spam signal. Your hosting provider sets this record for you.'], ['What is forward-confirmed reverse DNS?', 'It means the PTR name resolves back to the same IP. Mail servers prefer it, and this tool shows whether it matches.']] },
++ whois: { name: 'Whois Lookup', title: 'Whois Lookup — Domain Registration & Ownership Checker', desc: 'Look up domain registration details: registrar, creation and expiry dates, nameservers and status codes. Whois lookup, no signup.', kw: 'whois lookup, domain whois, domain registration lookup, check domain owner, domain expiry', about: 'Query registration records for a domain to see who registered it, when it was created, when it expires, which registrar holds it and what status codes are applied.', bullets: ['Registrar, creation, update and expiry dates', 'Nameservers and domain status codes', 'Works for domains and IP address blocks'], faq: [['Why is the registrant hidden?', 'Privacy rules mean most registrars replace personal details with a privacy service. Registrar, dates and nameservers remain public.'], ['How do I tell when a domain expires?', 'The expiry date is in the record here, though domains usually stay in redemption for weeks afterwards before becoming available again.']] },
++ rdap: { name: 'RDAP Lookup', title: 'RDAP Lookup — Modern Domain & IP Registration Data', desc: 'Query RDAP for structured domain and IP registration data — the modern replacement for Whois. Instant, standards-compliant.', kw: 'rdap lookup, rdap query, domain registration data, whois alternative, registration data access', about: 'RDAP is the structured successor to Whois: the same registration data delivered as predictable JSON, with consistent fields across registries.', bullets: ['Structured, machine-readable registration data', 'Consistent field names across every registry', 'Covers both domains and IP allocations'], faq: [['How is RDAP different from Whois?', 'Whois returns free-form text that differs by registry. RDAP returns structured data with standard field names, so it is far easier to parse reliably.'], ['Is RDAP replacing Whois?', 'Yes, gradually. Registries are required to run RDAP, and Whois is being retired over time.']] },
++ dns: { name: 'DNS Lookup', title: 'DNS Lookup — Online DNS Record Checker (A, MX, TXT)', desc: 'Look up DNS records for any domain: A, AAAA, MX, TXT, CNAME, NS, SOA and more. DNS lookup with instant results.', kw: 'dns lookup, dns record checker, check dns records, a record lookup, mx lookup, txt record', about: 'Query any DNS record type for a domain and see the answers exactly as a resolver receives them, including TTL values so you know how long a change will take to spread.', bullets: ['All common record types: A, AAAA, MX, TXT, CNAME, NS, SOA', 'TTL values shown so you can predict propagation', 'Queried from our resolvers, bypassing your local cache'], faq: [['Why do I still see the old DNS record?', 'Resolvers cache answers for the length of the TTL. This tool queries directly, so it usually shows the new value before your machine does.'], ['Which record do I need for a website?', 'An A record (or AAAA for IPv6) pointing at your server\'s IP, or a CNAME pointing at another hostname.']] },
++ dig: { name: 'Online dig', title: 'Online dig Command — Web-Based DNS Query Tool', desc: 'Run dig from your browser to query any DNS record type and read the full answer, authority and additional sections. No install.', kw: 'online dig, dig command online, dns query tool, dig web interface, dns debugging', about: 'The dig command without a terminal: choose a record type, query any domain, and read the complete response including the authority and additional sections.', bullets: ['Full response sections, not just the answer', 'Any record type, including less common ones', 'No local install — useful from a locked-down machine'], faq: [['What is the difference between dig and nslookup?', 'dig shows the complete DNS response including flags and section detail, which makes it the better tool for debugging. nslookup is simpler and shows just the answer.'], ['Can I query a specific nameserver?', 'Yes — that is the usual way to confirm an authoritative server has your change before caches expire.']] },
++ nslookup: { name: 'NSLookup', title: 'NSLookup Online — Web-Based DNS Lookup Tool', desc: 'Run nslookup from your browser to resolve domains and check DNS records. Simple, fast and no install required.', kw: 'nslookup online, nslookup tool, dns lookup command, resolve domain online', about: 'A simple DNS query in the familiar nslookup style: enter a domain, get the addresses and records it resolves to.', bullets: ['Straightforward answers without protocol noise', 'Common record types covered', 'Runs from our resolvers, so it ignores your local cache'], faq: [['Why does nslookup show a different answer than my browser?', 'Your browser and operating system cache DNS answers. A direct query shows the current published record.'], ['Is nslookup still worth using?', 'For a quick "what does this resolve to" check, yes. For debugging, dig gives far more detail.']] },
++ dnspropagation: { name: 'DNS Propagation Checker', title: 'DNS Propagation Checker — Test DNS Worldwide', desc: 'Check whether a DNS change has propagated by querying resolvers around the world and comparing the answers. Instant.', kw: 'dns propagation checker, dns propagation test, global dns check, dns worldwide, check dns update', about: 'Query the same record from resolvers in different regions to see which ones have picked up your change and which are still serving the cached answer.', bullets: ['Answers from multiple global regions side by side', 'Highlights resolvers still serving the old value', 'Works for any record type, not just A records'], faq: [['How long does DNS propagation take?', 'Up to the record\'s previous TTL — commonly an hour, sometimes 24 or 48 hours if the TTL was set high. Lowering the TTL before a planned change makes the next one faster.'], ['Why do some regions still show the old IP?', 'Those resolvers cached the previous answer and will keep serving it until that cache entry expires.']] },
++ mx: { name: 'MX Record Lookup', title: 'MX Record Lookup — Find Mail Servers for Any Domain', desc: 'Look up the MX records for a domain to see which mail servers handle its email and in what priority order. Instant.', kw: 'mx record lookup, mail server lookup, mx check, email dns records, find mail server', about: 'See which servers accept mail for a domain and their priority order — the first thing to check when email is bouncing or arriving somewhere unexpected.', bullets: ['All MX records with priority values', 'Resolves each mail server to its address', 'Flags domains with no MX record at all'], faq: [['What does the MX priority number mean?', 'Lower numbers are tried first. Equal values are used in rotation, which spreads load across servers.'], ['Why is my email bouncing?', 'Start here: a missing MX record, or one pointing at a host that no longer exists, stops delivery outright.']] },
++ txt: { name: 'TXT Record Lookup', title: 'TXT Record Lookup — Check SPF, DKIM & Verification Records', desc: 'Look up TXT records for any domain, including SPF, DKIM, DMARC and site verification strings. Instant DNS TXT checker.', kw: 'txt record lookup, spf record check, dns txt records, domain verification record, check txt record', about: 'Read every TXT record published for a domain — the place where SPF policies, domain verification tokens and assorted service strings all live.', bullets: ['Every TXT record, shown in full', 'Highlights SPF, DKIM and verification entries', 'Useful for confirming a verification token is live'], faq: [['Why is my domain verification failing?', 'Usually the record was added to the wrong host name, or the provider wrapped it in extra quotes. This shows exactly what is published.'], ['Can a domain have more than one TXT record?', 'Yes, and most do. The exception is SPF: exactly one SPF record is allowed, and multiple ones cause failures.']] },
++ ns: { name: 'Nameserver Lookup', title: 'NS Record Lookup — Find the Nameservers for Any Domain', desc: 'Look up the NS records for a domain to see which nameservers are authoritative for it. Instant nameserver checker.', kw: 'ns record lookup, nameserver lookup, find nameservers, authoritative dns, dns delegation check', about: 'Find which nameservers a domain is delegated to, and confirm the delegation at the registry matches what the nameservers themselves claim.', bullets: ['Authoritative nameservers for the domain', 'Reveals mismatches between registry and zone', 'First check when a DNS change has no effect'], faq: [['Why do my DNS changes have no effect?', 'Often the domain is delegated to different nameservers than the ones you edited. This shows which servers are actually authoritative.'], ['How many nameservers should a domain have?', 'At least two, on separate networks, so the domain still resolves if one goes down.']] },
++ spf: { name: 'SPF Record Checker', title: 'SPF Record Checker — Validate Your Email SPF Policy', desc: 'Check and validate a domain\'s SPF record. See which servers may send mail, catch syntax errors and count DNS lookups. Instant.', kw: 'spf record checker, spf validator, check spf, email authentication, spf lookup limit', about: 'Read a domain\'s SPF policy, expand every include, and confirm it stays inside the ten-lookup limit that causes silent failures when exceeded.', bullets: ['Full expansion of includes and redirects', 'Counts DNS lookups against the limit of ten', 'Flags syntax errors and multiple SPF records'], faq: [['What happens if SPF exceeds ten DNS lookups?', 'Receiving servers return a permanent error and may treat your mail as unauthenticated, so legitimate messages can land in spam.'], ['Can I have two SPF records?', 'No. A domain must publish exactly one; two records cause validation to fail entirely.']] },
++ dkim: { name: 'DKIM Record Lookup', title: 'DKIM Record Lookup & Validator — Email Auth Checker', desc: 'Look up and validate DKIM records by selector. Confirm your signing key is published correctly for email authentication. Instant.', kw: 'dkim record lookup, dkim checker, dkim validator, dkim selector, email authentication', about: 'Fetch the DKIM public key for a given selector and confirm it is published and well-formed, so signed mail can be verified by receiving servers.', bullets: ['Selector-based lookup for any domain', 'Validates key format and flags', 'Confirms the record is reachable before you go live'], faq: [['What is a DKIM selector?', 'A label that identifies which key to use, published at selector._domainkey.yourdomain.com. Your mail provider tells you which selector it signs with.'], ['Why is DKIM failing after a provider change?', 'The new provider signs with a different selector and key, so the old record no longer matches. Publish the new one they supply.']] },
++ dmarc: { name: 'DMARC Checker', title: 'DMARC Record Checker — Validate Your DMARC Policy', desc: 'Check a domain\'s DMARC record and policy. See enforcement level, reporting addresses and alignment settings. Instant.', kw: 'dmarc checker, dmarc record lookup, dmarc validator, dmarc policy, email security check', about: 'Read a domain\'s DMARC policy: whether failures are monitored, quarantined or rejected, where reports are sent, and how strictly alignment is enforced.', bullets: ['Policy level, percentage and alignment settings', 'Reporting addresses for aggregate and forensic reports', 'Syntax validation with clear explanations'], faq: [['What DMARC policy should I start with?', 'Start at p=none with a reporting address. That monitors without affecting delivery, so you can find legitimate senders before moving to quarantine and then reject.'], ['Do I need SPF and DKIM for DMARC to work?', 'Yes. DMARC builds on both, and requires that at least one passes and aligns with the visible From domain.']] },
++ ping: { name: 'Ping Test', title: 'Online Ping Test — Check if a Host Is Up', desc: 'Ping any host or IP from multiple global regions to check reachability and latency. Online ping test with no install.', kw: 'ping test, online ping, ping ip, check if server is up, latency test, ping tool', about: 'Send ICMP pings from our servers to check whether a host answers and how long the round trip takes, from several regions at once.', bullets: ['Results from multiple global regions', 'Round-trip time, jitter and packet loss', 'Confirms whether an outage is local to you or global'], faq: [['Why does a site load but not respond to ping?', 'Many hosts and firewalls block ICMP on purpose. A failed ping does not always mean a site is down — check HTTP headers instead.'], ['What is a good ping time?', 'Under 50 ms feels instant, under 100 ms is fine for most uses, and over 200 ms is noticeable in calls and games.']] },
++ traceroute: { name: 'Traceroute', title: 'Online Traceroute — Trace the Network Path to Any Host', desc: 'Run a traceroute from our servers to see every hop between us and a host, with latency per hop. No install required.', kw: 'traceroute online, trace route, network path, tracert online, hop by hop latency', about: 'Map the route packets take to a destination, hop by hop, with timing at each step so you can see where latency is introduced or where the path stops.', bullets: ['Every hop with per-hop latency', 'Reverse DNS names to identify the networks in the path', 'Shows exactly where a broken path terminates'], faq: [['Why do some hops show stars?', 'Those routers are configured not to reply to probes. It is normal and does not mean the path is broken.'], ['How do I read a traceroute?', 'Look for the point where latency jumps sharply or replies stop. The hop before it usually names the network where the trouble starts.']] },
++ mtr: { name: 'MTR Report', title: 'Online MTR — Combined Ping & Traceroute Report', desc: 'Run MTR to combine traceroute and ping into one report with per-hop packet loss and latency over time. Network path analysis.', kw: 'mtr online, mtr report, my traceroute, packet loss test, network path analysis', about: 'MTR repeats a traceroute continuously and aggregates the results, so intermittent packet loss at a single hop shows up clearly instead of hiding behind one lucky probe.', bullets: ['Per-hop loss percentage over many probes', 'Best, average and worst latency for each hop', 'The report network operators ask for in support tickets'], faq: [['Why is MTR better than traceroute for support tickets?', 'It samples repeatedly, so it distinguishes a genuinely lossy hop from a single dropped probe. That is the evidence a network operator needs.'], ['Loss shows at one hop but not later ones — is that a problem?', 'No. That router is just rate-limiting its own replies. Real trouble shows as loss that continues at every hop after it.']] },
++ port: { name: 'Port Checker', title: 'Open Port Checker — Test if a Port Is Open', desc: 'Check whether a TCP port is open on any host, from outside your network. Test common services or any custom port. Instant.', kw: 'port checker, open port test, port scanner online, check port open, tcp port test', about: 'Test whether a port accepts connections from the public internet — the definitive check on whether a port forward, firewall rule or service binding actually works.', bullets: ['Tests from outside your network, as a real client would', 'Common service ports or any custom port', 'Distinguishes closed ports from filtered ones'], faq: [['My service runs but the port shows closed — why?', 'Either a firewall is dropping the traffic, the port forward is missing, or the service is bound to localhost instead of all interfaces.'], ['What is the difference between closed and filtered?', 'Closed means the host actively refused the connection. Filtered means nothing answered at all, which usually indicates a firewall dropping packets silently.']] },
++ headers: { name: 'HTTP Header Checker', title: 'HTTP Header Checker — Inspect Response Headers Online', desc: 'Check the HTTP response headers of any URL, including security, caching and compression headers. Header analysis tool.', kw: 'http header checker, response headers, security headers check, cache headers, view http headers', about: 'Fetch any URL and read the full response headers, with the security and caching headers called out so you can see what a browser is being told to do.', bullets: ['Complete response headers exactly as sent', 'Security header review including HSTS and CSP', 'Cache and compression headers explained'], faq: [['Which security headers should I have?', 'At minimum Strict-Transport-Security, X-Content-Type-Options and a Content-Security-Policy. The report lists what is present and what is missing.'], ['Why is my page not being cached?', 'Look at Cache-Control. A no-store or no-cache directive, or a missing max-age, prevents browsers and CDNs from reusing the response.']] },
++ redirects: { name: 'Redirect Checker', title: 'Redirect Checker — Trace Redirect Chains Online', desc: 'Follow every hop in a redirect chain and see each status code and destination. Find redirect loops and SEO-damaging chains. Instant.', kw: 'redirect checker, redirect chain, 301 checker, url redirect tracer, redirect loop finder', about: 'Follow a URL through every redirect to its final destination, with the status code at each step, so you can spot long chains and loops that waste crawl budget and lose link value.', bullets: ['Every hop with its status code and target', 'Detects loops and unnecessarily long chains', 'Flags temporary redirects used where permanent ones belong'], faq: [['Do redirect chains hurt SEO?', 'Yes. Each extra hop slows the page and search engines limit how many they follow. Point the first URL straight at the final destination.'], ['301 or 302 — which should I use?', 'Use 301 for permanent moves so ranking signals transfer. Use 302 only when the original URL will genuinely return.']] },
++ ssl: { name: 'SSL Certificate Checker', title: 'SSL Certificate Checker — Online TLS & Expiry Test', desc: 'Check any site\'s SSL certificate: expiry date, issuer, chain completeness and supported TLS versions. SSL checker, instant results.', kw: 'ssl checker, ssl certificate checker, tls check, certificate expiry, ssl chain test', about: 'Inspect a site\'s TLS certificate — who issued it, when it expires, whether the chain is complete and which protocol versions the server negotiates.', bullets: ['Expiry date with days remaining', 'Chain validation that catches missing intermediates', 'Issuer, subject and alternative names'], faq: [['My certificate works in Chrome but fails elsewhere — why?', 'Almost always a missing intermediate certificate. Browsers often cache intermediates from other sites; other clients do not. This check shows whether the chain your server sends is complete.'], ['How early should I renew?', 'Automate renewal at around 30 days remaining. Most issuers allow renewal well before expiry.']] },
++ curl: { name: 'Online curl', title: 'Online curl — Web-Based HTTP Request Tester', desc: 'Send HTTP requests from your browser and inspect the full response: status, headers and body. Test APIs without installing anything.', kw: 'online curl, http request tester, api tester online, send http request, rest client online', about: 'Make an HTTP request from our servers and read the complete response. Useful for testing an API from outside your network or from a machine where you cannot install tools.', bullets: ['Any method, with custom headers and body', 'Full response: status, headers and body', 'Requests originate from our servers, not your IP'], faq: [['How is this different from the curl converter?', 'This sends a real request and shows the response. The converter turns a curl command into code without sending anything.'], ['Can I test an internal service?', 'No. Requests come from our servers, so the target must be reachable from the public internet.']] },
++ httpstatus: { name: 'HTTP Status Codes', title: 'HTTP Status Codes — Full Reference & Online Checker', desc: 'Look up what any HTTP status code means and check the code any URL returns. Complete reference from 100 to 599. Instant.', kw: 'http status codes, status code meaning, 404 meaning, 301 vs 302, http response codes list', about: 'A full reference for HTTP status codes with plain-English explanations, plus a live check of what code any URL actually returns.', bullets: ['Every status code with a practical explanation', 'Live check of the code a URL returns', 'Notes on which codes search engines act on'], faq: [['What is the difference between 301 and 302?', '301 is permanent and transfers ranking signals to the new URL. 302 is temporary and tells search engines to keep indexing the original.'], ['Should a missing page return 404 or 410?', '404 means not found and may be retried. 410 means permanently gone and gets pages dropped from an index faster.']] },
++ latency: { name: 'Latency Test', title: 'Latency Test — Measure Response Time to Any Host', desc: 'Measure response times to any host from multiple regions and compare latency worldwide. Online latency and speed check.', kw: 'latency test, response time test, server speed test, ttfb test, network latency check', about: 'Measure how long a host takes to respond from several regions, so you can see where your site feels fast and where it drags.', bullets: ['Response times from multiple global regions', 'Connection versus first-byte timing separated', 'Useful for deciding whether a CDN would help'], faq: [['What is a good time to first byte?', 'Under 200 ms is good, under 500 ms acceptable. Beyond that, visitors notice and search engines record the page as slow.'], ['Why is latency high from one region only?', 'Your server is probably far from it with no edge cache in between. A CDN usually fixes exactly this.']] },
++ blacklist: { name: 'Blacklist Checker', title: 'IP & Domain Blacklist Checker — RBL Lookup', desc: 'Check whether an IP or domain is listed on major email blacklists and RBLs. Find out why your mail is being rejected. Instant.', kw: 'blacklist check, rbl lookup, ip blacklist checker, email blacklist, spam list check', about: 'Query the major real-time blacklists to see whether an address or domain is listed — the usual explanation when mail is being rejected or silently dropped.', bullets: ['Checks many major blacklists in one query', 'Shows which list flagged you and why', 'Includes delisting links where the operator provides them'], faq: [['How do I get removed from a blacklist?', 'Fix the cause first — an open relay, a compromised account or a bad sending pattern — then use the operator\'s delisting form. Requesting removal without fixing the cause gets you relisted.'], ['Does one listing stop all my mail?', 'Not always. Different providers consult different lists, so a single listing often causes partial rather than total failure.']] },
++ reputation: { name: 'Domain Reputation Checker', title: 'Domain & IP Reputation Checker — Online Trust Score', desc: 'Check the reputation of a domain or IP across blacklists, email authentication and security signals. Reputation report.', kw: 'domain reputation, ip reputation checker, email reputation, sender score, domain trust check', about: 'A combined view of the signals that decide whether other systems trust you: blacklist status, email authentication records, certificate health and hosting details.', bullets: ['Blacklist status combined with authentication checks', 'SPF, DKIM and DMARC presence in one report', 'Practical notes on what to fix first'], faq: [['What hurts domain reputation most?', 'Sending mail without SPF, DKIM and DMARC, appearing on blacklists, and hosting alongside abusive neighbours on a shared IP.'], ['How long does reputation take to recover?', 'Weeks of consistent, authenticated sending. There is no way to reset it instantly.']] },
++ smtp: { name: 'SMTP Server Test', title: 'SMTP Server Test — Check Mail Server Connectivity', desc: 'Test an SMTP server\'s connectivity, banner, STARTTLS support and authentication requirements. Online mail server check.', kw: 'smtp test, smtp server check, mail server test, starttls check, smtp connectivity', about: 'Connect to a mail server and report what it says: the greeting banner, the extensions it advertises, whether STARTTLS is offered and whether it accepts mail for a domain.', bullets: ['Connection test with the full server greeting', 'STARTTLS and authentication support detection', 'Checks the common submission ports'], faq: [['Which SMTP port should I use?', 'Port 587 with STARTTLS for sending mail from a client, or 465 for implicit TLS. Port 25 is for server-to-server delivery and is blocked by most consumer ISPs.'], ['What does an open relay mean?', 'A server that accepts mail for domains it does not handle. It will be blacklisted quickly, so this test flags it.']] },
++ uptime: { name: 'Website Uptime Checker', title: 'Website Uptime Checker — Is a Site Down? Online Test', desc: 'Check whether a website is up from multiple regions and see its response time and status code. "Is it down" checker.', kw: 'uptime checker, is this site down, website down checker, site availability test, server status check', about: 'Check a site from several regions at once to settle the "is it down for everyone or just me" question, with status code and response time for each.', bullets: ['Checks from multiple global regions at once', 'Status code and response time per region', 'Distinguishes a genuine outage from a local problem'], faq: [['The site works for me but not for a friend — what now?', 'Run this check. If some regions fail, it is a routing or DNS propagation issue rather than the server being down.'], ['Does this monitor continuously?', 'No, this is an on-demand check. It tells you the state right now.']] },
++ robots: { name: 'Robots.txt Tester', title: 'Robots.txt Tester & Analyzer — Online Checker', desc: 'Fetch and analyse any site\'s robots.txt, check which URLs are blocked, and catch rules that hide your site from search engines.', kw: 'robots.txt tester, robots txt checker, crawl rules, disallow checker, seo crawl test', about: 'Read a site\'s robots.txt, see the rules that apply to each crawler, and test whether a specific URL would be allowed or blocked — the file where an accidental line can remove a whole site from search.', bullets: ['Rules grouped by user-agent', 'Test any URL against the live rules', 'Flags the accidental site-wide disallow'], faq: [['Does robots.txt remove a page from Google?', 'No. It stops crawling, not indexing — a blocked URL can still appear without a description. Use a noindex meta tag to remove a page properly.'], ['Should robots.txt list my sitemap?', 'Yes. A Sitemap line is the simplest way to point every crawler at your sitemap without registering anywhere.']] },
++ sitemap: { name: 'Sitemap Validator', title: 'Sitemap.xml Validator — Online XML Sitemap Checker', desc: 'Validate an XML sitemap, check its structure and URL count, and catch errors that stop search engines indexing your pages.', kw: 'sitemap validator, sitemap.xml checker, xml sitemap test, sitemap errors, seo sitemap check', about: 'Fetch and validate a sitemap against the protocol: structure, URL count, lastmod formatting and index files, so you can be sure crawlers can actually read it.', bullets: ['Structure and schema validation', 'URL count against the 50,000 entry limit', 'Follows sitemap index files to their children'], faq: [['How many URLs can one sitemap hold?', '50,000 URLs or 50 MB uncompressed. Beyond that, split it and reference the parts from a sitemap index.'], ['Does lastmod matter?', 'Yes, when it is accurate. Crawlers use it to prioritise re-crawling, but they learn to ignore it if every URL claims to have changed today.']] },
};
const CATALOG = new Map();
ddiff --git a/apps/gateway/server/seo/render.js b/apps/gateway/server/seo/render.js
iindex 80f1a8b..ee97f65 100644
---- a/apps/gateway/server/seo/render.js
++++ b/apps/gateway/server/seo/render.js
@@@ -34,8 +34,6 @@ function jsonLd(rec, url, related) {
'@context': 'https://schema.org', '@type': 'SoftwareApplication',
name: rec.name, url, applicationCategory: 'DeveloperApplication',
operatingSystem: 'Any (web browser)', description: rec.desc,
-- offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
-- isAccessibleForFree: true,
publisher: { '@type': 'Organization', name: BRAND, url: SITE },
featureList: rec.bullets || undefined,
};
@@@ -76,7 +74,7 @@ function contentBlock(rec, related) {
${(rec.bullets || []).length ? `<ul class="seo-features">${rec.bullets.map(b => `<li>${esc(b)}</li>`).join('')}</ul>` : ''}
${(rec.faq || []).length ? `<h2>Frequently asked questions</h2><dl class="seo-faq">${rec.faq.map(([q, a]) => `<dt>${esc(q)}</dt><dd>${esc(a)}</dd>`).join('')}</dl>` : ''}
${related.length ? `<h2>Related tools</h2><ul class="seo-related">${related.map(r => `<li><a href="https://${esc(r.sub)}.openvibe.tools"><strong>${esc(r.name)}</strong><span>${esc(r.desc)}</span></a></li>`).join('')}</ul>` : ''}
-- <p class="seo-hub"><a href="${hubUrl}">Browse all free ${hubName}</a> · <a href="${SITE}">${BRAND} home</a> · <a href="https://openvibe.live">Live streaming</a></p>
++ <p class="seo-hub"><a href="${hubUrl}">Browse all ${hubName}</a> · <a href="${SITE}">${BRAND} home</a> · <a href="https://openvibe.live">Live streaming</a></p>
</div>
</section>
<style>
ddiff --git a/apps/img/public/index.html b/apps/img/public/index.html
iindex 8b678a6..68e76ad 100644
---- a/apps/img/public/index.html
++++ b/apps/img/public/index.html
@@@ -3,9 +3,9 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>Img.OpenVibe — Free Online Image Converter & Tools</title>
-- <meta name="description" content="Convert, compress, resize, and crop images online for free. Supports PNG, JPG, WebP, AVIF, HEIC, SVG, GIF, ICO, TIFF, BMP and more.">
-- <meta property="og:title" content="Img.OpenVibe — Free Online Image Converter & Tools">
++ <title>Img.OpenVibe — Online Image Converter & Tools</title>
++ <meta name="description" content="Convert, compress, resize, and crop images online. Supports PNG, JPG, WebP, AVIF, HEIC, SVG, GIF, ICO, TIFF, BMP and more.">
++ <meta property="og:title" content="Img.OpenVibe — Online Image Converter & Tools">
<meta property="og:type" content="website">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@@ -28,7 +28,7 @@
<section class="hero" id="hero">
<div class="hero-icon" id="hero-icon"><i class="fa-solid fa-images"></i></div>
<h1 id="hero-title">Img.OpenVibe</h1>
-- <p class="hero-subtitle" id="hero-subtitle">Free Online Image Converter & Tools</p>
++ <p class="hero-subtitle" id="hero-subtitle">Online Image Converter & Tools</p>
</section>
<!-- Tool Selector (visible on hub domain) -->
ddiff --git a/apps/img/public/js/app.js b/apps/img/public/js/app.js
iindex 88cf5f7..e4898e4 100644
---- a/apps/img/public/js/app.js
++++ b/apps/img/public/js/app.js
@@@ -68,18 +68,18 @@
// ── Branding ─────────────────────────────────────────────
function applyBranding() {
-- document.title = ctx.seoTitle || `${ctx.brandName} — Free Image Tools`;
++ document.title = ctx.seoTitle || `${ctx.brandName} — Image Tools`;
heroIcon.innerHTML = `<i class="fa-solid ${ctx.faIcon || 'fa-images'}"></i>`;
heroTitle.textContent = ctx.brandName || 'Img.OpenVibe';
// Set subtitle based on tool
const subtitles = {
-- hub: 'Free Online Image Converter & Tools',
-- convert: 'Free Online Image Format Converter',
-- compress: 'Free Online Image Compressor',
-- resize: 'Free Online Image Resizer',
-- crop: 'Free Online Image Cropper',
-- favicon: 'Free Online Favicon Generator',
++ hub: 'Online Image Converter & Tools',
++ convert: 'Online Image Format Converter',
++ compress: 'Online Image Compressor',
++ resize: 'Online Image Resizer',
++ crop: 'Online Image Cropper',
++ favicon: 'Online Favicon Generator',
};
heroSubtitle.textContent = subtitles[ctx.toolId] || ctx.seoDescription || subtitles.hub;
ddiff --git a/apps/img/server/domain-map.js b/apps/img/server/domain-map.js
iindex 7f6bd40..d4abcbf 100644
---- a/apps/img/server/domain-map.js
++++ b/apps/img/server/domain-map.js
@@@ -11,113 +11,113 @@ const DOMAIN_MAP = {
'img.openvibe.tools': {
toolId: 'hub', brandName: 'Img.OpenVibe', defaultOp: 'convert',
faIcon: 'fa-images',
-- seoTitle: 'Img.OpenVibe — Free Online Image Converter & Tools',
-- seoDescription: 'Convert, compress, resize, and crop images online for free. Supports PNG, JPG, WebP, AVIF, HEIC, SVG, GIF, ICO, TIFF, BMP and more.',
++ seoTitle: 'Img.OpenVibe — Online Image Converter & Tools',
++ seoDescription: 'Convert, compress, resize, and crop images online. Supports PNG, JPG, WebP, AVIF, HEIC, SVG, GIF, ICO, TIFF, BMP and more.',
},
// ── Format-specific ──────────────────────────────────────
'png.openvibe.tools': {
toolId: 'png', brandName: 'OpenVibePNG', defaultOp: 'convert', defaultFormat: 'png',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibePNG — Convert Images to PNG Online Free',
-- seoDescription: 'Convert JPG, WebP, AVIF, HEIC, GIF, BMP, TIFF and more to PNG format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibePNG — Convert Images to PNG Online',
++ seoDescription: 'Convert JPG, WebP, AVIF, HEIC, GIF, BMP, TIFF and more to PNG format online. Fast, no sign-up required.',
},
'jpg.openvibe.tools': {
toolId: 'jpg', brandName: 'OpenVibeJPG', defaultOp: 'convert', defaultFormat: 'jpg',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeJPG — Convert Images to JPG Online Free',
-- seoDescription: 'Convert PNG, WebP, AVIF, HEIC, GIF, BMP, TIFF and more to JPG format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeJPG — Convert Images to JPG Online',
++ seoDescription: 'Convert PNG, WebP, AVIF, HEIC, GIF, BMP, TIFF and more to JPG format online. Fast, no sign-up required.',
},
'jpeg.openvibe.tools': {
toolId: 'jpg', brandName: 'OpenVibeJPG', defaultOp: 'convert', defaultFormat: 'jpg',
faIcon: 'fa-file-image', alias: 'jpg.openvibe.tools',
-- seoTitle: 'OpenVibeJPG — Convert Images to JPEG Online Free',
-- seoDescription: 'Convert any image to JPEG format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeJPG — Convert Images to JPEG Online',
++ seoDescription: 'Convert any image to JPEG format online. Fast, no sign-up required.',
},
'webp.openvibe.tools': {
toolId: 'webp', brandName: 'OpenVibeWebP', defaultOp: 'convert', defaultFormat: 'webp',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeWebP — Convert Images to WebP Online Free',
++ seoTitle: 'OpenVibeWebP — Convert Images to WebP Online',
seoDescription: 'Convert PNG, JPG, AVIF, HEIC, GIF, BMP, TIFF and more to WebP format. Smaller file sizes with great quality.',
},
'avif.openvibe.tools': {
toolId: 'avif', brandName: 'OpenVibeAVIF', defaultOp: 'convert', defaultFormat: 'avif',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeAVIF — Convert Images to AVIF Online Free',
++ seoTitle: 'OpenVibeAVIF — Convert Images to AVIF Online',
seoDescription: 'Convert images to AVIF format for superior compression. Supports PNG, JPG, WebP, HEIC, TIFF, BMP, GIF input.',
},
'heic.openvibe.tools': {
toolId: 'heic', brandName: 'OpenVibeHEIC', defaultOp: 'convert', defaultFormat: 'png',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeHEIC — Convert HEIC/HEIF Images Online Free',
-- seoDescription: 'Convert HEIC and HEIF photos from iPhone to PNG, JPG, WebP and more. Free, fast, works in your browser.',
++ seoTitle: 'OpenVibeHEIC — Convert HEIC/HEIF Images Online',
++ seoDescription: 'Convert HEIC and HEIF photos from iPhone to PNG, JPG, WebP and more. Fast, works in your browser.',
},
'heif.openvibe.tools': {
toolId: 'heic', brandName: 'OpenVibeHEIC', defaultOp: 'convert', defaultFormat: 'png',
faIcon: 'fa-file-image', alias: 'heic.openvibe.tools',
-- seoTitle: 'OpenVibeHEIC — Convert HEIF Images Online Free',
-- seoDescription: 'Convert HEIF photos to PNG, JPG, WebP and more. Free, fast, works in your browser.',
++ seoTitle: 'OpenVibeHEIC — Convert HEIF Images Online',
++ seoDescription: 'Convert HEIF photos to PNG, JPG, WebP and more. Fast, works in your browser.',
},
'svg.openvibe.tools': {
toolId: 'svg', brandName: 'OpenVibeSVG', defaultOp: 'convert', defaultFormat: 'png',
faIcon: 'fa-bezier-curve',
-- seoTitle: 'OpenVibeSVG — Convert SVG Images Online Free',
-- seoDescription: 'Convert SVG to PNG, JPG, WebP. Convert bitmap images to SVG vector traces. Free online SVG converter.',
++ seoTitle: 'OpenVibeSVG — Convert SVG Images Online',
++ seoDescription: 'Convert SVG to PNG, JPG, WebP. Convert bitmap images to SVG vector traces. Online SVG converter.',
},
'gif.openvibe.tools': {
toolId: 'gif', brandName: 'OpenVibeGIF', defaultOp: 'convert', defaultFormat: 'gif',
faIcon: 'fa-film',
-- seoTitle: 'OpenVibeGIF — Convert Images to GIF Online Free',
-- seoDescription: 'Convert images to and from GIF format online. Free, fast, no sign-up required.',
++ seoTitle: 'OpenVibeGIF — Convert Images to GIF Online',
++ seoDescription: 'Convert images to and from GIF format online. Fast, no sign-up required.',
},
'ico.openvibe.tools': {
toolId: 'ico', brandName: 'OpenVibeICO', defaultOp: 'convert', defaultFormat: 'ico',
faIcon: 'fa-icons',
-- seoTitle: 'OpenVibeICO — Create ICO Favicons Online Free',
++ seoTitle: 'OpenVibeICO — Create ICO Favicons Online',
seoDescription: 'Convert PNG, JPG, SVG images to ICO favicon format. Multi-size ICO generation for websites.',
},
'tiff.openvibe.tools': {
toolId: 'tiff', brandName: 'OpenVibeTIFF', defaultOp: 'convert', defaultFormat: 'tiff',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeTIFF — Convert Images to TIFF Online Free',
++ seoTitle: 'OpenVibeTIFF — Convert Images to TIFF Online',
seoDescription: 'Convert PNG, JPG, WebP and more to TIFF format. High-quality lossless conversion for print and archival.',
},
'bmp.openvibe.tools': {
toolId: 'bmp', brandName: 'OpenVibeBMP', defaultOp: 'convert', defaultFormat: 'bmp',
faIcon: 'fa-file-image',
-- seoTitle: 'OpenVibeBMP — Convert Images to BMP Online Free',
-- seoDescription: 'Convert images to and from BMP bitmap format online. Free and fast.',
++ seoTitle: 'OpenVibeBMP — Convert Images to BMP Online',
++ seoDescription: 'Convert images to and from BMP bitmap format online. Fast.',
},
// ── Utility tools ────────────────────────────────────────
'compress.openvibe.tools': {
toolId: 'compress', brandName: 'OpenVibeCompress', defaultOp: 'compress',
faIcon: 'fa-compress',
-- seoTitle: 'OpenVibeCompress — Compress Images Online Free',
-- seoDescription: 'Reduce image file size without losing quality. Compress PNG, JPG, WebP, AVIF images online for free.',
++ seoTitle: 'OpenVibeCompress — Compress Images Online',
++ seoDescription: 'Reduce image file size without losing quality. Compress PNG, JPG, WebP, AVIF images online.',
},
'resize.openvibe.tools': {
toolId: 'resize', brandName: 'OpenVibeResize', defaultOp: 'resize',
faIcon: 'fa-up-right-and-down-left-from-center',
-- seoTitle: 'OpenVibeResize — Resize Images Online Free',
-- seoDescription: 'Resize images to any dimension. Scale by pixels, percentage, or fit mode. Free online image resizer.',
++ seoTitle: 'OpenVibeResize — Resize Images Online',
++ seoDescription: 'Resize images to any dimension. Scale by pixels, percentage, or fit mode. Online image resizer.',
},
'crop.openvibe.tools': {
toolId: 'crop', brandName: 'OpenVibeCrop', defaultOp: 'crop',
faIcon: 'fa-crop-simple',
-- seoTitle: 'OpenVibeCrop — Crop Images Online Free',
-- seoDescription: 'Crop images by custom dimensions or preset aspect ratios (16:9, 4:3, 1:1). Free online image cropper.',
++ seoTitle: 'OpenVibeCrop — Crop Images Online',
++ seoDescription: 'Crop images by custom dimensions or preset aspect ratios (16:9, 4:3, 1:1). Online image cropper.',
},
'convert.openvibe.tools': {
toolId: 'convert', brandName: 'OpenVibeConvert', defaultOp: 'convert',
faIcon: 'fa-arrows-rotate',
-- seoTitle: 'OpenVibeConvert — Convert Image Formats Online Free',
++ seoTitle: 'OpenVibeConvert — Convert Image Formats Online',
seoDescription: 'Convert between 14+ image formats: PNG, JPG, WebP, AVIF, HEIC, SVG, GIF, ICO, TIFF, BMP and more.',
},
'favicon.openvibe.tools': {
toolId: 'favicon', brandName: 'OpenVibeFavicon', defaultOp: 'convert', defaultFormat: 'ico',
faIcon: 'fa-icons',
-- seoTitle: 'OpenVibeFavicon — Generate Favicons Online Free',
++ seoTitle: 'OpenVibeFavicon — Generate Favicons Online',
seoDescription: 'Create multi-size favicons (ICO, PNG, SVG) from any image. Perfect favicons for your website.',
},
};
ddiff --git a/apps/text/public/index.html b/apps/text/public/index.html
iindex 287c520..acaa6d0 100644
---- a/apps/text/public/index.html
++++ b/apps/text/public/index.html
@@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Text.OpenVibe — Fancy Text, Unicode, Symbols & More | openvibe.tools</title>
-- <meta name="description" content="Free text tools: fancy Unicode fonts, Zalgo glitch text, ASCII art, symbols, kaomoji, case converters, bio generators, and more. Part of the OpenVibe Network.">
++ <meta name="description" content="Text tools: fancy Unicode fonts, Zalgo glitch text, ASCII art, symbols, kaomoji, case converters, bio generators, and more. Part of the OpenVibe Network.">
<meta name="theme-color" content="#0b0c12">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@@ -23,9 +23,9 @@
<body>
<div class="hub-hero">
<h1><i class="fas fa-font"></i> Text.OpenVibe</h1>
-- <p class="hero-sub">Free text tools for streamers, creators, and internet wanderers. Fancy fonts, glitch text, ASCII art, symbols, and more — all in your browser.</p>
++ <p class="hero-sub">Text tools for streamers, creators, and internet wanderers. Fancy fonts, glitch text, ASCII art, symbols, and more — all in your browser.</p>
<div class="hero-tags">
-- <span class="hero-tag">100% Free</span>
++ <span class="hero-tag">Open source</span>
<span class="hero-tag">No Sign-Up</span>
<span class="hero-tag">Client-Side</span>
<span class="hero-tag">Part of the OpenVibe Network</span>
@@@ -213,7 +213,7 @@
<i class="fas fa-network-wired"></i>
<div class="ic-text">
<h3>Part of the OpenVibe Network</h3>
-- <p>Free tools by streamers, for streamers. Text, images, audio, streaming — all connected.</p>
++ <p>Tools by streamers, for streamers. Text, images, audio, streaming — all connected.</p>
</div>
<div class="ic-links">
<a href="https://openvibe.network" class="btn btn-secondary btn-sm"><i class="fas fa-globe"></i> openvibe.tools</a>
@@@ -231,7 +231,7 @@
<a href="https://img.openvibe.tools">Img.OpenVibe</a>
<a href="https://audio.openvibe.tools">Audio.OpenVibe</a>
</div>
-- <p>&copy; 2025 OpenVibe — Free tools for the internet.</p>
++ <p>&copy; OpenVibe — tools for the internet, run by its community.</p>
</footer>
</div>
ddiff --git a/apps/text/public/json.html b/apps/text/public/json.html
iindex b33cbf7..de3e4dc 100644
---- a/apps/text/public/json.html
++++ b/apps/text/public/json.html
@@@ -50,7 +50,7 @@
<div class="json-grid">
<div class="json-pane">
<label><i class="fas fa-keyboard"></i> Input</label>
-- <textarea id="input" class="mono" placeholder='Paste your JSON here...' autofocus>{"name":"OpenVibe","services":["OpenVibe.Live","Scraplandia","Img.OpenVibe","Audio.OpenVibe","Text.OpenVibe"],"stats":{"tools":118,"themes":34,"free":true},"nested":{"deep":{"value":[1,2,3]}}}</textarea>
++ <textarea id="input" class="mono" placeholder='Paste your JSON here...' autofocus>{"name":"OpenVibe","services":["OpenVibe.Live","Scraplandia","Img.OpenVibe","Audio.OpenVibe","Text.OpenVibe"],"stats":{"tools":118,"themes":34,"openSource":true},"nested":{"deep":{"value":[1,2,3]}}}</textarea>
</div>
<div class="json-pane">
<label><i class="fas fa-eye"></i> Output</label>
ddiff --git a/apps/text/public/logo-hub.html b/apps/text/public/logo-hub.html
iindex fbf34fc..a8d1961 100644
---- a/apps/text/public/logo-hub.html
++++ b/apps/text/public/logo-hub.html
@@@ -3,8 +3,8 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>Logo.OpenVibe — Free Logo, Title Card & Badge Maker | openvibe.tools</title>
-- <meta name="description" content="Create logos, title cards, wordmarks, badges, stickers, watermarks, and thumbnails. Transparent PNG export, Google Fonts, presets. Free and browser-based.">
++ <title>Logo.OpenVibe — Logo, Title Card & Badge Maker | openvibe.tools</title>
++ <meta name="description" content="Create logos, title cards, wordmarks, badges, stickers, watermarks, and thumbnails. Transparent PNG export, Google Fonts, presets. Browser-based.">
<meta name="theme-color" content="#0b0c12">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@@ -23,12 +23,12 @@
<body>
<div class="hub-hero">
<h1><i class="fas fa-palette"></i> Logo.OpenVibe</h1>
-- <p class="hero-sub">Free logo and design tools for streamers and creators. Title cards, wordmarks, badges, watermarks, thumbnails — all in your browser with transparent PNG export.</p>
++ <p class="hero-sub">Logo and design tools for streamers and creators. Title cards, wordmarks, badges, watermarks, thumbnails — all in your browser with transparent PNG export.</p>
<div class="hero-tags">
<span class="hero-tag">Transparent PNG</span>
<span class="hero-tag">Google Fonts</span>
<span class="hero-tag">No Watermarks</span>
-- <span class="hero-tag">100% Free</span>
++ <span class="hero-tag">Open source</span>
</div>
</div>
@@@ -111,7 +111,7 @@
<i class="fas fa-network-wired"></i>
<div class="ic-text">
<h3>Part of the OpenVibe Network</h3>
-- <p>Free tools by streamers, for streamers. Text, images, audio, streaming — all connected.</p>
++ <p>Tools by streamers, for streamers. Text, images, audio, streaming — all connected.</p>
</div>
<div class="ic-links">
<a href="https://openvibe.network" class="btn btn-secondary btn-sm"><i class="fas fa-globe"></i> openvibe.tools</a>
@@@ -128,7 +128,7 @@
<a href="https://audio.openvibe.tools">Audio.OpenVibe</a>
<a href="https://openvibe.live">OpenVibe.Live</a>
</div>
-- <p>&copy; 2025 OpenVibe — Free tools for the internet.</p>
++ <p>&copy; OpenVibe — tools for the internet, run by its community.</p>
</footer>
</div>
ddiff --git a/apps/text/public/peso.html b/apps/text/public/peso.html
iindex a0cfa8e..14b4087 100644
---- a/apps/text/public/peso.html
++++ b/apps/text/public/peso.html
@@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Peso ↔ Dollar Converter | peso.openvibe.tools</title>
-- <meta name="description" content="Convert between Mexican Pesos (MXN) and US Dollars (USD) with live exchange rates. Fast, free and no signup.">
++ <meta name="description" content="Convert between Mexican Pesos (MXN) and US Dollars (USD) with live exchange rates. Fast, no signup.">
<meta name="theme-color" content="#0b0c12">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
ddiff --git a/apps/text/server/seo.js b/apps/text/server/seo.js
iindex b172d7b..51507fb 100644
---- a/apps/text/server/seo.js
++++ b/apps/text/server/seo.js
@@@ -52,8 +52,6 @@ function renderPage(file, primaryHost) {
'@context': 'https://schema.org', '@type': 'WebApplication',
name, url, description: desc,
applicationCategory: 'UtilitiesApplication', operatingSystem: 'Any (web browser)',
-- offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
-- isAccessibleForFree: true,
publisher: { '@type': 'Organization', name: 'OpenVibe', url: 'https://openvibe.tools' },
},
{
ddiff --git a/apps/yt/public/index.html b/apps/yt/public/index.html
iindex 439cabe..73b840d 100644
---- a/apps/yt/public/index.html
++++ b/apps/yt/public/index.html
@@@ -3,8 +3,8 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-- <title>YT.OpenVibe — Free YouTube Downloader</title>
-- <meta name="description" content="Download YouTube videos and audio for free. MP4, WebM, MP3, M4A, OPUS, FLAC. No sign-up required.">
++ <title>YT.OpenVibe — YouTube Downloader</title>
++ <meta name="description" content="Download YouTube videos and audio. MP4, WebM, MP3, M4A, OPUS, FLAC. No sign-up required.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Critical theme bootstrap (ov-theme-boot) — MUST stay inline and above the stylesheets.
@@@ -26,7 +26,7 @@
<section class="hero">
<div class="hero-icon"><i class="fa-solid fa-circle-play"></i></div>
<h1>YT.OpenVibe</h1>
-- <p class="hero-subtitle">Free YouTube Downloader</p>
++ <p class="hero-subtitle">YouTube Downloader</p>
</section>
<!-- URL Input -->