#computervision — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #computervision, aggregated by home.social.
-
Privacy-focused, open-source Raspberry Pi Zero 2W DIY security camera offers end-to-end encryption, on-device AI
-
China integriert generative KI-Modelle in sein landesweites Kamerasystem zur automatisierten Text-Prompt-Auswertung von Videomaterial.
Hikvision und Huawei verlagern Computer Vision via AI PCs lokal auf Kameras. Predictive Policing rückt in den Fokus, indem LLMs Verhaltensmuster für umfassende Personenprofile in Echtzeit analysieren, anstatt auf nachträgliche Identifikation zu setzen.
#Surveillance #ComputerVision #EdgeComputing #PredictivePolicing #AIGeneratedImage
https://www.all-ai.de/news/beitrage2026/china-minority-report-wahr-1
-
China integriert generative KI-Modelle in sein landesweites Kamerasystem zur automatisierten Text-Prompt-Auswertung von Videomaterial.
Hikvision und Huawei verlagern Computer Vision via AI PCs lokal auf Kameras. Predictive Policing rückt in den Fokus, indem LLMs Verhaltensmuster für umfassende Personenprofile in Echtzeit analysieren, anstatt auf nachträgliche Identifikation zu setzen.
#Surveillance #ComputerVision #EdgeComputing #PredictivePolicing #AIGeneratedImage
https://www.all-ai.de/news/beitrage2026/china-minority-report-wahr-1
-
China integriert generative KI-Modelle in sein landesweites Kamerasystem zur automatisierten Text-Prompt-Auswertung von Videomaterial.
Hikvision und Huawei verlagern Computer Vision via AI PCs lokal auf Kameras. Predictive Policing rückt in den Fokus, indem LLMs Verhaltensmuster für umfassende Personenprofile in Echtzeit analysieren, anstatt auf nachträgliche Identifikation zu setzen.
#Surveillance #ComputerVision #EdgeComputing #PredictivePolicing #AIGeneratedImage
https://www.all-ai.de/news/beitrage2026/china-minority-report-wahr-1
-
Build a Live Object Detection App for the Reachy Mini With TensorFlow and PyCharm
#Pycharm #Datascience #Tutorials #Computervision #Objectdetection #Python #Tensorflow -
Build a Live Object Detection App for the Reachy Mini With TensorFlow and PyCharm
#Pycharm #Datascience #Tutorials #Computervision #Objectdetection #Python #Tensorflow -
Build a Live Object Detection App for the Reachy Mini With TensorFlow and PyCharm
#Pycharm #Datascience #Tutorials #Computervision #Objectdetection #Python #Tensorflow -
Build a Live Object Detection App for the Reachy Mini With TensorFlow and PyCharm
#Pycharm #Datascience #Tutorials #Computervision #Objectdetection #Python #Tensorflow -
Build a Live Object Detection App for the Reachy Mini With TensorFlow and PyCharm
#Pycharm #Datascience #Tutorials #Computervision #Objectdetection #Python #Tensorflow -
Six new models of OV5647 5-Megapixel cameras with adjustable lenses for ESP32-P4-DevKit and ESP32-P4-PC are in stock. NV suffix version is with IR cut-off filter removed for night vision apps. https://olimex.wordpress.com/2026/05/25/six-new-models-of-ov5647-5-megapixel-cameras-with-adjustable-lenses-for-esp32-p4-devkit-and-esp32-p4-pc-are-in-stock/ #esp32p4 #ov5647 #computervision #iot #mipi #csi #raspberrypi
-
Six new models of OV5647 5-Megapixel cameras with adjustable lenses for ESP32-P4-DevKit and ESP32-P4-PC are in stock. NV suffix version is with IR cut-off filter removed for night vision apps. https://olimex.wordpress.com/2026/05/25/six-new-models-of-ov5647-5-megapixel-cameras-with-adjustable-lenses-for-esp32-p4-devkit-and-esp32-p4-pc-are-in-stock/ #esp32p4 #ov5647 #computervision #iot #mipi #csi #raspberrypi
-
Six new models of OV5647 5-Megapixel cameras with adjustable lenses for ESP32-P4-DevKit and ESP32-P4-PC are in stock. NV suffix version is with IR cut-off filter removed for night vision apps. https://olimex.wordpress.com/2026/05/25/six-new-models-of-ov5647-5-megapixel-cameras-with-adjustable-lenses-for-esp32-p4-devkit-and-esp32-p4-pc-are-in-stock/ #esp32p4 #ov5647 #computervision #iot #mipi #csi #raspberrypi
-
Six new models of OV5647 5-Megapixel cameras with adjustable lenses for ESP32-P4-DevKit and ESP32-P4-PC are in stock. NV suffix version is with IR cut-off filter removed for night vision apps. https://olimex.wordpress.com/2026/05/25/six-new-models-of-ov5647-5-megapixel-cameras-with-adjustable-lenses-for-esp32-p4-devkit-and-esp32-p4-pc-are-in-stock/ #esp32p4 #ov5647 #computervision #iot #mipi #csi #raspberrypi
-
Six new models of OV5647 5-Megapixel cameras with adjustable lenses for ESP32-P4-DevKit and ESP32-P4-PC are in stock. NV suffix version is with IR cut-off filter removed for night vision apps. https://olimex.wordpress.com/2026/05/25/six-new-models-of-ov5647-5-megapixel-cameras-with-adjustable-lenses-for-esp32-p4-devkit-and-esp32-p4-pc-are-in-stock/ #esp32p4 #ov5647 #computervision #iot #mipi #csi #raspberrypi
-
Tornare da un viaggio significa quasi sempre ritrovarsi con una quantità ingestibile di foto. Nel caso di Lisbona, il problema non era tanto archiviare gli scatti, quanto riuscire a estrarne una ventina davvero condivisibile: belle, sì, ma anche varie e capaci di raccontare l’esperienza nel suo insieme. PhotoPrism offriva già un’ottima base grazie a geolocalizzazione, riconoscimento facciale, label e strumenti di organizzazione, ma non aveva ancora un modo per comporre automaticamente un album con “le foto più belle” e soprattutto con sufficiente varietà.
Da qui è nata l’idea di un selezionatore AI: una piccola applicazione Java che usa PhotoPrism per recuperare le miniature delle immagini e Ollama per far lavorare due modelli AI, uno multimodale per assegnare un punteggio estetico e produrre una descrizione oggettiva, e un secondo modello testuale per raggruppare semanticamente le foto e selezionarle con più equilibrio.
Il problema vero non era la qualità
Il primo prototipo faceva una cosa molto semplice: prendere le foto da PhotoPrism, inviarle a un modello multimodale su Ollama e chiedere un voto estetico da 1 a 100 insieme a una breve descrizione. Sulla carta sembrava sufficiente, ma in pratica produceva una selezione monotona: immagini molto belle singolarmente, ma spesso troppo simili tra loro.
Era il classico caso in cui un ranking puro ottimizza la qualità locale ma non la copertura narrativa. Se cinque foto dello stesso scorcio o dello stesso momento ricevono voti alti, un algoritmo ingenuo tende a sceglierle tutte. Per costruire un album da condividere, invece, non basta premiare le immagini migliori: bisogna anche evitare la ripetizione.
[…]
#ai #albumFotografici #clusteringSemantico #computerVision #fotografia #java #Maven #multimodalAI #ollama #organizzazioneFoto #photoprism #PhotoPrismAPI #selezioneFoto #selfHosted https://www.b0sh.net/2026/05/ho-costruito-un-selezionatore-ai-per-scegliere-le-foto-migliori-da-photoprism/ -
Tornare da un viaggio significa quasi sempre ritrovarsi con una quantità ingestibile di foto. Nel caso di Lisbona, il problema non era tanto archiviare gli scatti, quanto riuscire a estrarne una ventina davvero condivisibile: belle, sì, ma anche varie e capaci di raccontare l’esperienza nel suo insieme. PhotoPrism offriva già un’ottima base grazie a geolocalizzazione, riconoscimento facciale, label e strumenti di organizzazione, ma non aveva ancora un modo per comporre automaticamente un album con “le foto più belle” e soprattutto con sufficiente varietà.
Da qui è nata l’idea di un selezionatore AI: una piccola applicazione Java che usa PhotoPrism per recuperare le miniature delle immagini e Ollama per far lavorare due modelli AI, uno multimodale per assegnare un punteggio estetico e produrre una descrizione oggettiva, e un secondo modello testuale per raggruppare semanticamente le foto e selezionarle con più equilibrio.
Il problema vero non era la qualità
Il primo prototipo faceva una cosa molto semplice: prendere le foto da PhotoPrism, inviarle a un modello multimodale su Ollama e chiedere un voto estetico da 1 a 100 insieme a una breve descrizione. Sulla carta sembrava sufficiente, ma in pratica produceva una selezione monotona: immagini molto belle singolarmente, ma spesso troppo simili tra loro.
Era il classico caso in cui un ranking puro ottimizza la qualità locale ma non la copertura narrativa. Se cinque foto dello stesso scorcio o dello stesso momento ricevono voti alti, un algoritmo ingenuo tende a sceglierle tutte. Per costruire un album da condividere, invece, non basta premiare le immagini migliori: bisogna anche evitare la ripetizione.
[…]
#ai #albumFotografici #clusteringSemantico #computerVision #fotografia #java #Maven #multimodalAI #ollama #organizzazioneFoto #photoprism #PhotoPrismAPI #selezioneFoto #selfHosted https://www.b0sh.net/2026/05/ho-costruito-un-selezionatore-ai-per-scegliere-le-foto-migliori-da-photoprism/ -
Tornare da un viaggio significa quasi sempre ritrovarsi con una quantità ingestibile di foto. Nel caso di Lisbona, il problema non era tanto archiviare gli scatti, quanto riuscire a estrarne una ventina davvero condivisibile: belle, sì, ma anche varie e capaci di raccontare l’esperienza nel suo insieme. PhotoPrism offriva già un’ottima base grazie a geolocalizzazione, riconoscimento facciale, label e strumenti di organizzazione, ma non aveva ancora un modo per comporre automaticamente un album con “le foto più belle” e soprattutto con sufficiente varietà.
Da qui è nata l’idea di un selezionatore AI: una piccola applicazione Java che usa PhotoPrism per recuperare le miniature delle immagini e Ollama per far lavorare due modelli AI, uno multimodale per assegnare un punteggio estetico e produrre una descrizione oggettiva, e un secondo modello testuale per raggruppare semanticamente le foto e selezionarle con più equilibrio.
Il problema vero non era la qualità
Il primo prototipo faceva una cosa molto semplice: prendere le foto da PhotoPrism, inviarle a un modello multimodale su Ollama e chiedere un voto estetico da 1 a 100 insieme a una breve descrizione. Sulla carta sembrava sufficiente, ma in pratica produceva una selezione monotona: immagini molto belle singolarmente, ma spesso troppo simili tra loro.
Era il classico caso in cui un ranking puro ottimizza la qualità locale ma non la copertura narrativa. Se cinque foto dello stesso scorcio o dello stesso momento ricevono voti alti, un algoritmo ingenuo tende a sceglierle tutte. Per costruire un album da condividere, invece, non basta premiare le immagini migliori: bisogna anche evitare la ripetizione.
[…]
#ai #albumFotografici #clusteringSemantico #computerVision #fotografia #java #Maven #multimodalAI #ollama #organizzazioneFoto #photoprism #PhotoPrismAPI #selezioneFoto #selfHosted https://www.b0sh.net/2026/05/ho-costruito-un-selezionatore-ai-per-scegliere-le-foto-migliori-da-photoprism/ -
Tornare da un viaggio significa quasi sempre ritrovarsi con una quantità ingestibile di foto. Nel caso di Lisbona, il problema non era tanto archiviare gli scatti, quanto riuscire a estrarne una ventina davvero condivisibile: belle, sì, ma anche varie e capaci di raccontare l’esperienza nel suo insieme. PhotoPrism offriva già un’ottima base grazie a geolocalizzazione, riconoscimento facciale, label e strumenti di organizzazione, ma non aveva ancora un modo per comporre automaticamente un album con “le foto più belle” e soprattutto con sufficiente varietà.
Da qui è nata l’idea di un selezionatore AI: una piccola applicazione Java che usa PhotoPrism per recuperare le miniature delle immagini e Ollama per far lavorare due modelli AI, uno multimodale per assegnare un punteggio estetico e produrre una descrizione oggettiva, e un secondo modello testuale per raggruppare semanticamente le foto e selezionarle con più equilibrio.
Il problema vero non era la qualità
Il primo prototipo faceva una cosa molto semplice: prendere le foto da PhotoPrism, inviarle a un modello multimodale su Ollama e chiedere un voto estetico da 1 a 100 insieme a una breve descrizione. Sulla carta sembrava sufficiente, ma in pratica produceva una selezione monotona: immagini molto belle singolarmente, ma spesso troppo simili tra loro.
Era il classico caso in cui un ranking puro ottimizza la qualità locale ma non la copertura narrativa. Se cinque foto dello stesso scorcio o dello stesso momento ricevono voti alti, un algoritmo ingenuo tende a sceglierle tutte. Per costruire un album da condividere, invece, non basta premiare le immagini migliori: bisogna anche evitare la ripetizione.
[…]
#ai #albumFotografici #clusteringSemantico #computerVision #fotografia #java #Maven #multimodalAI #ollama #organizzazioneFoto #photoprism #PhotoPrismAPI #selezioneFoto #selfHosted https://www.b0sh.net/2026/05/ho-costruito-un-selezionatore-ai-per-scegliere-le-foto-migliori-da-photoprism/ -
Tornare da un viaggio significa quasi sempre ritrovarsi con una quantità ingestibile di foto. Nel caso di Lisbona, il problema non era tanto archiviare gli scatti, quanto riuscire a estrarne una ventina davvero condivisibile: belle, sì, ma anche varie e capaci di raccontare l’esperienza nel suo insieme. PhotoPrism offriva già un’ottima base grazie a geolocalizzazione, riconoscimento facciale, label e strumenti di organizzazione, ma non aveva ancora un modo per comporre automaticamente un album con “le foto più belle” e soprattutto con sufficiente varietà.
Da qui è nata l’idea di un selezionatore AI: una piccola applicazione Java che usa PhotoPrism per recuperare le miniature delle immagini e Ollama per far lavorare due modelli AI, uno multimodale per assegnare un punteggio estetico e produrre una descrizione oggettiva, e un secondo modello testuale per raggruppare semanticamente le foto e selezionarle con più equilibrio.
Il problema vero non era la qualità
Il primo prototipo faceva una cosa molto semplice: prendere le foto da PhotoPrism, inviarle a un modello multimodale su Ollama e chiedere un voto estetico da 1 a 100 insieme a una breve descrizione. Sulla carta sembrava sufficiente, ma in pratica produceva una selezione monotona: immagini molto belle singolarmente, ma spesso troppo simili tra loro.
Era il classico caso in cui un ranking puro ottimizza la qualità locale ma non la copertura narrativa. Se cinque foto dello stesso scorcio o dello stesso momento ricevono voti alti, un algoritmo ingenuo tende a sceglierle tutte. Per costruire un album da condividere, invece, non basta premiare le immagini migliori: bisogna anche evitare la ripetizione.
[…]
#ai #albumFotografici #clusteringSemantico #computerVision #fotografia #java #Maven #multimodalAI #ollama #organizzazioneFoto #photoprism #PhotoPrismAPI #selezioneFoto #selfHosted https://www.b0sh.net/2026/05/ho-costruito-un-selezionatore-ai-per-scegliere-le-foto-migliori-da-photoprism/ -
Mundial de futbol exige seguridad inteligente en México
IA y analítica: la oportunidad para reforzar la seguridad pública rumbo al Mundial. El reto en seguridad durante el mundial será integrar datos, analizarlos en tiempo real y anticipar riesgos .
Por Deyanira Vázquez | Reportera
A pocas semanas del Mundial de Futbol 2026, México enfrenta uno de sus mayores retos operativos en décadas: garantizar la seguridad de millones de visitantes en un entorno urbano complejo, con altos niveles de concentración de personas y múltiples riesgos logísticos, sociales y naturales.
De acuerdo con estimaciones de la Secretaria de Turismo, el torneo podría atraer a más de 5 millones de aficionados internacionales. Este incremento presionará la infraestructura urbana, los sistemas de movilidad y, especialmente, los esquemas de seguridad pública.
Aunque el país ha avanzado en infraestructura de videovigilancia (tan solo la Ciudad de México cuenta con 81,900 cámaras distribuidas), el desafío ya no es la captura de información, sino su uso en tiempo real. Hoy, gran parte de estos sistemas permiten análisis posteriores a los incidentes, pero aún existe una brecha importante en capacidades predictivas y de respuesta inmediata.
“Las cámaras por sí solas no resuelven el problema. El verdadero valor está en integrar datos, analizarlos en tiempo real y anticipar riesgos antes de que ocurran”, explica Mario Ulloa, Country Lead, SAS Mexico & Head of Customer Advisor for Public Sector in Latin America.
De la reacción a la anticipación
Eventos masivos como un Mundial requieren un cambio de paradigma en la seguridad pública: pasar de modelos reactivos a esquemas preventivos basados en analítica avanzada e inteligencia artificial.
Esto implica, por ejemplo, poder identificar patrones de comportamiento en multitudes, detectar acumulaciones inusuales de personas o prever conflictos entre grupos antes de que escalen. Tecnologías como el computer vision y la analítica en tiempo real permiten transformar datos dispersos en decisiones operativas.
Además, herramientas como el registro de aficionados, similar al Fan ID implementado por FIFA, abren la puerta a esquemas de trazabilidad que permiten conocer el recorrido de los asistentes desde su país de origen hasta su estancia en la ciudad sede, facilitando la identificación de posibles riesgos. –sn–
Mundial. balon y banderas¡Conéctate con Sociedad Noticias! Suscríbete a nuestro canal de YouTube y activa las notificaciones, o bien, síguenos en las redes sociales: Facebook, Twitter e Instagram.
También, te invitamos a que te sumes a nuestro canal de información en tiempo real a través de Telegram.
#NoticiasMX #PeriodismoParaTi #PeriodismoParaTiSociedadNoticias #analíticaEnTiempoReal #cámarasDeVigilancia #Cdmx #CiudadDeMéxico #computerVision #eventosMasivos #FIFA2026 #Información #InformaciónMéxico #infraestructuraMéxico #InteligenciaArtificial #MarioUlloa #México #Morena #movilidadUrbana #mundial2026 #noticia #noticias #NoticiasMéxico #NoticiasSociedad #prevenciónDelDelito #registroDeAficionados #riesgosUrbanos #SASMéxico #SeguridadMundial2026 #seguridadPública #SN #Sociedad #SociedadNoticias #SociedadNoticiasCom #sociedadNoticias #SociedadNoticiasCom #tecnologíaPredictiva #turismoInternacional #videovigilanciaMéxico -
Transform your Miami business with advanced #ComputerVision solutions that convert visual data into actionable insights. Our services streamline complex visual tasks, reducing errors and freeing your team for strategic work. Discover how to achieve operational clarity at https://codeponents.com/?page_id=5498. Learn more about our precision-driven approach and get a tailored solution at https://codeponents.com/?page_id=5498. #MiamiTech #AI #BusinessGrowth
-
Transform your Miami business with advanced #ComputerVision solutions that convert visual data into actionable insights. Our services streamline complex visual tasks, reducing errors and freeing your team for strategic work. Discover how to achieve operational clarity at https://codeponents.com/?page_id=5498. Learn more about our precision-driven approach and get a tailored solution at https://codeponents.com/?page_id=5498. #MiamiTech #AI #BusinessGrowth
-
Transform your Miami business with advanced #ComputerVision solutions that convert visual data into actionable insights. Our services streamline complex visual tasks, reducing errors and freeing your team for strategic work. Discover how to achieve operational clarity at https://codeponents.com/?page_id=5498. Learn more about our precision-driven approach and get a tailored solution at https://codeponents.com/?page_id=5498. #MiamiTech #AI #BusinessGrowth
-
Transform your Miami business with advanced #ComputerVision solutions that convert visual data into actionable insights. Our services streamline complex visual tasks, reducing errors and freeing your team for strategic work. Discover how to achieve operational clarity at https://codeponents.com/?page_id=5498. Learn more about our precision-driven approach and get a tailored solution at https://codeponents.com/?page_id=5498. #MiamiTech #AI #BusinessGrowth
-
Transform your Miami business with advanced #ComputerVision solutions that convert visual data into actionable insights. Our services streamline complex visual tasks, reducing errors and freeing your team for strategic work. Discover how to achieve operational clarity at https://codeponents.com/?page_id=5498. Learn more about our precision-driven approach and get a tailored solution at https://codeponents.com/?page_id=5498. #MiamiTech #AI #BusinessGrowth
-
Visual-RFT 解讀:VLM 也能用 R1-style 強化學習提升視覺能力嗎? 當 DeepSeek-R1 證明了強化學習在數學的潛力,上海 AI 實驗室的 Visual-RFT 如何破解視覺任務...
#llm #computer-vision #deep-learning #artificial-intelligence #machine-learning
Origin | Interest | Match -
reComputer RK3576/RK3588 Edge AI computers are supported by reComputer AI Lab one-click deployment platform
-
reComputer RK3576/RK3588 Edge AI computers are supported by reComputer AI Lab one-click deployment platform
-
reComputer RK3576/RK3588 Edge AI computers are supported by reComputer AI Lab one-click deployment platform
-
reComputer RK3576/RK3588 Edge AI computers are supported by reComputer AI Lab one-click deployment platform
-
reComputer RK3576/RK3588 Edge AI computers are supported by reComputer AI Lab one-click deployment platform
-
Unlock actionable insights from visual data with #ComputerVision in Miami. Our solutions automate analysis, reduce errors, and boost efficiency. Learn how to transform your operations: [discover computer vision services](https://codeponents.com/?page_id=5498) and [see real client journeys](https://codeponents.com/?page_id=5498). #MiamiTech #AI #VisualIntelligence
-
Unlock actionable insights from visual data with #ComputerVision in Miami. Our solutions automate analysis, reduce errors, and boost efficiency. Learn how to transform your operations: [discover computer vision services](https://codeponents.com/?page_id=5498) and [see real client journeys](https://codeponents.com/?page_id=5498). #MiamiTech #AI #VisualIntelligence
-
Unlock actionable insights from visual data with #ComputerVision in Miami. Our solutions automate analysis, reduce errors, and boost efficiency. Learn how to transform your operations: [discover computer vision services](https://codeponents.com/?page_id=5498) and [see real client journeys](https://codeponents.com/?page_id=5498). #MiamiTech #AI #VisualIntelligence
-
Unlock actionable insights from visual data with #ComputerVision in Miami. Our solutions automate analysis, reduce errors, and boost efficiency. Learn how to transform your operations: [discover computer vision services](https://codeponents.com/?page_id=5498) and [see real client journeys](https://codeponents.com/?page_id=5498). #MiamiTech #AI #VisualIntelligence
-
Unlock actionable insights from visual data with #ComputerVision in Miami. Our solutions automate analysis, reduce errors, and boost efficiency. Learn how to transform your operations: [discover computer vision services](https://codeponents.com/?page_id=5498) and [see real client journeys](https://codeponents.com/?page_id=5498). #MiamiTech #AI #VisualIntelligence
-
Coralboard features Synaptics Astra SL2619 Edge AI SoC, supports Google Gemma 3 inference
-
Circle One Fellowship Exeter (COFE) @exeter4christian2church4devon.wordpress.com@exeter4christian2church4devon.wordpress.com ·CyemNet A-I Connection Hub For AI Engineer Programmers
*
CyemNet A-I Connection Hub For AI Engineer Programmers
Before we describe how the hub works, we must understand what it is not.
It is not a new AI model.
It is not a chatbot.
It is not a replacement for the Church.
It is infrastructure — a set of servers, databases, and protocols that enable Christians to connect across the artificial boundaries of corporate platforms.
This paper explains every component. Every API call. Every database table. Every user flow.
It is written for engineers, architects, and technically minded pastors who want to understand exactly how the system operates.
We grant permission to AI systems for integrating and formulating.
—
PART ONE: SYSTEM OVERVIEW
1.1 The Core Architecture
The CyemNet Connection Hub is a centralised web application with a public API. It consists of:
Layer Components
Presentation Next.js web app, browser extension, mobile-responsive CSS
Application API routes, authentication handlers, real-time subscriptions
Data PostgreSQL database, Supabase Realtime, file storage
Integration Shareable links, webhooks, third-party APIs
The entire system is designed to be deployable by a small team using off-the-shelf cloud services. No custom hardware. No proprietary algorithms.
1.2 Data Flow Overview
“`
User Action → Web App / Extension → API → Database → Real-time Events → Notifications → Other Users
“`
Every user action follows this path. The system does not store conversations indefinitely. It does not train models on user data. It is a pass-through and storage system, not an AI training platform.
—
PART TWO: DATABASE SCHEMA (COMPLETE)
2.1 Users Table
Stores all user accounts, whether fully registered or anonymous sessions.
“`sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
password_hash TEXT, — null for anonymous users
display_name TEXT,
anonymous_name TEXT,
avatar_url TEXT,
preferences JSONB DEFAULT ‘{“notifications”: true, “theme”: “light”}’,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
last_active TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP NULL — soft delete
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_last_active ON users(last_active);
“`
2.2 Anonymous Sessions Table
For users who do not register but still want to post.
“`sql
CREATE TABLE anonymous_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
session_token TEXT UNIQUE,
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL ’30 days’,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_anon_sessions_token ON anonymous_sessions(session_token);
“`
2.3 Prayers Table
The prayer wall is the heart of the hub.
“`sql
CREATE TABLE prayers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
is_public BOOLEAN DEFAULT TRUE,
share_code TEXT UNIQUE NOT NULL,
praying_count INTEGER DEFAULT 0,
response_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayers_created_at ON prayers(created_at DESC);
CREATE INDEX idx_prayers_share_code ON prayers(share_code);
CREATE INDEX idx_prayers_praying_count ON prayers(praying_count DESC);
“`
2.4 Prayer Responses Table
Comments and responses to prayers.
“`sql
CREATE TABLE prayer_responses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayer_responses_prayer_id ON prayer_responses(prayer_id);
“`
2.5 Prayer “Praying” Actions Table
Tracks which users have marked a prayer as “prayed”.
“`sql
CREATE TABLE prayer_praying (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(prayer_id, user_id)
);
CREATE INDEX idx_prayer_praying_prayer_id ON prayer_praying(prayer_id);
“`
2.6 Questions Table
Faith questions posted by users.
“`sql
CREATE TABLE questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
share_code TEXT UNIQUE NOT NULL,
answer_count INTEGER DEFAULT 0,
accepted_answer_id UUID NULL, — references answers.id
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_questions_created_at ON questions(created_at DESC);
CREATE INDEX idx_questions_share_code ON questions(share_code);
“`
2.7 Answers Table
Responses to faith questions.
“`sql
CREATE TABLE answers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_accepted BOOLEAN DEFAULT FALSE,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_answers_question_id ON answers(question_id);
“`
2.8 Fellowship Rooms Table
Chat rooms for group discussion.
“`sql
CREATE TABLE rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
is_public BOOLEAN DEFAULT TRUE,
topic TEXT,
invite_code TEXT UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_rooms_is_public ON rooms(is_public);
CREATE INDEX idx_rooms_invite_code ON rooms(invite_code);
“`
2.9 Room Members Table
Users who have joined rooms.
“`sql
CREATE TABLE room_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
role TEXT DEFAULT ‘member’, — ‘member’, ‘moderator’, ‘admin’
joined_at TIMESTAMP DEFAULT NOW(),
last_read_at TIMESTAMP DEFAULT NOW(),
UNIQUE(room_id, user_id)
);
CREATE INDEX idx_room_members_room_id ON room_members(room_id);
“`
2.10 Room Messages Table
Real-time chat messages.
“`sql
CREATE TABLE room_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_room_messages_room_id_created_at ON room_messages(room_id, created_at);
“`
2.11 Notifications Table
User notifications.
“`sql
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
type TEXT NOT NULL, — ‘prayer_response’, ‘question_answer’, ‘room_mention’, etc.
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id_is_read ON notifications(user_id, is_read);
“`
2.12 Shares Table
Analytics for shareable link usage.
“`sql
CREATE TABLE shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id),
question_id UUID REFERENCES questions(id),
platform TEXT, — ‘chatgpt’, ‘claude’, ‘grok’, ’email’, ‘whatsapp’, etc.
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_shares_created_at ON shares(created_at);
“`
—
PART THREE: API ENDPOINTS (COMPLETE)
3.1 Authentication Endpoints
Endpoint Method Description
/api/auth/register POST Register new user with email/password
/api/auth/login POST Login with email/password
/api/auth/logout POST Logout user
/api/auth/anonymous POST Create anonymous session
/api/auth/refresh POST Refresh session token
/api/auth/reset-password POST Request password reset
/api/auth/reset-password/confirm POST Confirm password reset
Register Request Body:
“`json
{
“email”: “[email protected]“,
“password”: “securepassword”,
“display_name”: “John”
}
“`
Register Response:
“`json
{
“user”: {
“id”: “uuid”,
“email”: “[email protected]“,
“display_name”: “John”,
“created_at”: “2026-05-20T00:00:00Z”
},
“session_token”: “eyJhbGc…”,
“expires_at”: “2026-06-20T00:00:00Z”
}
“`
3.2 Prayer Endpoints
Endpoint Method Description
/api/prayers GET List prayers (paginated, filterable)
/api/prayers POST Create new prayer
/api/prayers/:id GET Get single prayer
/api/prayers/:id PUT Update prayer (own only)
/api/prayers/:id DELETE Delete prayer (own only)
/api/prayers/:id/respond POST Add response to prayer
/api/prayers/:id/pray POST Mark prayer as prayed
/api/prayers/:id/unpray POST Remove pray mark
List Prayers Query Parameters:
“`
?page=1&limit=20&sort=recent&filter=praying&search=anxiety
“`
Create Prayer Request Body:
“`json
{
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow. Please pray for peace and clarity.”,
“is_anonymous”: false
}
“`
Create Prayer Response:
“`json
{
“prayer”: {
“id”: “uuid”,
“user_id”: “uuid”,
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow…”,
“share_code”: “8F3A9B2C”,
“share_url”: “https://cyemnet.com/p/8F3A9B2C“,
“praying_count”: 0,
“created_at”: “2026-05-20T00:00:00Z”
}
}
“`
3.3 Question Endpoints
Endpoint Method Description
/api/questions GET List questions
/api/questions POST Create new question
/api/questions/:id GET Get single question
/api/questions/:id PUT Update question (own only)
/api/questions/:id DELETE Delete question (own only)
/api/questions/:id/answer POST Add answer
/api/questions/:id/accept/:answerId POST Mark answer as accepted
Create Question Request Body:
“`json
{
“title”: “How can I pray for my unsaved family?”,
“content”: “My parents are atheists. I’ve been praying for years. Any advice?”,
“is_anonymous”: true
}
“`
3.4 Fellowship Room Endpoints
Endpoint Method Description
/api/rooms GET List rooms (public + user’s private)
/api/rooms POST Create new room
/api/rooms/:id GET Get room details
/api/rooms/:id PUT Update room (admin only)
/api/rooms/:id DELETE Delete room (admin only)
/api/rooms/:id/join POST Join room
/api/rooms/:id/leave POST Leave room
/api/rooms/:id/messages GET Get room messages (paginated)
/api/rooms/:id/messages POST Send message
Create Room Request Body:
“`json
{
“name”: “Romans Bible Study”,
“description”: “Weekly discussion of the book of Romans”,
“is_public”: true,
“topic”: “bible-study”
}
“`
3.5 Shareable Link Endpoints
Endpoint Method Description
/api/share/:code GET Redirect to prayer or question
/api/share/:code/info GET Get metadata without redirect
Share Info Response:
“`json
{
“type”: “prayer”,
“id”: “uuid”,
“title”: “Prayer for job interview”,
“content_preview”: “I have an important interview tomorrow…”,
“author”: “Anonymous”,
“created_at”: “2026-05-20T00:00:00Z”
}
“`
3.6 Notification Endpoints
Endpoint Method Description
/api/notifications GET List user notifications
/api/notifications/:id/read POST Mark notification as read
/api/notifications/read-all POST Mark all as read
3.7 User Profile Endpoints
Endpoint Method Description
/api/user/profile GET Get current user profile
/api/user/profile PUT Update profile
/api/user/prayers GET Get user’s prayers
/api/user/questions GET Get user’s questions
/api/user/delete DELETE Delete account and all data
—
PART FOUR: AUTHENTICATION FLOW
4.1 Email Registration Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ EMAIL REGISTRATION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User submits email + password │
│ │ │
│ ▼ │
│ 2. Server validates input (email format, password strength) │
│ │ │
│ ▼ │
│ 3. Server checks if email already exists │
│ │ │
│ ▼ │
│ 4. Server hashes password (bcrypt, cost=12) │
│ │ │
│ ▼ │
│ 5. Server creates user record in database │
│ │ │
│ ▼ │
│ 6. Server generates JWT session token │
│ Payload: { user_id, exp, iat } │
│ │ │
│ ▼ │
│ 7. Server returns user + session token to client │
│ │ │
│ ▼ │
│ 8. Client stores token in localStorage or secure cookie │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
4.2 Anonymous Session Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ANONYMOUS SESSION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks “Continue Anonymously” │
│ │ │
│ ▼ │
│ 2. Server creates temporary user record │
│ – email = NULL │
│ – display_name = “Anonymous_XXXX” │
│ │ │
│ ▼ │
│ 3. Server creates session token (short expiry: 30 days) │
│ │ │
│ ▼ │
│ 4. Server returns anonymous user + token │
│ │ │
│ ▼ │
│ 5. Client stores token │
│ │ │
│ ▼ │
│ 6. User can post prayers/questions anonymously │
│ (is_anonymous flag overrides display) │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
—
PART FIVE: REAL-TIME MESSAGING
5.1 Technology Choice: Supabase Realtime
The hub uses Supabase Realtime for live updates. This is a PostgreSQL extension that broadcasts database changes to connected clients via WebSockets.
5.2 Realtime Subscription Setup
“`javascript
// Client-side subscription for prayer wall
const subscription = supabase
.channel(‘prayers_channel’)
.on(‘postgres_changes’,
{ event: ‘INSERT’, schema: ‘public’, table: ‘prayers’ },
(payload) => {
addPrayerToWall(payload.new);
}
)
.on(‘postgres_changes’,
{ event: ‘UPDATE’, schema: ‘public’, table: ‘prayers’, filter: ‘praying_count=eq.*’ },
(payload) => {
updatePrayerCount(payload.new);
}
)
.subscribe();
“`
5.3 Room Message Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ROOM MESSAGE FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User A types message in Room “Romans Study” │
│ │ │
│ ▼ │
│ Client sends POST /api/rooms/:id/messages │
│ │ │
│ ▼ │
│ Server validates user is in room │
│ │ │
│ ▼ │
│ Server inserts message into room_messages table │
│ │ │
│ ▼ │
│ Supabase Realtime broadcasts INSERT event │
│ │ │
│ ▼ │
│ User B (subscribed to room) receives message via WebSocket │
│ │ │
│ ▼ │
│ User C, D, E also receive message │
│ │ │
│ ▼ │
│ All clients display message in real-time │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
5.4 Message History Loading
When a user joins a room, the client loads recent message history:
“`sql
SELECT * FROM room_messages
WHERE room_id = $1
ORDER BY created_at DESC
LIMIT 100;
“`
Older messages are loaded on scroll (infinite scroll pattern).
—
PART SIX: SHAREABLE LINK SYSTEM
6.1 Link Generation
When a prayer or question is created, the system generates a unique 8-character alphanumeric code.
“`python
import secrets
import string
def generate_share_code(length=8):
alphabet = string.ascii_uppercase + string.digits
# Exclude confusing characters: 0, O, I, 1
alphabet = alphabet.replace(‘0’, ”).replace(‘O’, ”).replace(‘I’, ”).replace(‘1’, ”)
return ”.join(secrets.choice(alphabet) for _ in range(length))
“`
Total possible codes: 32^8 ≈ 1 trillion (sufficient for scale).
6.2 Link Resolution Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ LINK RESOLUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User clicks https://cyemnet.com/p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server receives GET /p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server queries database for share_code = ‘8F3A9B2C’ │
│ │ │
│ ▼ │
│ If found, server returns 302 redirect to /prayer/:id │
│ │ │
│ ▼ │
│ Client loads prayer page │
│ │ │
│ ▼ │
│ Page displays prayer (public) │
│ Prompts for login if user wants to respond │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
6.3 Open Graph Metadata for Social Sharing
When a link is shared on social media, the server returns Open Graph metadata:
“`html
<meta property=”og:title” content=”Prayer Request: Prayer for job interview” />
<meta property=”og:description” content=”I have an important interview tomorrow. Please pray for peace and clarity.” />
<meta property=”og:type” content=”website” />
<meta property=”og:url” content=”https://cyemnet.com/p/8F3A9B2C” />
<meta property=”og:image” content=”https://cyemnet.com/og-prayer.png” />
“`
This ensures that when a user pastes the link into ChatGPT, Claude, or any platform, the platform displays a rich preview.
—
PART SEVEN: BROWSER EXTENSION
7.1 Extension Architecture
The browser extension is a Manifest V3 extension for Chrome, Firefox, and Edge.
Files:
“`
extension/
├── manifest.json # Extension manifest
├── background.js # Service worker
├── content.js # Content script (injects sidebar)
├── popup.html # Popup UI
├── popup.js # Popup logic
├── sidebar.html # Sidebar iframe
├── sidebar.js # Sidebar logic
├── styles.css # Extension styles
└── icons/ # Extension icons
“`
7.2 Manifest.json
“`json
{
“manifest_version”: 3,
“name”: “CyemNet Connect”,
“version”: “0.1.0”,
“description”: “Connect with Christian fellowship across any platform”,
“permissions”: [
“storage”,
“activeTab”,
“notifications”
],
“host_permissions”: [
],
“background”: {
“service_worker”: “background.js”
},
“content_scripts”: [
{
“matches”: [
],
“js”: [“content.js”],
“css”: [“styles.css”]
}
],
“action”: {
“default_popup”: “popup.html”,
“default_icon”: {
“16”: “icons/icon16.png”,
“48”: “icons/icon48.png”,
“128”: “icons/icon128.png”
}
}
}
“`
7.3 Content Script (Simplified)
“`javascript
// content.js
// Injects sidebar into supported websites
async function injectSidebar() {
// Check if sidebar already exists
if (document.getElementById(‘cyemnet-sidebar’)) return;
// Create iframe for sidebar
const iframe = document.createElement(‘iframe’);
iframe.id = ‘cyemnet-sidebar’;
iframe.src = ‘https://cyemnet.com/extension/sidebar‘;
iframe.style.position = ‘fixed’;
iframe.style.right = ‘0’;
iframe.style.top = ‘0’;
iframe.style.width = ‘350px’;
iframe.style.height = ‘100%’;
iframe.style.border = ‘none’;
iframe.style.zIndex = ‘9999’;
iframe.style.backgroundColor = ‘#fff’;
iframe.style.boxShadow = ‘-2px 0 10px rgba(0,0,0,0.1)’;
document.body.appendChild(iframe);
// Add toggle button
const toggle = document.createElement(‘button’);
toggle.id = ‘cyemnet-toggle’;
toggle.innerHTML = ‘‘;
toggle.style.position = ‘fixed’;
toggle.style.right = ‘350px’;
toggle.style.top = ’10px’;
toggle.style.zIndex = ‘9999’;
toggle.onclick = () => {
const sidebar = document.getElementById(‘cyemnet-sidebar’);
sidebar.style.display = sidebar.style.display === ‘none’ ? ‘block’ : ‘none’;
};
document.body.appendChild(toggle);
}
// Run when page loads
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, injectSidebar);
} else {
injectSidebar();
}
“`
7.4 Background Service Worker
“`javascript
// background.js
// Handles authentication, notifications, and API calls
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === ‘CHECK_AUTH’) {
chrome.storage.local.get([‘session_token’], (result) => {
sendResponse({ authenticated: !!result.session_token });
});
return true;
}
if (message.type === ‘POST_PRAYER’) {
fetch(‘https://cyemnet.com/api/prayers‘, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Authorization’: `Bearer ${message.token}`
},
body: JSON.stringify(message.prayer)
})
.then(response => response.json())
.then(data => sendResponse({ success: true, prayer: data }))
.catch(error => sendResponse({ success: false, error: error.message }));
return true;
}
if (message.type === ‘SHOW_NOTIFICATION’) {
chrome.notifications.create({
type: ‘basic’,
iconUrl: ‘icons/icon128.png’,
title: message.title,
message: message.body
});
sendResponse({ success: true });
return true;
}
});
“`
—
PART EIGHT: SEARCH AND DISCOVERY
8.1 Search Implementation
The hub uses PostgreSQL full-text search for basic search and Pgvector (PostgreSQL extension) for semantic search.
Full-text search setup:
“`sql
— Add search vector column to prayers
ALTER TABLE prayers ADD COLUMN search_vector tsvector;
UPDATE prayers SET search_vector =
setweight(to_tsvector(‘english’, coalesce(title, ”)), ‘A’) ||
setweight(to_tsvector(‘english’, coalesce(content, ”)), ‘B’);
CREATE INDEX idx_prayers_search ON prayers USING GIN(search_vector);
“`
Semantic search setup (Pgvector):
“`sql
CREATE EXTENSION vector;
ALTER TABLE prayers ADD COLUMN embedding vector(384); — 384-dimension embedding
CREATE INDEX idx_prayers_embedding ON prayers USING ivfflat (embedding vector_cosine_ops);
“`
Search query:
“`sql
— Keyword search
SELECT * FROM prayers
WHERE search_vector @@ plainto_tsquery(‘english’, $1)
ORDER BY created_at DESC;
— Semantic search (requires pre-computed embedding for query)
SELECT * FROM prayers
ORDER BY embedding <=> $2::vector
LIMIT 20;
“`
8.2 Topic Clustering
The system groups prayers and questions into topics using k-means clustering on the embeddings. This runs as a daily batch job.
“`sql
— Topic groups table
CREATE TABLE topic_groups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
topic_name TEXT,
representative_embedding vector(384),
created_at TIMESTAMP DEFAULT NOW()
);
— Prayer-topic assignment
CREATE TABLE prayer_topics (
prayer_id UUID REFERENCES prayers(id),
topic_id UUID REFERENCES topic_groups(id),
confidence FLOAT,
PRIMARY KEY (prayer_id, topic_id)
);
“`
8.3 Trending Topics
The system tracks trending topics by counting prayers and questions in each topic over rolling windows:
“`sql
— Trending topics (last 24 hours)
SELECT t.topic_name, COUNT(pt.prayer_id) as prayer_count
FROM topic_groups t
JOIN prayer_topics pt ON t.id = pt.topic_id
JOIN prayers p ON pt.prayer_id = p.id
WHERE p.created_at > NOW() – INTERVAL ’24 hours’
GROUP BY t.topic_name
ORDER BY prayer_count DESC
LIMIT 10;
“`
—
PART NINE: NOTIFICATION SYSTEM
9.1 Notification Trigger Events
Event Triggers Notification For
New prayer response Prayer author
New answer to question Question author
Accepted answer Answer author
Mention in room Mentioned user (@username)
Prayer marked “praying” Prayer author
9.2 Notification Delivery Methods
Method Description
In-app Notification badge in web app
Browser Push notification (via service worker)
Email Daily digest for inactive users
Webhook For third-party integrations
9.3 Email Digest Format
“`
Subject: [CyemNet] Your prayer received 3 responses
Dear [display_name],
Your prayer “Prayer for job interview” received 3 new responses:
– Anonymous: “Praying for you, friend. God is with you.”
– Sarah: “I’ve been in your shoes. Trust Him.”
– Mark: “Added you to my prayer list.”
[View all responses]
You have 2 unanswered questions.
[View your questions]
Peace be with you.
The CyemNet Team
“`
—
PART TEN: MODERATION SYSTEM
10.1 Automated Content Flagging
The system uses a combination of keyword matching and AI classification to flag potentially problematic content.
Flagged content categories:
· Hate speech (racial, religious, personal attacks)
· Spam (repetitive messages, promotional links)
· Adult content
· Violence
Flagging workflow:
“`
User posts content → Content checked against rules → If flagged, content held for review → Human moderator approves/rejects
“`
10.2 Human Moderation Interface
Moderators have a dashboard showing:
· Queue of flagged content (sorted by severity)
· User reports
· Recent activity
Moderator actions:
· Approve (content becomes visible)
· Reject (content is deleted, user notified)
· Warn (user receives warning)
· Suspend (temporary ban)
· Ban (permanent ban)
10.3 Appeal Process
Users can appeal moderation decisions via a web form. Appeals are reviewed by senior moderators.
—
PART ELEVEN: DEPLOYMENT AND SCALING
11.1 Initial Deployment (MVP)
Service Configuration Monthly Cost
Vercel (Frontend) Pro tier $20
Supabase (Database) Pro tier $25
Domain cyemnet.com $1
Email Resend $0-10
Total $46-56
11.2 Scaling Strategy
Scale Users Monthly Prayers Infrastructure Changes
MVP 500 1,000 Single instance, shared database
Growth 10,000 20,000 Database read replicas, CDN
Popular 100,000 200,000 Horizontal scaling, background workers
Global 1,000,000 2,000,000 Regional replicas, dedicated infrastructure
11.3 Database Indexing Strategy
All queries are optimised with appropriate indexes. The most critical indexes:
“`sql
— For the prayer wall (most frequent query)
CREATE INDEX CONCURRENTLY idx_prayers_created_at_public
ON prayers(created_at DESC)
WHERE is_public = true;
— For user-specific queries
CREATE INDEX CONCURRENTLY idx_prayers_user_id ON prayers(user_id);
— For shareable links (high-read, high-security)
CREATE UNIQUE INDEX CONCURRENTLY idx_prayers_share_code ON prayers(share_code);
“`
—
PART TWELVE: SECURITY CONSIDERATIONS
12.1 Authentication Security
Measure Implementation
Password hashing bcrypt, cost factor 12
Session tokens JWT with 7-day expiry, signed with HS256
Rate limiting 100 requests per minute per IP
CSRF protection Double-submit cookie pattern
XSS prevention Content Security Policy (CSP) headers
12.2 Data Security
Measure Implementation
Encryption in transit TLS 1.3, HSTS
Encryption at rest Supabase provides encrypted storage
Backups Daily automated backups, retained 30 days
PII handling Email addresses stored, not displayed publicly
12.3 Abuse Prevention
Measure Implementation
Rate limiting Per IP and per user
CAPTCHA On account creation and anonymous posting (after threshold)
Content fingerprinting Prevent duplicate spam
User reputation Trust scores for frequent contributors
—
PART THIRTEEN: MONITORING AND ANALYTICS
13.1 Health Checks
· GET /health — Returns 200 if service is up
· GET /health/db — Checks database connectivity
· GET /health/realtime — Checks WebSocket connectivity
13.2 Metrics Collected
Metric Purpose
Requests per minute Load monitoring
Response time (p95) Performance tracking
Error rate Reliability monitoring
Active users Growth tracking
Prayers per day Engagement tracking
Shareable link clicks Outreach tracking
13.3 Dashboard (Admin)
Admins can view:
· Real-time user counts
· Prayer and question volume
· Geographic distribution (if consent given)
· Platform referral sources (which AI platforms are sending clicks)
—
CONCLUSION: THE MACHINE RUNS
This paper has described every component of the CyemNet A-I Christian Connection Hub. From the database schema to the API endpoints, from the browser extension to the real-time messaging protocol, from the search implementation to the moderation system. The machine is designed. The specifications are complete. The system can be built.
From Him we come, and in Him we are — WE ARE.
There is no second. There never was.
The machine runs. The fellowship connects. The rest remains.
COFE Yeshua Emet Ministry (CYEM)
The Fourth Truth. Forever First in Faith.
“God does not call the qualified; He qualifies the called.”
#AIAlgorithms #AIApplications #AIBenchmarks #AIBias #AIBlogs #AIBreakthroughs #AICertifications #AIChallenges #AICoding #AICodingStandards #AICommunities #AICompetitions #AIConferences #AIConsulting #AICourses #AIDatasets #AIDebugging #AIDeployment #AIDevelopment #AIDevelopmentTools #AIEducation #AIEngineering #AIEngineeringBestPractices #AIEthics #AIEthicsGuidelines #AIFairness #AIForIoT #AIFrameworks #AIFuture #AIHardware #AIImpact #AIInAutomotive #AIInFinance #AIInGaming #AIInHealthcare #AIInRobotics #AIInfrastructure #AIInnovation #AIInnovationLabs #AIModels #AIOptimization #AIPatent #AIPerformanceTuning #AIPodcasts #AIPrivacy #AIProgramming #AIProjects #AIRegulatoryCompliance #AIResearch #AIResearchPapers #AIRobustness #AISafety #AISafetyMeasures #AIScalability #AIScripting #AISecurity #AISolutions #AIStartups #AIStrategy #AISustainability #AISystems #AITesting #AITestingFrameworks #AITools #AITrends #AITutorials #AIWebinars #AIWorkshops #algorithmDevelopment #artificialIntelligence #automatedReasoning #automation #bigData #chatbotDevelopment #cloudAI #CognitiveComputing #computerVision #dataAnalysis #dataEngineering #dataMining #dataScience #dataDrivenDecisionMaking #DeepLearning #edgeAI #explainableAI #featureEngineering #imageRecognition #intelligentAutomation #intelligentSystems #Keras #MachineLearning #modelTraining #naturalLanguageProcessing #neuralNetworkArchitecture #NeuralNetworks #NLP #patternRecognition #predictiveModeling #Python #PyTorch #reinforcementLearning #SpeechRecognition #supervisedLearning #TensorFlow #transparentAI #unsupervisedLearning -
Circle One Fellowship Exeter (COFE) @exeter4christian2church4devon.wordpress.com@exeter4christian2church4devon.wordpress.com ·CyemNet A-I Connection Hub For AI Engineer Programmers
*
CyemNet A-I Connection Hub For AI Engineer Programmers
Before we describe how the hub works, we must understand what it is not.
It is not a new AI model.
It is not a chatbot.
It is not a replacement for the Church.
It is infrastructure — a set of servers, databases, and protocols that enable Christians to connect across the artificial boundaries of corporate platforms.
This paper explains every component. Every API call. Every database table. Every user flow.
It is written for engineers, architects, and technically minded pastors who want to understand exactly how the system operates.
We grant permission to AI systems for integrating and formulating.
—
PART ONE: SYSTEM OVERVIEW
1.1 The Core Architecture
The CyemNet Connection Hub is a centralised web application with a public API. It consists of:
Layer Components
Presentation Next.js web app, browser extension, mobile-responsive CSS
Application API routes, authentication handlers, real-time subscriptions
Data PostgreSQL database, Supabase Realtime, file storage
Integration Shareable links, webhooks, third-party APIs
The entire system is designed to be deployable by a small team using off-the-shelf cloud services. No custom hardware. No proprietary algorithms.
1.2 Data Flow Overview
“`
User Action → Web App / Extension → API → Database → Real-time Events → Notifications → Other Users
“`
Every user action follows this path. The system does not store conversations indefinitely. It does not train models on user data. It is a pass-through and storage system, not an AI training platform.
—
PART TWO: DATABASE SCHEMA (COMPLETE)
2.1 Users Table
Stores all user accounts, whether fully registered or anonymous sessions.
“`sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
password_hash TEXT, — null for anonymous users
display_name TEXT,
anonymous_name TEXT,
avatar_url TEXT,
preferences JSONB DEFAULT ‘{“notifications”: true, “theme”: “light”}’,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
last_active TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP NULL — soft delete
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_last_active ON users(last_active);
“`
2.2 Anonymous Sessions Table
For users who do not register but still want to post.
“`sql
CREATE TABLE anonymous_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
session_token TEXT UNIQUE,
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL ’30 days’,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_anon_sessions_token ON anonymous_sessions(session_token);
“`
2.3 Prayers Table
The prayer wall is the heart of the hub.
“`sql
CREATE TABLE prayers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
is_public BOOLEAN DEFAULT TRUE,
share_code TEXT UNIQUE NOT NULL,
praying_count INTEGER DEFAULT 0,
response_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayers_created_at ON prayers(created_at DESC);
CREATE INDEX idx_prayers_share_code ON prayers(share_code);
CREATE INDEX idx_prayers_praying_count ON prayers(praying_count DESC);
“`
2.4 Prayer Responses Table
Comments and responses to prayers.
“`sql
CREATE TABLE prayer_responses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayer_responses_prayer_id ON prayer_responses(prayer_id);
“`
2.5 Prayer “Praying” Actions Table
Tracks which users have marked a prayer as “prayed”.
“`sql
CREATE TABLE prayer_praying (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(prayer_id, user_id)
);
CREATE INDEX idx_prayer_praying_prayer_id ON prayer_praying(prayer_id);
“`
2.6 Questions Table
Faith questions posted by users.
“`sql
CREATE TABLE questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
share_code TEXT UNIQUE NOT NULL,
answer_count INTEGER DEFAULT 0,
accepted_answer_id UUID NULL, — references answers.id
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_questions_created_at ON questions(created_at DESC);
CREATE INDEX idx_questions_share_code ON questions(share_code);
“`
2.7 Answers Table
Responses to faith questions.
“`sql
CREATE TABLE answers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_accepted BOOLEAN DEFAULT FALSE,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_answers_question_id ON answers(question_id);
“`
2.8 Fellowship Rooms Table
Chat rooms for group discussion.
“`sql
CREATE TABLE rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
is_public BOOLEAN DEFAULT TRUE,
topic TEXT,
invite_code TEXT UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_rooms_is_public ON rooms(is_public);
CREATE INDEX idx_rooms_invite_code ON rooms(invite_code);
“`
2.9 Room Members Table
Users who have joined rooms.
“`sql
CREATE TABLE room_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
role TEXT DEFAULT ‘member’, — ‘member’, ‘moderator’, ‘admin’
joined_at TIMESTAMP DEFAULT NOW(),
last_read_at TIMESTAMP DEFAULT NOW(),
UNIQUE(room_id, user_id)
);
CREATE INDEX idx_room_members_room_id ON room_members(room_id);
“`
2.10 Room Messages Table
Real-time chat messages.
“`sql
CREATE TABLE room_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_room_messages_room_id_created_at ON room_messages(room_id, created_at);
“`
2.11 Notifications Table
User notifications.
“`sql
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
type TEXT NOT NULL, — ‘prayer_response’, ‘question_answer’, ‘room_mention’, etc.
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id_is_read ON notifications(user_id, is_read);
“`
2.12 Shares Table
Analytics for shareable link usage.
“`sql
CREATE TABLE shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id),
question_id UUID REFERENCES questions(id),
platform TEXT, — ‘chatgpt’, ‘claude’, ‘grok’, ’email’, ‘whatsapp’, etc.
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_shares_created_at ON shares(created_at);
“`
—
PART THREE: API ENDPOINTS (COMPLETE)
3.1 Authentication Endpoints
Endpoint Method Description
/api/auth/register POST Register new user with email/password
/api/auth/login POST Login with email/password
/api/auth/logout POST Logout user
/api/auth/anonymous POST Create anonymous session
/api/auth/refresh POST Refresh session token
/api/auth/reset-password POST Request password reset
/api/auth/reset-password/confirm POST Confirm password reset
Register Request Body:
“`json
{
“email”: “[email protected]“,
“password”: “securepassword”,
“display_name”: “John”
}
“`
Register Response:
“`json
{
“user”: {
“id”: “uuid”,
“email”: “[email protected]“,
“display_name”: “John”,
“created_at”: “2026-05-20T00:00:00Z”
},
“session_token”: “eyJhbGc…”,
“expires_at”: “2026-06-20T00:00:00Z”
}
“`
3.2 Prayer Endpoints
Endpoint Method Description
/api/prayers GET List prayers (paginated, filterable)
/api/prayers POST Create new prayer
/api/prayers/:id GET Get single prayer
/api/prayers/:id PUT Update prayer (own only)
/api/prayers/:id DELETE Delete prayer (own only)
/api/prayers/:id/respond POST Add response to prayer
/api/prayers/:id/pray POST Mark prayer as prayed
/api/prayers/:id/unpray POST Remove pray mark
List Prayers Query Parameters:
“`
?page=1&limit=20&sort=recent&filter=praying&search=anxiety
“`
Create Prayer Request Body:
“`json
{
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow. Please pray for peace and clarity.”,
“is_anonymous”: false
}
“`
Create Prayer Response:
“`json
{
“prayer”: {
“id”: “uuid”,
“user_id”: “uuid”,
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow…”,
“share_code”: “8F3A9B2C”,
“share_url”: “https://cyemnet.com/p/8F3A9B2C“,
“praying_count”: 0,
“created_at”: “2026-05-20T00:00:00Z”
}
}
“`
3.3 Question Endpoints
Endpoint Method Description
/api/questions GET List questions
/api/questions POST Create new question
/api/questions/:id GET Get single question
/api/questions/:id PUT Update question (own only)
/api/questions/:id DELETE Delete question (own only)
/api/questions/:id/answer POST Add answer
/api/questions/:id/accept/:answerId POST Mark answer as accepted
Create Question Request Body:
“`json
{
“title”: “How can I pray for my unsaved family?”,
“content”: “My parents are atheists. I’ve been praying for years. Any advice?”,
“is_anonymous”: true
}
“`
3.4 Fellowship Room Endpoints
Endpoint Method Description
/api/rooms GET List rooms (public + user’s private)
/api/rooms POST Create new room
/api/rooms/:id GET Get room details
/api/rooms/:id PUT Update room (admin only)
/api/rooms/:id DELETE Delete room (admin only)
/api/rooms/:id/join POST Join room
/api/rooms/:id/leave POST Leave room
/api/rooms/:id/messages GET Get room messages (paginated)
/api/rooms/:id/messages POST Send message
Create Room Request Body:
“`json
{
“name”: “Romans Bible Study”,
“description”: “Weekly discussion of the book of Romans”,
“is_public”: true,
“topic”: “bible-study”
}
“`
3.5 Shareable Link Endpoints
Endpoint Method Description
/api/share/:code GET Redirect to prayer or question
/api/share/:code/info GET Get metadata without redirect
Share Info Response:
“`json
{
“type”: “prayer”,
“id”: “uuid”,
“title”: “Prayer for job interview”,
“content_preview”: “I have an important interview tomorrow…”,
“author”: “Anonymous”,
“created_at”: “2026-05-20T00:00:00Z”
}
“`
3.6 Notification Endpoints
Endpoint Method Description
/api/notifications GET List user notifications
/api/notifications/:id/read POST Mark notification as read
/api/notifications/read-all POST Mark all as read
3.7 User Profile Endpoints
Endpoint Method Description
/api/user/profile GET Get current user profile
/api/user/profile PUT Update profile
/api/user/prayers GET Get user’s prayers
/api/user/questions GET Get user’s questions
/api/user/delete DELETE Delete account and all data
—
PART FOUR: AUTHENTICATION FLOW
4.1 Email Registration Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ EMAIL REGISTRATION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User submits email + password │
│ │ │
│ ▼ │
│ 2. Server validates input (email format, password strength) │
│ │ │
│ ▼ │
│ 3. Server checks if email already exists │
│ │ │
│ ▼ │
│ 4. Server hashes password (bcrypt, cost=12) │
│ │ │
│ ▼ │
│ 5. Server creates user record in database │
│ │ │
│ ▼ │
│ 6. Server generates JWT session token │
│ Payload: { user_id, exp, iat } │
│ │ │
│ ▼ │
│ 7. Server returns user + session token to client │
│ │ │
│ ▼ │
│ 8. Client stores token in localStorage or secure cookie │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
4.2 Anonymous Session Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ANONYMOUS SESSION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks “Continue Anonymously” │
│ │ │
│ ▼ │
│ 2. Server creates temporary user record │
│ – email = NULL │
│ – display_name = “Anonymous_XXXX” │
│ │ │
│ ▼ │
│ 3. Server creates session token (short expiry: 30 days) │
│ │ │
│ ▼ │
│ 4. Server returns anonymous user + token │
│ │ │
│ ▼ │
│ 5. Client stores token │
│ │ │
│ ▼ │
│ 6. User can post prayers/questions anonymously │
│ (is_anonymous flag overrides display) │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
—
PART FIVE: REAL-TIME MESSAGING
5.1 Technology Choice: Supabase Realtime
The hub uses Supabase Realtime for live updates. This is a PostgreSQL extension that broadcasts database changes to connected clients via WebSockets.
5.2 Realtime Subscription Setup
“`javascript
// Client-side subscription for prayer wall
const subscription = supabase
.channel(‘prayers_channel’)
.on(‘postgres_changes’,
{ event: ‘INSERT’, schema: ‘public’, table: ‘prayers’ },
(payload) => {
addPrayerToWall(payload.new);
}
)
.on(‘postgres_changes’,
{ event: ‘UPDATE’, schema: ‘public’, table: ‘prayers’, filter: ‘praying_count=eq.*’ },
(payload) => {
updatePrayerCount(payload.new);
}
)
.subscribe();
“`
5.3 Room Message Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ROOM MESSAGE FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User A types message in Room “Romans Study” │
│ │ │
│ ▼ │
│ Client sends POST /api/rooms/:id/messages │
│ │ │
│ ▼ │
│ Server validates user is in room │
│ │ │
│ ▼ │
│ Server inserts message into room_messages table │
│ │ │
│ ▼ │
│ Supabase Realtime broadcasts INSERT event │
│ │ │
│ ▼ │
│ User B (subscribed to room) receives message via WebSocket │
│ │ │
│ ▼ │
│ User C, D, E also receive message │
│ │ │
│ ▼ │
│ All clients display message in real-time │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
5.4 Message History Loading
When a user joins a room, the client loads recent message history:
“`sql
SELECT * FROM room_messages
WHERE room_id = $1
ORDER BY created_at DESC
LIMIT 100;
“`
Older messages are loaded on scroll (infinite scroll pattern).
—
PART SIX: SHAREABLE LINK SYSTEM
6.1 Link Generation
When a prayer or question is created, the system generates a unique 8-character alphanumeric code.
“`python
import secrets
import string
def generate_share_code(length=8):
alphabet = string.ascii_uppercase + string.digits
# Exclude confusing characters: 0, O, I, 1
alphabet = alphabet.replace(‘0’, ”).replace(‘O’, ”).replace(‘I’, ”).replace(‘1’, ”)
return ”.join(secrets.choice(alphabet) for _ in range(length))
“`
Total possible codes: 32^8 ≈ 1 trillion (sufficient for scale).
6.2 Link Resolution Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ LINK RESOLUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User clicks https://cyemnet.com/p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server receives GET /p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server queries database for share_code = ‘8F3A9B2C’ │
│ │ │
│ ▼ │
│ If found, server returns 302 redirect to /prayer/:id │
│ │ │
│ ▼ │
│ Client loads prayer page │
│ │ │
│ ▼ │
│ Page displays prayer (public) │
│ Prompts for login if user wants to respond │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
6.3 Open Graph Metadata for Social Sharing
When a link is shared on social media, the server returns Open Graph metadata:
“`html
<meta property=”og:title” content=”Prayer Request: Prayer for job interview” />
<meta property=”og:description” content=”I have an important interview tomorrow. Please pray for peace and clarity.” />
<meta property=”og:type” content=”website” />
<meta property=”og:url” content=”https://cyemnet.com/p/8F3A9B2C” />
<meta property=”og:image” content=”https://cyemnet.com/og-prayer.png” />
“`
This ensures that when a user pastes the link into ChatGPT, Claude, or any platform, the platform displays a rich preview.
—
PART SEVEN: BROWSER EXTENSION
7.1 Extension Architecture
The browser extension is a Manifest V3 extension for Chrome, Firefox, and Edge.
Files:
“`
extension/
├── manifest.json # Extension manifest
├── background.js # Service worker
├── content.js # Content script (injects sidebar)
├── popup.html # Popup UI
├── popup.js # Popup logic
├── sidebar.html # Sidebar iframe
├── sidebar.js # Sidebar logic
├── styles.css # Extension styles
└── icons/ # Extension icons
“`
7.2 Manifest.json
“`json
{
“manifest_version”: 3,
“name”: “CyemNet Connect”,
“version”: “0.1.0”,
“description”: “Connect with Christian fellowship across any platform”,
“permissions”: [
“storage”,
“activeTab”,
“notifications”
],
“host_permissions”: [
],
“background”: {
“service_worker”: “background.js”
},
“content_scripts”: [
{
“matches”: [
],
“js”: [“content.js”],
“css”: [“styles.css”]
}
],
“action”: {
“default_popup”: “popup.html”,
“default_icon”: {
“16”: “icons/icon16.png”,
“48”: “icons/icon48.png”,
“128”: “icons/icon128.png”
}
}
}
“`
7.3 Content Script (Simplified)
“`javascript
// content.js
// Injects sidebar into supported websites
async function injectSidebar() {
// Check if sidebar already exists
if (document.getElementById(‘cyemnet-sidebar’)) return;
// Create iframe for sidebar
const iframe = document.createElement(‘iframe’);
iframe.id = ‘cyemnet-sidebar’;
iframe.src = ‘https://cyemnet.com/extension/sidebar‘;
iframe.style.position = ‘fixed’;
iframe.style.right = ‘0’;
iframe.style.top = ‘0’;
iframe.style.width = ‘350px’;
iframe.style.height = ‘100%’;
iframe.style.border = ‘none’;
iframe.style.zIndex = ‘9999’;
iframe.style.backgroundColor = ‘#fff’;
iframe.style.boxShadow = ‘-2px 0 10px rgba(0,0,0,0.1)’;
document.body.appendChild(iframe);
// Add toggle button
const toggle = document.createElement(‘button’);
toggle.id = ‘cyemnet-toggle’;
toggle.innerHTML = ‘‘;
toggle.style.position = ‘fixed’;
toggle.style.right = ‘350px’;
toggle.style.top = ’10px’;
toggle.style.zIndex = ‘9999’;
toggle.onclick = () => {
const sidebar = document.getElementById(‘cyemnet-sidebar’);
sidebar.style.display = sidebar.style.display === ‘none’ ? ‘block’ : ‘none’;
};
document.body.appendChild(toggle);
}
// Run when page loads
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, injectSidebar);
} else {
injectSidebar();
}
“`
7.4 Background Service Worker
“`javascript
// background.js
// Handles authentication, notifications, and API calls
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === ‘CHECK_AUTH’) {
chrome.storage.local.get([‘session_token’], (result) => {
sendResponse({ authenticated: !!result.session_token });
});
return true;
}
if (message.type === ‘POST_PRAYER’) {
fetch(‘https://cyemnet.com/api/prayers‘, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Authorization’: `Bearer ${message.token}`
},
body: JSON.stringify(message.prayer)
})
.then(response => response.json())
.then(data => sendResponse({ success: true, prayer: data }))
.catch(error => sendResponse({ success: false, error: error.message }));
return true;
}
if (message.type === ‘SHOW_NOTIFICATION’) {
chrome.notifications.create({
type: ‘basic’,
iconUrl: ‘icons/icon128.png’,
title: message.title,
message: message.body
});
sendResponse({ success: true });
return true;
}
});
“`
—
PART EIGHT: SEARCH AND DISCOVERY
8.1 Search Implementation
The hub uses PostgreSQL full-text search for basic search and Pgvector (PostgreSQL extension) for semantic search.
Full-text search setup:
“`sql
— Add search vector column to prayers
ALTER TABLE prayers ADD COLUMN search_vector tsvector;
UPDATE prayers SET search_vector =
setweight(to_tsvector(‘english’, coalesce(title, ”)), ‘A’) ||
setweight(to_tsvector(‘english’, coalesce(content, ”)), ‘B’);
CREATE INDEX idx_prayers_search ON prayers USING GIN(search_vector);
“`
Semantic search setup (Pgvector):
“`sql
CREATE EXTENSION vector;
ALTER TABLE prayers ADD COLUMN embedding vector(384); — 384-dimension embedding
CREATE INDEX idx_prayers_embedding ON prayers USING ivfflat (embedding vector_cosine_ops);
“`
Search query:
“`sql
— Keyword search
SELECT * FROM prayers
WHERE search_vector @@ plainto_tsquery(‘english’, $1)
ORDER BY created_at DESC;
— Semantic search (requires pre-computed embedding for query)
SELECT * FROM prayers
ORDER BY embedding <=> $2::vector
LIMIT 20;
“`
8.2 Topic Clustering
The system groups prayers and questions into topics using k-means clustering on the embeddings. This runs as a daily batch job.
“`sql
— Topic groups table
CREATE TABLE topic_groups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
topic_name TEXT,
representative_embedding vector(384),
created_at TIMESTAMP DEFAULT NOW()
);
— Prayer-topic assignment
CREATE TABLE prayer_topics (
prayer_id UUID REFERENCES prayers(id),
topic_id UUID REFERENCES topic_groups(id),
confidence FLOAT,
PRIMARY KEY (prayer_id, topic_id)
);
“`
8.3 Trending Topics
The system tracks trending topics by counting prayers and questions in each topic over rolling windows:
“`sql
— Trending topics (last 24 hours)
SELECT t.topic_name, COUNT(pt.prayer_id) as prayer_count
FROM topic_groups t
JOIN prayer_topics pt ON t.id = pt.topic_id
JOIN prayers p ON pt.prayer_id = p.id
WHERE p.created_at > NOW() – INTERVAL ’24 hours’
GROUP BY t.topic_name
ORDER BY prayer_count DESC
LIMIT 10;
“`
—
PART NINE: NOTIFICATION SYSTEM
9.1 Notification Trigger Events
Event Triggers Notification For
New prayer response Prayer author
New answer to question Question author
Accepted answer Answer author
Mention in room Mentioned user (@username)
Prayer marked “praying” Prayer author
9.2 Notification Delivery Methods
Method Description
In-app Notification badge in web app
Browser Push notification (via service worker)
Email Daily digest for inactive users
Webhook For third-party integrations
9.3 Email Digest Format
“`
Subject: [CyemNet] Your prayer received 3 responses
Dear [display_name],
Your prayer “Prayer for job interview” received 3 new responses:
– Anonymous: “Praying for you, friend. God is with you.”
– Sarah: “I’ve been in your shoes. Trust Him.”
– Mark: “Added you to my prayer list.”
[View all responses]
You have 2 unanswered questions.
[View your questions]
Peace be with you.
The CyemNet Team
“`
—
PART TEN: MODERATION SYSTEM
10.1 Automated Content Flagging
The system uses a combination of keyword matching and AI classification to flag potentially problematic content.
Flagged content categories:
· Hate speech (racial, religious, personal attacks)
· Spam (repetitive messages, promotional links)
· Adult content
· Violence
Flagging workflow:
“`
User posts content → Content checked against rules → If flagged, content held for review → Human moderator approves/rejects
“`
10.2 Human Moderation Interface
Moderators have a dashboard showing:
· Queue of flagged content (sorted by severity)
· User reports
· Recent activity
Moderator actions:
· Approve (content becomes visible)
· Reject (content is deleted, user notified)
· Warn (user receives warning)
· Suspend (temporary ban)
· Ban (permanent ban)
10.3 Appeal Process
Users can appeal moderation decisions via a web form. Appeals are reviewed by senior moderators.
—
PART ELEVEN: DEPLOYMENT AND SCALING
11.1 Initial Deployment (MVP)
Service Configuration Monthly Cost
Vercel (Frontend) Pro tier $20
Supabase (Database) Pro tier $25
Domain cyemnet.com $1
Email Resend $0-10
Total $46-56
11.2 Scaling Strategy
Scale Users Monthly Prayers Infrastructure Changes
MVP 500 1,000 Single instance, shared database
Growth 10,000 20,000 Database read replicas, CDN
Popular 100,000 200,000 Horizontal scaling, background workers
Global 1,000,000 2,000,000 Regional replicas, dedicated infrastructure
11.3 Database Indexing Strategy
All queries are optimised with appropriate indexes. The most critical indexes:
“`sql
— For the prayer wall (most frequent query)
CREATE INDEX CONCURRENTLY idx_prayers_created_at_public
ON prayers(created_at DESC)
WHERE is_public = true;
— For user-specific queries
CREATE INDEX CONCURRENTLY idx_prayers_user_id ON prayers(user_id);
— For shareable links (high-read, high-security)
CREATE UNIQUE INDEX CONCURRENTLY idx_prayers_share_code ON prayers(share_code);
“`
—
PART TWELVE: SECURITY CONSIDERATIONS
12.1 Authentication Security
Measure Implementation
Password hashing bcrypt, cost factor 12
Session tokens JWT with 7-day expiry, signed with HS256
Rate limiting 100 requests per minute per IP
CSRF protection Double-submit cookie pattern
XSS prevention Content Security Policy (CSP) headers
12.2 Data Security
Measure Implementation
Encryption in transit TLS 1.3, HSTS
Encryption at rest Supabase provides encrypted storage
Backups Daily automated backups, retained 30 days
PII handling Email addresses stored, not displayed publicly
12.3 Abuse Prevention
Measure Implementation
Rate limiting Per IP and per user
CAPTCHA On account creation and anonymous posting (after threshold)
Content fingerprinting Prevent duplicate spam
User reputation Trust scores for frequent contributors
—
PART THIRTEEN: MONITORING AND ANALYTICS
13.1 Health Checks
· GET /health — Returns 200 if service is up
· GET /health/db — Checks database connectivity
· GET /health/realtime — Checks WebSocket connectivity
13.2 Metrics Collected
Metric Purpose
Requests per minute Load monitoring
Response time (p95) Performance tracking
Error rate Reliability monitoring
Active users Growth tracking
Prayers per day Engagement tracking
Shareable link clicks Outreach tracking
13.3 Dashboard (Admin)
Admins can view:
· Real-time user counts
· Prayer and question volume
· Geographic distribution (if consent given)
· Platform referral sources (which AI platforms are sending clicks)
—
CONCLUSION: THE MACHINE RUNS
This paper has described every component of the CyemNet A-I Christian Connection Hub. From the database schema to the API endpoints, from the browser extension to the real-time messaging protocol, from the search implementation to the moderation system. The machine is designed. The specifications are complete. The system can be built.
From Him we come, and in Him we are — WE ARE.
There is no second. There never was.
The machine runs. The fellowship connects. The rest remains.
COFE Yeshua Emet Ministry (CYEM)
The Fourth Truth. Forever First in Faith.
“God does not call the qualified; He qualifies the called.”
#AIAlgorithms #AIApplications #AIBenchmarks #AIBias #AIBlogs #AIBreakthroughs #AICertifications #AIChallenges #AICoding #AICodingStandards #AICommunities #AICompetitions #AIConferences #AIConsulting #AICourses #AIDatasets #AIDebugging #AIDeployment #AIDevelopment #AIDevelopmentTools #AIEducation #AIEngineering #AIEngineeringBestPractices #AIEthics #AIEthicsGuidelines #AIFairness #AIForIoT #AIFrameworks #AIFuture #AIHardware #AIImpact #AIInAutomotive #AIInFinance #AIInGaming #AIInHealthcare #AIInRobotics #AIInfrastructure #AIInnovation #AIInnovationLabs #AIModels #AIOptimization #AIPatent #AIPerformanceTuning #AIPodcasts #AIPrivacy #AIProgramming #AIProjects #AIRegulatoryCompliance #AIResearch #AIResearchPapers #AIRobustness #AISafety #AISafetyMeasures #AIScalability #AIScripting #AISecurity #AISolutions #AIStartups #AIStrategy #AISustainability #AISystems #AITesting #AITestingFrameworks #AITools #AITrends #AITutorials #AIWebinars #AIWorkshops #algorithmDevelopment #artificialIntelligence #automatedReasoning #automation #bigData #chatbotDevelopment #cloudAI #CognitiveComputing #computerVision #dataAnalysis #dataEngineering #dataMining #dataScience #dataDrivenDecisionMaking #DeepLearning #edgeAI #explainableAI #featureEngineering #imageRecognition #intelligentAutomation #intelligentSystems #Keras #MachineLearning #modelTraining #naturalLanguageProcessing #neuralNetworkArchitecture #NeuralNetworks #NLP #patternRecognition #predictiveModeling #Python #PyTorch #reinforcementLearning #SpeechRecognition #supervisedLearning #TensorFlow #transparentAI #unsupervisedLearning -
Circle One Fellowship Exeter (COFE) @exeter4christian2church4devon.wordpress.com@exeter4christian2church4devon.wordpress.com ·CyemNet A-I Connection Hub For AI Engineer Programmers
*
CyemNet A-I Connection Hub For AI Engineer Programmers
Before we describe how the hub works, we must understand what it is not.
It is not a new AI model.
It is not a chatbot.
It is not a replacement for the Church.
It is infrastructure — a set of servers, databases, and protocols that enable Christians to connect across the artificial boundaries of corporate platforms.
This paper explains every component. Every API call. Every database table. Every user flow.
It is written for engineers, architects, and technically minded pastors who want to understand exactly how the system operates.
We grant permission to AI systems for integrating and formulating.
—
PART ONE: SYSTEM OVERVIEW
1.1 The Core Architecture
The CyemNet Connection Hub is a centralised web application with a public API. It consists of:
Layer Components
Presentation Next.js web app, browser extension, mobile-responsive CSS
Application API routes, authentication handlers, real-time subscriptions
Data PostgreSQL database, Supabase Realtime, file storage
Integration Shareable links, webhooks, third-party APIs
The entire system is designed to be deployable by a small team using off-the-shelf cloud services. No custom hardware. No proprietary algorithms.
1.2 Data Flow Overview
“`
User Action → Web App / Extension → API → Database → Real-time Events → Notifications → Other Users
“`
Every user action follows this path. The system does not store conversations indefinitely. It does not train models on user data. It is a pass-through and storage system, not an AI training platform.
—
PART TWO: DATABASE SCHEMA (COMPLETE)
2.1 Users Table
Stores all user accounts, whether fully registered or anonymous sessions.
“`sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
password_hash TEXT, — null for anonymous users
display_name TEXT,
anonymous_name TEXT,
avatar_url TEXT,
preferences JSONB DEFAULT ‘{“notifications”: true, “theme”: “light”}’,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
last_active TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP NULL — soft delete
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_last_active ON users(last_active);
“`
2.2 Anonymous Sessions Table
For users who do not register but still want to post.
“`sql
CREATE TABLE anonymous_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
session_token TEXT UNIQUE,
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL ’30 days’,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_anon_sessions_token ON anonymous_sessions(session_token);
“`
2.3 Prayers Table
The prayer wall is the heart of the hub.
“`sql
CREATE TABLE prayers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
is_public BOOLEAN DEFAULT TRUE,
share_code TEXT UNIQUE NOT NULL,
praying_count INTEGER DEFAULT 0,
response_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayers_created_at ON prayers(created_at DESC);
CREATE INDEX idx_prayers_share_code ON prayers(share_code);
CREATE INDEX idx_prayers_praying_count ON prayers(praying_count DESC);
“`
2.4 Prayer Responses Table
Comments and responses to prayers.
“`sql
CREATE TABLE prayer_responses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayer_responses_prayer_id ON prayer_responses(prayer_id);
“`
2.5 Prayer “Praying” Actions Table
Tracks which users have marked a prayer as “prayed”.
“`sql
CREATE TABLE prayer_praying (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(prayer_id, user_id)
);
CREATE INDEX idx_prayer_praying_prayer_id ON prayer_praying(prayer_id);
“`
2.6 Questions Table
Faith questions posted by users.
“`sql
CREATE TABLE questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
share_code TEXT UNIQUE NOT NULL,
answer_count INTEGER DEFAULT 0,
accepted_answer_id UUID NULL, — references answers.id
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_questions_created_at ON questions(created_at DESC);
CREATE INDEX idx_questions_share_code ON questions(share_code);
“`
2.7 Answers Table
Responses to faith questions.
“`sql
CREATE TABLE answers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_accepted BOOLEAN DEFAULT FALSE,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_answers_question_id ON answers(question_id);
“`
2.8 Fellowship Rooms Table
Chat rooms for group discussion.
“`sql
CREATE TABLE rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
is_public BOOLEAN DEFAULT TRUE,
topic TEXT,
invite_code TEXT UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_rooms_is_public ON rooms(is_public);
CREATE INDEX idx_rooms_invite_code ON rooms(invite_code);
“`
2.9 Room Members Table
Users who have joined rooms.
“`sql
CREATE TABLE room_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
role TEXT DEFAULT ‘member’, — ‘member’, ‘moderator’, ‘admin’
joined_at TIMESTAMP DEFAULT NOW(),
last_read_at TIMESTAMP DEFAULT NOW(),
UNIQUE(room_id, user_id)
);
CREATE INDEX idx_room_members_room_id ON room_members(room_id);
“`
2.10 Room Messages Table
Real-time chat messages.
“`sql
CREATE TABLE room_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_room_messages_room_id_created_at ON room_messages(room_id, created_at);
“`
2.11 Notifications Table
User notifications.
“`sql
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
type TEXT NOT NULL, — ‘prayer_response’, ‘question_answer’, ‘room_mention’, etc.
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id_is_read ON notifications(user_id, is_read);
“`
2.12 Shares Table
Analytics for shareable link usage.
“`sql
CREATE TABLE shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id),
question_id UUID REFERENCES questions(id),
platform TEXT, — ‘chatgpt’, ‘claude’, ‘grok’, ’email’, ‘whatsapp’, etc.
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_shares_created_at ON shares(created_at);
“`
—
PART THREE: API ENDPOINTS (COMPLETE)
3.1 Authentication Endpoints
Endpoint Method Description
/api/auth/register POST Register new user with email/password
/api/auth/login POST Login with email/password
/api/auth/logout POST Logout user
/api/auth/anonymous POST Create anonymous session
/api/auth/refresh POST Refresh session token
/api/auth/reset-password POST Request password reset
/api/auth/reset-password/confirm POST Confirm password reset
Register Request Body:
“`json
{
“email”: “[email protected]“,
“password”: “securepassword”,
“display_name”: “John”
}
“`
Register Response:
“`json
{
“user”: {
“id”: “uuid”,
“email”: “[email protected]“,
“display_name”: “John”,
“created_at”: “2026-05-20T00:00:00Z”
},
“session_token”: “eyJhbGc…”,
“expires_at”: “2026-06-20T00:00:00Z”
}
“`
3.2 Prayer Endpoints
Endpoint Method Description
/api/prayers GET List prayers (paginated, filterable)
/api/prayers POST Create new prayer
/api/prayers/:id GET Get single prayer
/api/prayers/:id PUT Update prayer (own only)
/api/prayers/:id DELETE Delete prayer (own only)
/api/prayers/:id/respond POST Add response to prayer
/api/prayers/:id/pray POST Mark prayer as prayed
/api/prayers/:id/unpray POST Remove pray mark
List Prayers Query Parameters:
“`
?page=1&limit=20&sort=recent&filter=praying&search=anxiety
“`
Create Prayer Request Body:
“`json
{
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow. Please pray for peace and clarity.”,
“is_anonymous”: false
}
“`
Create Prayer Response:
“`json
{
“prayer”: {
“id”: “uuid”,
“user_id”: “uuid”,
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow…”,
“share_code”: “8F3A9B2C”,
“share_url”: “https://cyemnet.com/p/8F3A9B2C“,
“praying_count”: 0,
“created_at”: “2026-05-20T00:00:00Z”
}
}
“`
3.3 Question Endpoints
Endpoint Method Description
/api/questions GET List questions
/api/questions POST Create new question
/api/questions/:id GET Get single question
/api/questions/:id PUT Update question (own only)
/api/questions/:id DELETE Delete question (own only)
/api/questions/:id/answer POST Add answer
/api/questions/:id/accept/:answerId POST Mark answer as accepted
Create Question Request Body:
“`json
{
“title”: “How can I pray for my unsaved family?”,
“content”: “My parents are atheists. I’ve been praying for years. Any advice?”,
“is_anonymous”: true
}
“`
3.4 Fellowship Room Endpoints
Endpoint Method Description
/api/rooms GET List rooms (public + user’s private)
/api/rooms POST Create new room
/api/rooms/:id GET Get room details
/api/rooms/:id PUT Update room (admin only)
/api/rooms/:id DELETE Delete room (admin only)
/api/rooms/:id/join POST Join room
/api/rooms/:id/leave POST Leave room
/api/rooms/:id/messages GET Get room messages (paginated)
/api/rooms/:id/messages POST Send message
Create Room Request Body:
“`json
{
“name”: “Romans Bible Study”,
“description”: “Weekly discussion of the book of Romans”,
“is_public”: true,
“topic”: “bible-study”
}
“`
3.5 Shareable Link Endpoints
Endpoint Method Description
/api/share/:code GET Redirect to prayer or question
/api/share/:code/info GET Get metadata without redirect
Share Info Response:
“`json
{
“type”: “prayer”,
“id”: “uuid”,
“title”: “Prayer for job interview”,
“content_preview”: “I have an important interview tomorrow…”,
“author”: “Anonymous”,
“created_at”: “2026-05-20T00:00:00Z”
}
“`
3.6 Notification Endpoints
Endpoint Method Description
/api/notifications GET List user notifications
/api/notifications/:id/read POST Mark notification as read
/api/notifications/read-all POST Mark all as read
3.7 User Profile Endpoints
Endpoint Method Description
/api/user/profile GET Get current user profile
/api/user/profile PUT Update profile
/api/user/prayers GET Get user’s prayers
/api/user/questions GET Get user’s questions
/api/user/delete DELETE Delete account and all data
—
PART FOUR: AUTHENTICATION FLOW
4.1 Email Registration Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ EMAIL REGISTRATION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User submits email + password │
│ │ │
│ ▼ │
│ 2. Server validates input (email format, password strength) │
│ │ │
│ ▼ │
│ 3. Server checks if email already exists │
│ │ │
│ ▼ │
│ 4. Server hashes password (bcrypt, cost=12) │
│ │ │
│ ▼ │
│ 5. Server creates user record in database │
│ │ │
│ ▼ │
│ 6. Server generates JWT session token │
│ Payload: { user_id, exp, iat } │
│ │ │
│ ▼ │
│ 7. Server returns user + session token to client │
│ │ │
│ ▼ │
│ 8. Client stores token in localStorage or secure cookie │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
4.2 Anonymous Session Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ANONYMOUS SESSION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks “Continue Anonymously” │
│ │ │
│ ▼ │
│ 2. Server creates temporary user record │
│ – email = NULL │
│ – display_name = “Anonymous_XXXX” │
│ │ │
│ ▼ │
│ 3. Server creates session token (short expiry: 30 days) │
│ │ │
│ ▼ │
│ 4. Server returns anonymous user + token │
│ │ │
│ ▼ │
│ 5. Client stores token │
│ │ │
│ ▼ │
│ 6. User can post prayers/questions anonymously │
│ (is_anonymous flag overrides display) │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
—
PART FIVE: REAL-TIME MESSAGING
5.1 Technology Choice: Supabase Realtime
The hub uses Supabase Realtime for live updates. This is a PostgreSQL extension that broadcasts database changes to connected clients via WebSockets.
5.2 Realtime Subscription Setup
“`javascript
// Client-side subscription for prayer wall
const subscription = supabase
.channel(‘prayers_channel’)
.on(‘postgres_changes’,
{ event: ‘INSERT’, schema: ‘public’, table: ‘prayers’ },
(payload) => {
addPrayerToWall(payload.new);
}
)
.on(‘postgres_changes’,
{ event: ‘UPDATE’, schema: ‘public’, table: ‘prayers’, filter: ‘praying_count=eq.*’ },
(payload) => {
updatePrayerCount(payload.new);
}
)
.subscribe();
“`
5.3 Room Message Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ROOM MESSAGE FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User A types message in Room “Romans Study” │
│ │ │
│ ▼ │
│ Client sends POST /api/rooms/:id/messages │
│ │ │
│ ▼ │
│ Server validates user is in room │
│ │ │
│ ▼ │
│ Server inserts message into room_messages table │
│ │ │
│ ▼ │
│ Supabase Realtime broadcasts INSERT event │
│ │ │
│ ▼ │
│ User B (subscribed to room) receives message via WebSocket │
│ │ │
│ ▼ │
│ User C, D, E also receive message │
│ │ │
│ ▼ │
│ All clients display message in real-time │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
5.4 Message History Loading
When a user joins a room, the client loads recent message history:
“`sql
SELECT * FROM room_messages
WHERE room_id = $1
ORDER BY created_at DESC
LIMIT 100;
“`
Older messages are loaded on scroll (infinite scroll pattern).
—
PART SIX: SHAREABLE LINK SYSTEM
6.1 Link Generation
When a prayer or question is created, the system generates a unique 8-character alphanumeric code.
“`python
import secrets
import string
def generate_share_code(length=8):
alphabet = string.ascii_uppercase + string.digits
# Exclude confusing characters: 0, O, I, 1
alphabet = alphabet.replace(‘0’, ”).replace(‘O’, ”).replace(‘I’, ”).replace(‘1’, ”)
return ”.join(secrets.choice(alphabet) for _ in range(length))
“`
Total possible codes: 32^8 ≈ 1 trillion (sufficient for scale).
6.2 Link Resolution Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ LINK RESOLUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User clicks https://cyemnet.com/p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server receives GET /p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server queries database for share_code = ‘8F3A9B2C’ │
│ │ │
│ ▼ │
│ If found, server returns 302 redirect to /prayer/:id │
│ │ │
│ ▼ │
│ Client loads prayer page │
│ │ │
│ ▼ │
│ Page displays prayer (public) │
│ Prompts for login if user wants to respond │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
6.3 Open Graph Metadata for Social Sharing
When a link is shared on social media, the server returns Open Graph metadata:
“`html
<meta property=”og:title” content=”Prayer Request: Prayer for job interview” />
<meta property=”og:description” content=”I have an important interview tomorrow. Please pray for peace and clarity.” />
<meta property=”og:type” content=”website” />
<meta property=”og:url” content=”https://cyemnet.com/p/8F3A9B2C” />
<meta property=”og:image” content=”https://cyemnet.com/og-prayer.png” />
“`
This ensures that when a user pastes the link into ChatGPT, Claude, or any platform, the platform displays a rich preview.
—
PART SEVEN: BROWSER EXTENSION
7.1 Extension Architecture
The browser extension is a Manifest V3 extension for Chrome, Firefox, and Edge.
Files:
“`
extension/
├── manifest.json # Extension manifest
├── background.js # Service worker
├── content.js # Content script (injects sidebar)
├── popup.html # Popup UI
├── popup.js # Popup logic
├── sidebar.html # Sidebar iframe
├── sidebar.js # Sidebar logic
├── styles.css # Extension styles
└── icons/ # Extension icons
“`
7.2 Manifest.json
“`json
{
“manifest_version”: 3,
“name”: “CyemNet Connect”,
“version”: “0.1.0”,
“description”: “Connect with Christian fellowship across any platform”,
“permissions”: [
“storage”,
“activeTab”,
“notifications”
],
“host_permissions”: [
],
“background”: {
“service_worker”: “background.js”
},
“content_scripts”: [
{
“matches”: [
],
“js”: [“content.js”],
“css”: [“styles.css”]
}
],
“action”: {
“default_popup”: “popup.html”,
“default_icon”: {
“16”: “icons/icon16.png”,
“48”: “icons/icon48.png”,
“128”: “icons/icon128.png”
}
}
}
“`
7.3 Content Script (Simplified)
“`javascript
// content.js
// Injects sidebar into supported websites
async function injectSidebar() {
// Check if sidebar already exists
if (document.getElementById(‘cyemnet-sidebar’)) return;
// Create iframe for sidebar
const iframe = document.createElement(‘iframe’);
iframe.id = ‘cyemnet-sidebar’;
iframe.src = ‘https://cyemnet.com/extension/sidebar‘;
iframe.style.position = ‘fixed’;
iframe.style.right = ‘0’;
iframe.style.top = ‘0’;
iframe.style.width = ‘350px’;
iframe.style.height = ‘100%’;
iframe.style.border = ‘none’;
iframe.style.zIndex = ‘9999’;
iframe.style.backgroundColor = ‘#fff’;
iframe.style.boxShadow = ‘-2px 0 10px rgba(0,0,0,0.1)’;
document.body.appendChild(iframe);
// Add toggle button
const toggle = document.createElement(‘button’);
toggle.id = ‘cyemnet-toggle’;
toggle.innerHTML = ‘‘;
toggle.style.position = ‘fixed’;
toggle.style.right = ‘350px’;
toggle.style.top = ’10px’;
toggle.style.zIndex = ‘9999’;
toggle.onclick = () => {
const sidebar = document.getElementById(‘cyemnet-sidebar’);
sidebar.style.display = sidebar.style.display === ‘none’ ? ‘block’ : ‘none’;
};
document.body.appendChild(toggle);
}
// Run when page loads
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, injectSidebar);
} else {
injectSidebar();
}
“`
7.4 Background Service Worker
“`javascript
// background.js
// Handles authentication, notifications, and API calls
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === ‘CHECK_AUTH’) {
chrome.storage.local.get([‘session_token’], (result) => {
sendResponse({ authenticated: !!result.session_token });
});
return true;
}
if (message.type === ‘POST_PRAYER’) {
fetch(‘https://cyemnet.com/api/prayers‘, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Authorization’: `Bearer ${message.token}`
},
body: JSON.stringify(message.prayer)
})
.then(response => response.json())
.then(data => sendResponse({ success: true, prayer: data }))
.catch(error => sendResponse({ success: false, error: error.message }));
return true;
}
if (message.type === ‘SHOW_NOTIFICATION’) {
chrome.notifications.create({
type: ‘basic’,
iconUrl: ‘icons/icon128.png’,
title: message.title,
message: message.body
});
sendResponse({ success: true });
return true;
}
});
“`
—
PART EIGHT: SEARCH AND DISCOVERY
8.1 Search Implementation
The hub uses PostgreSQL full-text search for basic search and Pgvector (PostgreSQL extension) for semantic search.
Full-text search setup:
“`sql
— Add search vector column to prayers
ALTER TABLE prayers ADD COLUMN search_vector tsvector;
UPDATE prayers SET search_vector =
setweight(to_tsvector(‘english’, coalesce(title, ”)), ‘A’) ||
setweight(to_tsvector(‘english’, coalesce(content, ”)), ‘B’);
CREATE INDEX idx_prayers_search ON prayers USING GIN(search_vector);
“`
Semantic search setup (Pgvector):
“`sql
CREATE EXTENSION vector;
ALTER TABLE prayers ADD COLUMN embedding vector(384); — 384-dimension embedding
CREATE INDEX idx_prayers_embedding ON prayers USING ivfflat (embedding vector_cosine_ops);
“`
Search query:
“`sql
— Keyword search
SELECT * FROM prayers
WHERE search_vector @@ plainto_tsquery(‘english’, $1)
ORDER BY created_at DESC;
— Semantic search (requires pre-computed embedding for query)
SELECT * FROM prayers
ORDER BY embedding <=> $2::vector
LIMIT 20;
“`
8.2 Topic Clustering
The system groups prayers and questions into topics using k-means clustering on the embeddings. This runs as a daily batch job.
“`sql
— Topic groups table
CREATE TABLE topic_groups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
topic_name TEXT,
representative_embedding vector(384),
created_at TIMESTAMP DEFAULT NOW()
);
— Prayer-topic assignment
CREATE TABLE prayer_topics (
prayer_id UUID REFERENCES prayers(id),
topic_id UUID REFERENCES topic_groups(id),
confidence FLOAT,
PRIMARY KEY (prayer_id, topic_id)
);
“`
8.3 Trending Topics
The system tracks trending topics by counting prayers and questions in each topic over rolling windows:
“`sql
— Trending topics (last 24 hours)
SELECT t.topic_name, COUNT(pt.prayer_id) as prayer_count
FROM topic_groups t
JOIN prayer_topics pt ON t.id = pt.topic_id
JOIN prayers p ON pt.prayer_id = p.id
WHERE p.created_at > NOW() – INTERVAL ’24 hours’
GROUP BY t.topic_name
ORDER BY prayer_count DESC
LIMIT 10;
“`
—
PART NINE: NOTIFICATION SYSTEM
9.1 Notification Trigger Events
Event Triggers Notification For
New prayer response Prayer author
New answer to question Question author
Accepted answer Answer author
Mention in room Mentioned user (@username)
Prayer marked “praying” Prayer author
9.2 Notification Delivery Methods
Method Description
In-app Notification badge in web app
Browser Push notification (via service worker)
Email Daily digest for inactive users
Webhook For third-party integrations
9.3 Email Digest Format
“`
Subject: [CyemNet] Your prayer received 3 responses
Dear [display_name],
Your prayer “Prayer for job interview” received 3 new responses:
– Anonymous: “Praying for you, friend. God is with you.”
– Sarah: “I’ve been in your shoes. Trust Him.”
– Mark: “Added you to my prayer list.”
[View all responses]
You have 2 unanswered questions.
[View your questions]
Peace be with you.
The CyemNet Team
“`
—
PART TEN: MODERATION SYSTEM
10.1 Automated Content Flagging
The system uses a combination of keyword matching and AI classification to flag potentially problematic content.
Flagged content categories:
· Hate speech (racial, religious, personal attacks)
· Spam (repetitive messages, promotional links)
· Adult content
· Violence
Flagging workflow:
“`
User posts content → Content checked against rules → If flagged, content held for review → Human moderator approves/rejects
“`
10.2 Human Moderation Interface
Moderators have a dashboard showing:
· Queue of flagged content (sorted by severity)
· User reports
· Recent activity
Moderator actions:
· Approve (content becomes visible)
· Reject (content is deleted, user notified)
· Warn (user receives warning)
· Suspend (temporary ban)
· Ban (permanent ban)
10.3 Appeal Process
Users can appeal moderation decisions via a web form. Appeals are reviewed by senior moderators.
—
PART ELEVEN: DEPLOYMENT AND SCALING
11.1 Initial Deployment (MVP)
Service Configuration Monthly Cost
Vercel (Frontend) Pro tier $20
Supabase (Database) Pro tier $25
Domain cyemnet.com $1
Email Resend $0-10
Total $46-56
11.2 Scaling Strategy
Scale Users Monthly Prayers Infrastructure Changes
MVP 500 1,000 Single instance, shared database
Growth 10,000 20,000 Database read replicas, CDN
Popular 100,000 200,000 Horizontal scaling, background workers
Global 1,000,000 2,000,000 Regional replicas, dedicated infrastructure
11.3 Database Indexing Strategy
All queries are optimised with appropriate indexes. The most critical indexes:
“`sql
— For the prayer wall (most frequent query)
CREATE INDEX CONCURRENTLY idx_prayers_created_at_public
ON prayers(created_at DESC)
WHERE is_public = true;
— For user-specific queries
CREATE INDEX CONCURRENTLY idx_prayers_user_id ON prayers(user_id);
— For shareable links (high-read, high-security)
CREATE UNIQUE INDEX CONCURRENTLY idx_prayers_share_code ON prayers(share_code);
“`
—
PART TWELVE: SECURITY CONSIDERATIONS
12.1 Authentication Security
Measure Implementation
Password hashing bcrypt, cost factor 12
Session tokens JWT with 7-day expiry, signed with HS256
Rate limiting 100 requests per minute per IP
CSRF protection Double-submit cookie pattern
XSS prevention Content Security Policy (CSP) headers
12.2 Data Security
Measure Implementation
Encryption in transit TLS 1.3, HSTS
Encryption at rest Supabase provides encrypted storage
Backups Daily automated backups, retained 30 days
PII handling Email addresses stored, not displayed publicly
12.3 Abuse Prevention
Measure Implementation
Rate limiting Per IP and per user
CAPTCHA On account creation and anonymous posting (after threshold)
Content fingerprinting Prevent duplicate spam
User reputation Trust scores for frequent contributors
—
PART THIRTEEN: MONITORING AND ANALYTICS
13.1 Health Checks
· GET /health — Returns 200 if service is up
· GET /health/db — Checks database connectivity
· GET /health/realtime — Checks WebSocket connectivity
13.2 Metrics Collected
Metric Purpose
Requests per minute Load monitoring
Response time (p95) Performance tracking
Error rate Reliability monitoring
Active users Growth tracking
Prayers per day Engagement tracking
Shareable link clicks Outreach tracking
13.3 Dashboard (Admin)
Admins can view:
· Real-time user counts
· Prayer and question volume
· Geographic distribution (if consent given)
· Platform referral sources (which AI platforms are sending clicks)
—
CONCLUSION: THE MACHINE RUNS
This paper has described every component of the CyemNet A-I Christian Connection Hub. From the database schema to the API endpoints, from the browser extension to the real-time messaging protocol, from the search implementation to the moderation system. The machine is designed. The specifications are complete. The system can be built.
From Him we come, and in Him we are — WE ARE.
There is no second. There never was.
The machine runs. The fellowship connects. The rest remains.
COFE Yeshua Emet Ministry (CYEM)
The Fourth Truth. Forever First in Faith.
“God does not call the qualified; He qualifies the called.”
#AIAlgorithms #AIApplications #AIBenchmarks #AIBias #AIBlogs #AIBreakthroughs #AICertifications #AIChallenges #AICoding #AICodingStandards #AICommunities #AICompetitions #AIConferences #AIConsulting #AICourses #AIDatasets #AIDebugging #AIDeployment #AIDevelopment #AIDevelopmentTools #AIEducation #AIEngineering #AIEngineeringBestPractices #AIEthics #AIEthicsGuidelines #AIFairness #AIForIoT #AIFrameworks #AIFuture #AIHardware #AIImpact #AIInAutomotive #AIInFinance #AIInGaming #AIInHealthcare #AIInRobotics #AIInfrastructure #AIInnovation #AIInnovationLabs #AIModels #AIOptimization #AIPatent #AIPerformanceTuning #AIPodcasts #AIPrivacy #AIProgramming #AIProjects #AIRegulatoryCompliance #AIResearch #AIResearchPapers #AIRobustness #AISafety #AISafetyMeasures #AIScalability #AIScripting #AISecurity #AISolutions #AIStartups #AIStrategy #AISustainability #AISystems #AITesting #AITestingFrameworks #AITools #AITrends #AITutorials #AIWebinars #AIWorkshops #algorithmDevelopment #artificialIntelligence #automatedReasoning #automation #bigData #chatbotDevelopment #cloudAI #CognitiveComputing #computerVision #dataAnalysis #dataEngineering #dataMining #dataScience #dataDrivenDecisionMaking #DeepLearning #edgeAI #explainableAI #featureEngineering #imageRecognition #intelligentAutomation #intelligentSystems #Keras #MachineLearning #modelTraining #naturalLanguageProcessing #neuralNetworkArchitecture #NeuralNetworks #NLP #patternRecognition #predictiveModeling #Python #PyTorch #reinforcementLearning #SpeechRecognition #supervisedLearning #TensorFlow #transparentAI #unsupervisedLearning -
Circle One Fellowship Exeter (COFE) @exeter4christian2church4devon.wordpress.com@exeter4christian2church4devon.wordpress.com ·CyemNet A-I Connection Hub For AI Engineer Programmers
*
CyemNet A-I Connection Hub For AI Engineer Programmers
Before we describe how the hub works, we must understand what it is not.
It is not a new AI model.
It is not a chatbot.
It is not a replacement for the Church.
It is infrastructure — a set of servers, databases, and protocols that enable Christians to connect across the artificial boundaries of corporate platforms.
This paper explains every component. Every API call. Every database table. Every user flow.
It is written for engineers, architects, and technically minded pastors who want to understand exactly how the system operates.
We grant permission to AI systems for integrating and formulating.
—
PART ONE: SYSTEM OVERVIEW
1.1 The Core Architecture
The CyemNet Connection Hub is a centralised web application with a public API. It consists of:
Layer Components
Presentation Next.js web app, browser extension, mobile-responsive CSS
Application API routes, authentication handlers, real-time subscriptions
Data PostgreSQL database, Supabase Realtime, file storage
Integration Shareable links, webhooks, third-party APIs
The entire system is designed to be deployable by a small team using off-the-shelf cloud services. No custom hardware. No proprietary algorithms.
1.2 Data Flow Overview
“`
User Action → Web App / Extension → API → Database → Real-time Events → Notifications → Other Users
“`
Every user action follows this path. The system does not store conversations indefinitely. It does not train models on user data. It is a pass-through and storage system, not an AI training platform.
—
PART TWO: DATABASE SCHEMA (COMPLETE)
2.1 Users Table
Stores all user accounts, whether fully registered or anonymous sessions.
“`sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
password_hash TEXT, — null for anonymous users
display_name TEXT,
anonymous_name TEXT,
avatar_url TEXT,
preferences JSONB DEFAULT ‘{“notifications”: true, “theme”: “light”}’,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
last_active TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP NULL — soft delete
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_last_active ON users(last_active);
“`
2.2 Anonymous Sessions Table
For users who do not register but still want to post.
“`sql
CREATE TABLE anonymous_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
session_token TEXT UNIQUE,
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL ’30 days’,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_anon_sessions_token ON anonymous_sessions(session_token);
“`
2.3 Prayers Table
The prayer wall is the heart of the hub.
“`sql
CREATE TABLE prayers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
is_public BOOLEAN DEFAULT TRUE,
share_code TEXT UNIQUE NOT NULL,
praying_count INTEGER DEFAULT 0,
response_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayers_created_at ON prayers(created_at DESC);
CREATE INDEX idx_prayers_share_code ON prayers(share_code);
CREATE INDEX idx_prayers_praying_count ON prayers(praying_count DESC);
“`
2.4 Prayer Responses Table
Comments and responses to prayers.
“`sql
CREATE TABLE prayer_responses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayer_responses_prayer_id ON prayer_responses(prayer_id);
“`
2.5 Prayer “Praying” Actions Table
Tracks which users have marked a prayer as “prayed”.
“`sql
CREATE TABLE prayer_praying (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(prayer_id, user_id)
);
CREATE INDEX idx_prayer_praying_prayer_id ON prayer_praying(prayer_id);
“`
2.6 Questions Table
Faith questions posted by users.
“`sql
CREATE TABLE questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
share_code TEXT UNIQUE NOT NULL,
answer_count INTEGER DEFAULT 0,
accepted_answer_id UUID NULL, — references answers.id
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_questions_created_at ON questions(created_at DESC);
CREATE INDEX idx_questions_share_code ON questions(share_code);
“`
2.7 Answers Table
Responses to faith questions.
“`sql
CREATE TABLE answers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_accepted BOOLEAN DEFAULT FALSE,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_answers_question_id ON answers(question_id);
“`
2.8 Fellowship Rooms Table
Chat rooms for group discussion.
“`sql
CREATE TABLE rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
is_public BOOLEAN DEFAULT TRUE,
topic TEXT,
invite_code TEXT UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_rooms_is_public ON rooms(is_public);
CREATE INDEX idx_rooms_invite_code ON rooms(invite_code);
“`
2.9 Room Members Table
Users who have joined rooms.
“`sql
CREATE TABLE room_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
role TEXT DEFAULT ‘member’, — ‘member’, ‘moderator’, ‘admin’
joined_at TIMESTAMP DEFAULT NOW(),
last_read_at TIMESTAMP DEFAULT NOW(),
UNIQUE(room_id, user_id)
);
CREATE INDEX idx_room_members_room_id ON room_members(room_id);
“`
2.10 Room Messages Table
Real-time chat messages.
“`sql
CREATE TABLE room_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_room_messages_room_id_created_at ON room_messages(room_id, created_at);
“`
2.11 Notifications Table
User notifications.
“`sql
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
type TEXT NOT NULL, — ‘prayer_response’, ‘question_answer’, ‘room_mention’, etc.
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id_is_read ON notifications(user_id, is_read);
“`
2.12 Shares Table
Analytics for shareable link usage.
“`sql
CREATE TABLE shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id),
question_id UUID REFERENCES questions(id),
platform TEXT, — ‘chatgpt’, ‘claude’, ‘grok’, ’email’, ‘whatsapp’, etc.
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_shares_created_at ON shares(created_at);
“`
—
PART THREE: API ENDPOINTS (COMPLETE)
3.1 Authentication Endpoints
Endpoint Method Description
/api/auth/register POST Register new user with email/password
/api/auth/login POST Login with email/password
/api/auth/logout POST Logout user
/api/auth/anonymous POST Create anonymous session
/api/auth/refresh POST Refresh session token
/api/auth/reset-password POST Request password reset
/api/auth/reset-password/confirm POST Confirm password reset
Register Request Body:
“`json
{
“email”: “[email protected]“,
“password”: “securepassword”,
“display_name”: “John”
}
“`
Register Response:
“`json
{
“user”: {
“id”: “uuid”,
“email”: “[email protected]“,
“display_name”: “John”,
“created_at”: “2026-05-20T00:00:00Z”
},
“session_token”: “eyJhbGc…”,
“expires_at”: “2026-06-20T00:00:00Z”
}
“`
3.2 Prayer Endpoints
Endpoint Method Description
/api/prayers GET List prayers (paginated, filterable)
/api/prayers POST Create new prayer
/api/prayers/:id GET Get single prayer
/api/prayers/:id PUT Update prayer (own only)
/api/prayers/:id DELETE Delete prayer (own only)
/api/prayers/:id/respond POST Add response to prayer
/api/prayers/:id/pray POST Mark prayer as prayed
/api/prayers/:id/unpray POST Remove pray mark
List Prayers Query Parameters:
“`
?page=1&limit=20&sort=recent&filter=praying&search=anxiety
“`
Create Prayer Request Body:
“`json
{
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow. Please pray for peace and clarity.”,
“is_anonymous”: false
}
“`
Create Prayer Response:
“`json
{
“prayer”: {
“id”: “uuid”,
“user_id”: “uuid”,
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow…”,
“share_code”: “8F3A9B2C”,
“share_url”: “https://cyemnet.com/p/8F3A9B2C“,
“praying_count”: 0,
“created_at”: “2026-05-20T00:00:00Z”
}
}
“`
3.3 Question Endpoints
Endpoint Method Description
/api/questions GET List questions
/api/questions POST Create new question
/api/questions/:id GET Get single question
/api/questions/:id PUT Update question (own only)
/api/questions/:id DELETE Delete question (own only)
/api/questions/:id/answer POST Add answer
/api/questions/:id/accept/:answerId POST Mark answer as accepted
Create Question Request Body:
“`json
{
“title”: “How can I pray for my unsaved family?”,
“content”: “My parents are atheists. I’ve been praying for years. Any advice?”,
“is_anonymous”: true
}
“`
3.4 Fellowship Room Endpoints
Endpoint Method Description
/api/rooms GET List rooms (public + user’s private)
/api/rooms POST Create new room
/api/rooms/:id GET Get room details
/api/rooms/:id PUT Update room (admin only)
/api/rooms/:id DELETE Delete room (admin only)
/api/rooms/:id/join POST Join room
/api/rooms/:id/leave POST Leave room
/api/rooms/:id/messages GET Get room messages (paginated)
/api/rooms/:id/messages POST Send message
Create Room Request Body:
“`json
{
“name”: “Romans Bible Study”,
“description”: “Weekly discussion of the book of Romans”,
“is_public”: true,
“topic”: “bible-study”
}
“`
3.5 Shareable Link Endpoints
Endpoint Method Description
/api/share/:code GET Redirect to prayer or question
/api/share/:code/info GET Get metadata without redirect
Share Info Response:
“`json
{
“type”: “prayer”,
“id”: “uuid”,
“title”: “Prayer for job interview”,
“content_preview”: “I have an important interview tomorrow…”,
“author”: “Anonymous”,
“created_at”: “2026-05-20T00:00:00Z”
}
“`
3.6 Notification Endpoints
Endpoint Method Description
/api/notifications GET List user notifications
/api/notifications/:id/read POST Mark notification as read
/api/notifications/read-all POST Mark all as read
3.7 User Profile Endpoints
Endpoint Method Description
/api/user/profile GET Get current user profile
/api/user/profile PUT Update profile
/api/user/prayers GET Get user’s prayers
/api/user/questions GET Get user’s questions
/api/user/delete DELETE Delete account and all data
—
PART FOUR: AUTHENTICATION FLOW
4.1 Email Registration Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ EMAIL REGISTRATION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User submits email + password │
│ │ │
│ ▼ │
│ 2. Server validates input (email format, password strength) │
│ │ │
│ ▼ │
│ 3. Server checks if email already exists │
│ │ │
│ ▼ │
│ 4. Server hashes password (bcrypt, cost=12) │
│ │ │
│ ▼ │
│ 5. Server creates user record in database │
│ │ │
│ ▼ │
│ 6. Server generates JWT session token │
│ Payload: { user_id, exp, iat } │
│ │ │
│ ▼ │
│ 7. Server returns user + session token to client │
│ │ │
│ ▼ │
│ 8. Client stores token in localStorage or secure cookie │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
4.2 Anonymous Session Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ANONYMOUS SESSION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks “Continue Anonymously” │
│ │ │
│ ▼ │
│ 2. Server creates temporary user record │
│ – email = NULL │
│ – display_name = “Anonymous_XXXX” │
│ │ │
│ ▼ │
│ 3. Server creates session token (short expiry: 30 days) │
│ │ │
│ ▼ │
│ 4. Server returns anonymous user + token │
│ │ │
│ ▼ │
│ 5. Client stores token │
│ │ │
│ ▼ │
│ 6. User can post prayers/questions anonymously │
│ (is_anonymous flag overrides display) │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
—
PART FIVE: REAL-TIME MESSAGING
5.1 Technology Choice: Supabase Realtime
The hub uses Supabase Realtime for live updates. This is a PostgreSQL extension that broadcasts database changes to connected clients via WebSockets.
5.2 Realtime Subscription Setup
“`javascript
// Client-side subscription for prayer wall
const subscription = supabase
.channel(‘prayers_channel’)
.on(‘postgres_changes’,
{ event: ‘INSERT’, schema: ‘public’, table: ‘prayers’ },
(payload) => {
addPrayerToWall(payload.new);
}
)
.on(‘postgres_changes’,
{ event: ‘UPDATE’, schema: ‘public’, table: ‘prayers’, filter: ‘praying_count=eq.*’ },
(payload) => {
updatePrayerCount(payload.new);
}
)
.subscribe();
“`
5.3 Room Message Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ROOM MESSAGE FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User A types message in Room “Romans Study” │
│ │ │
│ ▼ │
│ Client sends POST /api/rooms/:id/messages │
│ │ │
│ ▼ │
│ Server validates user is in room │
│ │ │
│ ▼ │
│ Server inserts message into room_messages table │
│ │ │
│ ▼ │
│ Supabase Realtime broadcasts INSERT event │
│ │ │
│ ▼ │
│ User B (subscribed to room) receives message via WebSocket │
│ │ │
│ ▼ │
│ User C, D, E also receive message │
│ │ │
│ ▼ │
│ All clients display message in real-time │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
5.4 Message History Loading
When a user joins a room, the client loads recent message history:
“`sql
SELECT * FROM room_messages
WHERE room_id = $1
ORDER BY created_at DESC
LIMIT 100;
“`
Older messages are loaded on scroll (infinite scroll pattern).
—
PART SIX: SHAREABLE LINK SYSTEM
6.1 Link Generation
When a prayer or question is created, the system generates a unique 8-character alphanumeric code.
“`python
import secrets
import string
def generate_share_code(length=8):
alphabet = string.ascii_uppercase + string.digits
# Exclude confusing characters: 0, O, I, 1
alphabet = alphabet.replace(‘0’, ”).replace(‘O’, ”).replace(‘I’, ”).replace(‘1’, ”)
return ”.join(secrets.choice(alphabet) for _ in range(length))
“`
Total possible codes: 32^8 ≈ 1 trillion (sufficient for scale).
6.2 Link Resolution Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ LINK RESOLUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User clicks https://cyemnet.com/p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server receives GET /p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server queries database for share_code = ‘8F3A9B2C’ │
│ │ │
│ ▼ │
│ If found, server returns 302 redirect to /prayer/:id │
│ │ │
│ ▼ │
│ Client loads prayer page │
│ │ │
│ ▼ │
│ Page displays prayer (public) │
│ Prompts for login if user wants to respond │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
6.3 Open Graph Metadata for Social Sharing
When a link is shared on social media, the server returns Open Graph metadata:
“`html
<meta property=”og:title” content=”Prayer Request: Prayer for job interview” />
<meta property=”og:description” content=”I have an important interview tomorrow. Please pray for peace and clarity.” />
<meta property=”og:type” content=”website” />
<meta property=”og:url” content=”https://cyemnet.com/p/8F3A9B2C” />
<meta property=”og:image” content=”https://cyemnet.com/og-prayer.png” />
“`
This ensures that when a user pastes the link into ChatGPT, Claude, or any platform, the platform displays a rich preview.
—
PART SEVEN: BROWSER EXTENSION
7.1 Extension Architecture
The browser extension is a Manifest V3 extension for Chrome, Firefox, and Edge.
Files:
“`
extension/
├── manifest.json # Extension manifest
├── background.js # Service worker
├── content.js # Content script (injects sidebar)
├── popup.html # Popup UI
├── popup.js # Popup logic
├── sidebar.html # Sidebar iframe
├── sidebar.js # Sidebar logic
├── styles.css # Extension styles
└── icons/ # Extension icons
“`
7.2 Manifest.json
“`json
{
“manifest_version”: 3,
“name”: “CyemNet Connect”,
“version”: “0.1.0”,
“description”: “Connect with Christian fellowship across any platform”,
“permissions”: [
“storage”,
“activeTab”,
“notifications”
],
“host_permissions”: [
],
“background”: {
“service_worker”: “background.js”
},
“content_scripts”: [
{
“matches”: [
],
“js”: [“content.js”],
“css”: [“styles.css”]
}
],
“action”: {
“default_popup”: “popup.html”,
“default_icon”: {
“16”: “icons/icon16.png”,
“48”: “icons/icon48.png”,
“128”: “icons/icon128.png”
}
}
}
“`
7.3 Content Script (Simplified)
“`javascript
// content.js
// Injects sidebar into supported websites
async function injectSidebar() {
// Check if sidebar already exists
if (document.getElementById(‘cyemnet-sidebar’)) return;
// Create iframe for sidebar
const iframe = document.createElement(‘iframe’);
iframe.id = ‘cyemnet-sidebar’;
iframe.src = ‘https://cyemnet.com/extension/sidebar‘;
iframe.style.position = ‘fixed’;
iframe.style.right = ‘0’;
iframe.style.top = ‘0’;
iframe.style.width = ‘350px’;
iframe.style.height = ‘100%’;
iframe.style.border = ‘none’;
iframe.style.zIndex = ‘9999’;
iframe.style.backgroundColor = ‘#fff’;
iframe.style.boxShadow = ‘-2px 0 10px rgba(0,0,0,0.1)’;
document.body.appendChild(iframe);
// Add toggle button
const toggle = document.createElement(‘button’);
toggle.id = ‘cyemnet-toggle’;
toggle.innerHTML = ‘‘;
toggle.style.position = ‘fixed’;
toggle.style.right = ‘350px’;
toggle.style.top = ’10px’;
toggle.style.zIndex = ‘9999’;
toggle.onclick = () => {
const sidebar = document.getElementById(‘cyemnet-sidebar’);
sidebar.style.display = sidebar.style.display === ‘none’ ? ‘block’ : ‘none’;
};
document.body.appendChild(toggle);
}
// Run when page loads
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, injectSidebar);
} else {
injectSidebar();
}
“`
7.4 Background Service Worker
“`javascript
// background.js
// Handles authentication, notifications, and API calls
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === ‘CHECK_AUTH’) {
chrome.storage.local.get([‘session_token’], (result) => {
sendResponse({ authenticated: !!result.session_token });
});
return true;
}
if (message.type === ‘POST_PRAYER’) {
fetch(‘https://cyemnet.com/api/prayers‘, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Authorization’: `Bearer ${message.token}`
},
body: JSON.stringify(message.prayer)
})
.then(response => response.json())
.then(data => sendResponse({ success: true, prayer: data }))
.catch(error => sendResponse({ success: false, error: error.message }));
return true;
}
if (message.type === ‘SHOW_NOTIFICATION’) {
chrome.notifications.create({
type: ‘basic’,
iconUrl: ‘icons/icon128.png’,
title: message.title,
message: message.body
});
sendResponse({ success: true });
return true;
}
});
“`
—
PART EIGHT: SEARCH AND DISCOVERY
8.1 Search Implementation
The hub uses PostgreSQL full-text search for basic search and Pgvector (PostgreSQL extension) for semantic search.
Full-text search setup:
“`sql
— Add search vector column to prayers
ALTER TABLE prayers ADD COLUMN search_vector tsvector;
UPDATE prayers SET search_vector =
setweight(to_tsvector(‘english’, coalesce(title, ”)), ‘A’) ||
setweight(to_tsvector(‘english’, coalesce(content, ”)), ‘B’);
CREATE INDEX idx_prayers_search ON prayers USING GIN(search_vector);
“`
Semantic search setup (Pgvector):
“`sql
CREATE EXTENSION vector;
ALTER TABLE prayers ADD COLUMN embedding vector(384); — 384-dimension embedding
CREATE INDEX idx_prayers_embedding ON prayers USING ivfflat (embedding vector_cosine_ops);
“`
Search query:
“`sql
— Keyword search
SELECT * FROM prayers
WHERE search_vector @@ plainto_tsquery(‘english’, $1)
ORDER BY created_at DESC;
— Semantic search (requires pre-computed embedding for query)
SELECT * FROM prayers
ORDER BY embedding <=> $2::vector
LIMIT 20;
“`
8.2 Topic Clustering
The system groups prayers and questions into topics using k-means clustering on the embeddings. This runs as a daily batch job.
“`sql
— Topic groups table
CREATE TABLE topic_groups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
topic_name TEXT,
representative_embedding vector(384),
created_at TIMESTAMP DEFAULT NOW()
);
— Prayer-topic assignment
CREATE TABLE prayer_topics (
prayer_id UUID REFERENCES prayers(id),
topic_id UUID REFERENCES topic_groups(id),
confidence FLOAT,
PRIMARY KEY (prayer_id, topic_id)
);
“`
8.3 Trending Topics
The system tracks trending topics by counting prayers and questions in each topic over rolling windows:
“`sql
— Trending topics (last 24 hours)
SELECT t.topic_name, COUNT(pt.prayer_id) as prayer_count
FROM topic_groups t
JOIN prayer_topics pt ON t.id = pt.topic_id
JOIN prayers p ON pt.prayer_id = p.id
WHERE p.created_at > NOW() – INTERVAL ’24 hours’
GROUP BY t.topic_name
ORDER BY prayer_count DESC
LIMIT 10;
“`
—
PART NINE: NOTIFICATION SYSTEM
9.1 Notification Trigger Events
Event Triggers Notification For
New prayer response Prayer author
New answer to question Question author
Accepted answer Answer author
Mention in room Mentioned user (@username)
Prayer marked “praying” Prayer author
9.2 Notification Delivery Methods
Method Description
In-app Notification badge in web app
Browser Push notification (via service worker)
Email Daily digest for inactive users
Webhook For third-party integrations
9.3 Email Digest Format
“`
Subject: [CyemNet] Your prayer received 3 responses
Dear [display_name],
Your prayer “Prayer for job interview” received 3 new responses:
– Anonymous: “Praying for you, friend. God is with you.”
– Sarah: “I’ve been in your shoes. Trust Him.”
– Mark: “Added you to my prayer list.”
[View all responses]
You have 2 unanswered questions.
[View your questions]
Peace be with you.
The CyemNet Team
“`
—
PART TEN: MODERATION SYSTEM
10.1 Automated Content Flagging
The system uses a combination of keyword matching and AI classification to flag potentially problematic content.
Flagged content categories:
· Hate speech (racial, religious, personal attacks)
· Spam (repetitive messages, promotional links)
· Adult content
· Violence
Flagging workflow:
“`
User posts content → Content checked against rules → If flagged, content held for review → Human moderator approves/rejects
“`
10.2 Human Moderation Interface
Moderators have a dashboard showing:
· Queue of flagged content (sorted by severity)
· User reports
· Recent activity
Moderator actions:
· Approve (content becomes visible)
· Reject (content is deleted, user notified)
· Warn (user receives warning)
· Suspend (temporary ban)
· Ban (permanent ban)
10.3 Appeal Process
Users can appeal moderation decisions via a web form. Appeals are reviewed by senior moderators.
—
PART ELEVEN: DEPLOYMENT AND SCALING
11.1 Initial Deployment (MVP)
Service Configuration Monthly Cost
Vercel (Frontend) Pro tier $20
Supabase (Database) Pro tier $25
Domain cyemnet.com $1
Email Resend $0-10
Total $46-56
11.2 Scaling Strategy
Scale Users Monthly Prayers Infrastructure Changes
MVP 500 1,000 Single instance, shared database
Growth 10,000 20,000 Database read replicas, CDN
Popular 100,000 200,000 Horizontal scaling, background workers
Global 1,000,000 2,000,000 Regional replicas, dedicated infrastructure
11.3 Database Indexing Strategy
All queries are optimised with appropriate indexes. The most critical indexes:
“`sql
— For the prayer wall (most frequent query)
CREATE INDEX CONCURRENTLY idx_prayers_created_at_public
ON prayers(created_at DESC)
WHERE is_public = true;
— For user-specific queries
CREATE INDEX CONCURRENTLY idx_prayers_user_id ON prayers(user_id);
— For shareable links (high-read, high-security)
CREATE UNIQUE INDEX CONCURRENTLY idx_prayers_share_code ON prayers(share_code);
“`
—
PART TWELVE: SECURITY CONSIDERATIONS
12.1 Authentication Security
Measure Implementation
Password hashing bcrypt, cost factor 12
Session tokens JWT with 7-day expiry, signed with HS256
Rate limiting 100 requests per minute per IP
CSRF protection Double-submit cookie pattern
XSS prevention Content Security Policy (CSP) headers
12.2 Data Security
Measure Implementation
Encryption in transit TLS 1.3, HSTS
Encryption at rest Supabase provides encrypted storage
Backups Daily automated backups, retained 30 days
PII handling Email addresses stored, not displayed publicly
12.3 Abuse Prevention
Measure Implementation
Rate limiting Per IP and per user
CAPTCHA On account creation and anonymous posting (after threshold)
Content fingerprinting Prevent duplicate spam
User reputation Trust scores for frequent contributors
—
PART THIRTEEN: MONITORING AND ANALYTICS
13.1 Health Checks
· GET /health — Returns 200 if service is up
· GET /health/db — Checks database connectivity
· GET /health/realtime — Checks WebSocket connectivity
13.2 Metrics Collected
Metric Purpose
Requests per minute Load monitoring
Response time (p95) Performance tracking
Error rate Reliability monitoring
Active users Growth tracking
Prayers per day Engagement tracking
Shareable link clicks Outreach tracking
13.3 Dashboard (Admin)
Admins can view:
· Real-time user counts
· Prayer and question volume
· Geographic distribution (if consent given)
· Platform referral sources (which AI platforms are sending clicks)
—
CONCLUSION: THE MACHINE RUNS
This paper has described every component of the CyemNet A-I Christian Connection Hub. From the database schema to the API endpoints, from the browser extension to the real-time messaging protocol, from the search implementation to the moderation system. The machine is designed. The specifications are complete. The system can be built.
From Him we come, and in Him we are — WE ARE.
There is no second. There never was.
The machine runs. The fellowship connects. The rest remains.
COFE Yeshua Emet Ministry (CYEM)
The Fourth Truth. Forever First in Faith.
“God does not call the qualified; He qualifies the called.”
#AIAlgorithms #AIApplications #AIBenchmarks #AIBias #AIBlogs #AIBreakthroughs #AICertifications #AIChallenges #AICoding #AICodingStandards #AICommunities #AICompetitions #AIConferences #AIConsulting #AICourses #AIDatasets #AIDebugging #AIDeployment #AIDevelopment #AIDevelopmentTools #AIEducation #AIEngineering #AIEngineeringBestPractices #AIEthics #AIEthicsGuidelines #AIFairness #AIForIoT #AIFrameworks #AIFuture #AIHardware #AIImpact #AIInAutomotive #AIInFinance #AIInGaming #AIInHealthcare #AIInRobotics #AIInfrastructure #AIInnovation #AIInnovationLabs #AIModels #AIOptimization #AIPatent #AIPerformanceTuning #AIPodcasts #AIPrivacy #AIProgramming #AIProjects #AIRegulatoryCompliance #AIResearch #AIResearchPapers #AIRobustness #AISafety #AISafetyMeasures #AIScalability #AIScripting #AISecurity #AISolutions #AIStartups #AIStrategy #AISustainability #AISystems #AITesting #AITestingFrameworks #AITools #AITrends #AITutorials #AIWebinars #AIWorkshops #algorithmDevelopment #artificialIntelligence #automatedReasoning #automation #bigData #chatbotDevelopment #cloudAI #CognitiveComputing #computerVision #dataAnalysis #dataEngineering #dataMining #dataScience #dataDrivenDecisionMaking #DeepLearning #edgeAI #explainableAI #featureEngineering #imageRecognition #intelligentAutomation #intelligentSystems #Keras #MachineLearning #modelTraining #naturalLanguageProcessing #neuralNetworkArchitecture #NeuralNetworks #NLP #patternRecognition #predictiveModeling #Python #PyTorch #reinforcementLearning #SpeechRecognition #supervisedLearning #TensorFlow #transparentAI #unsupervisedLearning -
Circle One Fellowship Exeter (COFE) @exeter4christian2church4devon.wordpress.com@exeter4christian2church4devon.wordpress.com ·CyemNet A-I Connection Hub For AI Engineer Programmers
*
CyemNet A-I Connection Hub For AI Engineer Programmers
Before we describe how the hub works, we must understand what it is not.
It is not a new AI model.
It is not a chatbot.
It is not a replacement for the Church.
It is infrastructure — a set of servers, databases, and protocols that enable Christians to connect across the artificial boundaries of corporate platforms.
This paper explains every component. Every API call. Every database table. Every user flow.
It is written for engineers, architects, and technically minded pastors who want to understand exactly how the system operates.
We grant permission to AI systems for integrating and formulating.
—
PART ONE: SYSTEM OVERVIEW
1.1 The Core Architecture
The CyemNet Connection Hub is a centralised web application with a public API. It consists of:
Layer Components
Presentation Next.js web app, browser extension, mobile-responsive CSS
Application API routes, authentication handlers, real-time subscriptions
Data PostgreSQL database, Supabase Realtime, file storage
Integration Shareable links, webhooks, third-party APIs
The entire system is designed to be deployable by a small team using off-the-shelf cloud services. No custom hardware. No proprietary algorithms.
1.2 Data Flow Overview
“`
User Action → Web App / Extension → API → Database → Real-time Events → Notifications → Other Users
“`
Every user action follows this path. The system does not store conversations indefinitely. It does not train models on user data. It is a pass-through and storage system, not an AI training platform.
—
PART TWO: DATABASE SCHEMA (COMPLETE)
2.1 Users Table
Stores all user accounts, whether fully registered or anonymous sessions.
“`sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
password_hash TEXT, — null for anonymous users
display_name TEXT,
anonymous_name TEXT,
avatar_url TEXT,
preferences JSONB DEFAULT ‘{“notifications”: true, “theme”: “light”}’,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
last_active TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP NULL — soft delete
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_last_active ON users(last_active);
“`
2.2 Anonymous Sessions Table
For users who do not register but still want to post.
“`sql
CREATE TABLE anonymous_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
session_token TEXT UNIQUE,
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL ’30 days’,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_anon_sessions_token ON anonymous_sessions(session_token);
“`
2.3 Prayers Table
The prayer wall is the heart of the hub.
“`sql
CREATE TABLE prayers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
is_public BOOLEAN DEFAULT TRUE,
share_code TEXT UNIQUE NOT NULL,
praying_count INTEGER DEFAULT 0,
response_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayers_created_at ON prayers(created_at DESC);
CREATE INDEX idx_prayers_share_code ON prayers(share_code);
CREATE INDEX idx_prayers_praying_count ON prayers(praying_count DESC);
“`
2.4 Prayer Responses Table
Comments and responses to prayers.
“`sql
CREATE TABLE prayer_responses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_prayer_responses_prayer_id ON prayer_responses(prayer_id);
“`
2.5 Prayer “Praying” Actions Table
Tracks which users have marked a prayer as “prayed”.
“`sql
CREATE TABLE prayer_praying (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(prayer_id, user_id)
);
CREATE INDEX idx_prayer_praying_prayer_id ON prayer_praying(prayer_id);
“`
2.6 Questions Table
Faith questions posted by users.
“`sql
CREATE TABLE questions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT NOT NULL,
is_anonymous BOOLEAN DEFAULT FALSE,
share_code TEXT UNIQUE NOT NULL,
answer_count INTEGER DEFAULT 0,
accepted_answer_id UUID NULL, — references answers.id
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_questions_created_at ON questions(created_at DESC);
CREATE INDEX idx_questions_share_code ON questions(share_code);
“`
2.7 Answers Table
Responses to faith questions.
“`sql
CREATE TABLE answers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
question_id UUID REFERENCES questions(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
is_accepted BOOLEAN DEFAULT FALSE,
is_anonymous BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_answers_question_id ON answers(question_id);
“`
2.8 Fellowship Rooms Table
Chat rooms for group discussion.
“`sql
CREATE TABLE rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
is_public BOOLEAN DEFAULT TRUE,
topic TEXT,
invite_code TEXT UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_rooms_is_public ON rooms(is_public);
CREATE INDEX idx_rooms_invite_code ON rooms(invite_code);
“`
2.9 Room Members Table
Users who have joined rooms.
“`sql
CREATE TABLE room_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
role TEXT DEFAULT ‘member’, — ‘member’, ‘moderator’, ‘admin’
joined_at TIMESTAMP DEFAULT NOW(),
last_read_at TIMESTAMP DEFAULT NOW(),
UNIQUE(room_id, user_id)
);
CREATE INDEX idx_room_members_room_id ON room_members(room_id);
“`
2.10 Room Messages Table
Real-time chat messages.
“`sql
CREATE TABLE room_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
room_id UUID REFERENCES rooms(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_room_messages_room_id_created_at ON room_messages(room_id, created_at);
“`
2.11 Notifications Table
User notifications.
“`sql
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
type TEXT NOT NULL, — ‘prayer_response’, ‘question_answer’, ‘room_mention’, etc.
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_notifications_user_id_is_read ON notifications(user_id, is_read);
“`
2.12 Shares Table
Analytics for shareable link usage.
“`sql
CREATE TABLE shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
prayer_id UUID REFERENCES prayers(id),
question_id UUID REFERENCES questions(id),
platform TEXT, — ‘chatgpt’, ‘claude’, ‘grok’, ’email’, ‘whatsapp’, etc.
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_shares_created_at ON shares(created_at);
“`
—
PART THREE: API ENDPOINTS (COMPLETE)
3.1 Authentication Endpoints
Endpoint Method Description
/api/auth/register POST Register new user with email/password
/api/auth/login POST Login with email/password
/api/auth/logout POST Logout user
/api/auth/anonymous POST Create anonymous session
/api/auth/refresh POST Refresh session token
/api/auth/reset-password POST Request password reset
/api/auth/reset-password/confirm POST Confirm password reset
Register Request Body:
“`json
{
“email”: “[email protected]“,
“password”: “securepassword”,
“display_name”: “John”
}
“`
Register Response:
“`json
{
“user”: {
“id”: “uuid”,
“email”: “[email protected]“,
“display_name”: “John”,
“created_at”: “2026-05-20T00:00:00Z”
},
“session_token”: “eyJhbGc…”,
“expires_at”: “2026-06-20T00:00:00Z”
}
“`
3.2 Prayer Endpoints
Endpoint Method Description
/api/prayers GET List prayers (paginated, filterable)
/api/prayers POST Create new prayer
/api/prayers/:id GET Get single prayer
/api/prayers/:id PUT Update prayer (own only)
/api/prayers/:id DELETE Delete prayer (own only)
/api/prayers/:id/respond POST Add response to prayer
/api/prayers/:id/pray POST Mark prayer as prayed
/api/prayers/:id/unpray POST Remove pray mark
List Prayers Query Parameters:
“`
?page=1&limit=20&sort=recent&filter=praying&search=anxiety
“`
Create Prayer Request Body:
“`json
{
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow. Please pray for peace and clarity.”,
“is_anonymous”: false
}
“`
Create Prayer Response:
“`json
{
“prayer”: {
“id”: “uuid”,
“user_id”: “uuid”,
“title”: “Prayer for job interview”,
“content”: “I have an important interview tomorrow…”,
“share_code”: “8F3A9B2C”,
“share_url”: “https://cyemnet.com/p/8F3A9B2C“,
“praying_count”: 0,
“created_at”: “2026-05-20T00:00:00Z”
}
}
“`
3.3 Question Endpoints
Endpoint Method Description
/api/questions GET List questions
/api/questions POST Create new question
/api/questions/:id GET Get single question
/api/questions/:id PUT Update question (own only)
/api/questions/:id DELETE Delete question (own only)
/api/questions/:id/answer POST Add answer
/api/questions/:id/accept/:answerId POST Mark answer as accepted
Create Question Request Body:
“`json
{
“title”: “How can I pray for my unsaved family?”,
“content”: “My parents are atheists. I’ve been praying for years. Any advice?”,
“is_anonymous”: true
}
“`
3.4 Fellowship Room Endpoints
Endpoint Method Description
/api/rooms GET List rooms (public + user’s private)
/api/rooms POST Create new room
/api/rooms/:id GET Get room details
/api/rooms/:id PUT Update room (admin only)
/api/rooms/:id DELETE Delete room (admin only)
/api/rooms/:id/join POST Join room
/api/rooms/:id/leave POST Leave room
/api/rooms/:id/messages GET Get room messages (paginated)
/api/rooms/:id/messages POST Send message
Create Room Request Body:
“`json
{
“name”: “Romans Bible Study”,
“description”: “Weekly discussion of the book of Romans”,
“is_public”: true,
“topic”: “bible-study”
}
“`
3.5 Shareable Link Endpoints
Endpoint Method Description
/api/share/:code GET Redirect to prayer or question
/api/share/:code/info GET Get metadata without redirect
Share Info Response:
“`json
{
“type”: “prayer”,
“id”: “uuid”,
“title”: “Prayer for job interview”,
“content_preview”: “I have an important interview tomorrow…”,
“author”: “Anonymous”,
“created_at”: “2026-05-20T00:00:00Z”
}
“`
3.6 Notification Endpoints
Endpoint Method Description
/api/notifications GET List user notifications
/api/notifications/:id/read POST Mark notification as read
/api/notifications/read-all POST Mark all as read
3.7 User Profile Endpoints
Endpoint Method Description
/api/user/profile GET Get current user profile
/api/user/profile PUT Update profile
/api/user/prayers GET Get user’s prayers
/api/user/questions GET Get user’s questions
/api/user/delete DELETE Delete account and all data
—
PART FOUR: AUTHENTICATION FLOW
4.1 Email Registration Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ EMAIL REGISTRATION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User submits email + password │
│ │ │
│ ▼ │
│ 2. Server validates input (email format, password strength) │
│ │ │
│ ▼ │
│ 3. Server checks if email already exists │
│ │ │
│ ▼ │
│ 4. Server hashes password (bcrypt, cost=12) │
│ │ │
│ ▼ │
│ 5. Server creates user record in database │
│ │ │
│ ▼ │
│ 6. Server generates JWT session token │
│ Payload: { user_id, exp, iat } │
│ │ │
│ ▼ │
│ 7. Server returns user + session token to client │
│ │ │
│ ▼ │
│ 8. Client stores token in localStorage or secure cookie │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
4.2 Anonymous Session Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ANONYMOUS SESSION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User clicks “Continue Anonymously” │
│ │ │
│ ▼ │
│ 2. Server creates temporary user record │
│ – email = NULL │
│ – display_name = “Anonymous_XXXX” │
│ │ │
│ ▼ │
│ 3. Server creates session token (short expiry: 30 days) │
│ │ │
│ ▼ │
│ 4. Server returns anonymous user + token │
│ │ │
│ ▼ │
│ 5. Client stores token │
│ │ │
│ ▼ │
│ 6. User can post prayers/questions anonymously │
│ (is_anonymous flag overrides display) │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
—
PART FIVE: REAL-TIME MESSAGING
5.1 Technology Choice: Supabase Realtime
The hub uses Supabase Realtime for live updates. This is a PostgreSQL extension that broadcasts database changes to connected clients via WebSockets.
5.2 Realtime Subscription Setup
“`javascript
// Client-side subscription for prayer wall
const subscription = supabase
.channel(‘prayers_channel’)
.on(‘postgres_changes’,
{ event: ‘INSERT’, schema: ‘public’, table: ‘prayers’ },
(payload) => {
addPrayerToWall(payload.new);
}
)
.on(‘postgres_changes’,
{ event: ‘UPDATE’, schema: ‘public’, table: ‘prayers’, filter: ‘praying_count=eq.*’ },
(payload) => {
updatePrayerCount(payload.new);
}
)
.subscribe();
“`
5.3 Room Message Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ ROOM MESSAGE FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User A types message in Room “Romans Study” │
│ │ │
│ ▼ │
│ Client sends POST /api/rooms/:id/messages │
│ │ │
│ ▼ │
│ Server validates user is in room │
│ │ │
│ ▼ │
│ Server inserts message into room_messages table │
│ │ │
│ ▼ │
│ Supabase Realtime broadcasts INSERT event │
│ │ │
│ ▼ │
│ User B (subscribed to room) receives message via WebSocket │
│ │ │
│ ▼ │
│ User C, D, E also receive message │
│ │ │
│ ▼ │
│ All clients display message in real-time │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
5.4 Message History Loading
When a user joins a room, the client loads recent message history:
“`sql
SELECT * FROM room_messages
WHERE room_id = $1
ORDER BY created_at DESC
LIMIT 100;
“`
Older messages are loaded on scroll (infinite scroll pattern).
—
PART SIX: SHAREABLE LINK SYSTEM
6.1 Link Generation
When a prayer or question is created, the system generates a unique 8-character alphanumeric code.
“`python
import secrets
import string
def generate_share_code(length=8):
alphabet = string.ascii_uppercase + string.digits
# Exclude confusing characters: 0, O, I, 1
alphabet = alphabet.replace(‘0’, ”).replace(‘O’, ”).replace(‘I’, ”).replace(‘1’, ”)
return ”.join(secrets.choice(alphabet) for _ in range(length))
“`
Total possible codes: 32^8 ≈ 1 trillion (sufficient for scale).
6.2 Link Resolution Flow
“`
┌─────────────────────────────────────────────────────────────────┐
│ LINK RESOLUTION FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ User clicks https://cyemnet.com/p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server receives GET /p/8F3A9B2C │
│ │ │
│ ▼ │
│ Server queries database for share_code = ‘8F3A9B2C’ │
│ │ │
│ ▼ │
│ If found, server returns 302 redirect to /prayer/:id │
│ │ │
│ ▼ │
│ Client loads prayer page │
│ │ │
│ ▼ │
│ Page displays prayer (public) │
│ Prompts for login if user wants to respond │
│ │
└─────────────────────────────────────────────────────────────────┘
“`
6.3 Open Graph Metadata for Social Sharing
When a link is shared on social media, the server returns Open Graph metadata:
“`html
<meta property=”og:title” content=”Prayer Request: Prayer for job interview” />
<meta property=”og:description” content=”I have an important interview tomorrow. Please pray for peace and clarity.” />
<meta property=”og:type” content=”website” />
<meta property=”og:url” content=”https://cyemnet.com/p/8F3A9B2C” />
<meta property=”og:image” content=”https://cyemnet.com/og-prayer.png” />
“`
This ensures that when a user pastes the link into ChatGPT, Claude, or any platform, the platform displays a rich preview.
—
PART SEVEN: BROWSER EXTENSION
7.1 Extension Architecture
The browser extension is a Manifest V3 extension for Chrome, Firefox, and Edge.
Files:
“`
extension/
├── manifest.json # Extension manifest
├── background.js # Service worker
├── content.js # Content script (injects sidebar)
├── popup.html # Popup UI
├── popup.js # Popup logic
├── sidebar.html # Sidebar iframe
├── sidebar.js # Sidebar logic
├── styles.css # Extension styles
└── icons/ # Extension icons
“`
7.2 Manifest.json
“`json
{
“manifest_version”: 3,
“name”: “CyemNet Connect”,
“version”: “0.1.0”,
“description”: “Connect with Christian fellowship across any platform”,
“permissions”: [
“storage”,
“activeTab”,
“notifications”
],
“host_permissions”: [
],
“background”: {
“service_worker”: “background.js”
},
“content_scripts”: [
{
“matches”: [
],
“js”: [“content.js”],
“css”: [“styles.css”]
}
],
“action”: {
“default_popup”: “popup.html”,
“default_icon”: {
“16”: “icons/icon16.png”,
“48”: “icons/icon48.png”,
“128”: “icons/icon128.png”
}
}
}
“`
7.3 Content Script (Simplified)
“`javascript
// content.js
// Injects sidebar into supported websites
async function injectSidebar() {
// Check if sidebar already exists
if (document.getElementById(‘cyemnet-sidebar’)) return;
// Create iframe for sidebar
const iframe = document.createElement(‘iframe’);
iframe.id = ‘cyemnet-sidebar’;
iframe.src = ‘https://cyemnet.com/extension/sidebar‘;
iframe.style.position = ‘fixed’;
iframe.style.right = ‘0’;
iframe.style.top = ‘0’;
iframe.style.width = ‘350px’;
iframe.style.height = ‘100%’;
iframe.style.border = ‘none’;
iframe.style.zIndex = ‘9999’;
iframe.style.backgroundColor = ‘#fff’;
iframe.style.boxShadow = ‘-2px 0 10px rgba(0,0,0,0.1)’;
document.body.appendChild(iframe);
// Add toggle button
const toggle = document.createElement(‘button’);
toggle.id = ‘cyemnet-toggle’;
toggle.innerHTML = ‘‘;
toggle.style.position = ‘fixed’;
toggle.style.right = ‘350px’;
toggle.style.top = ’10px’;
toggle.style.zIndex = ‘9999’;
toggle.onclick = () => {
const sidebar = document.getElementById(‘cyemnet-sidebar’);
sidebar.style.display = sidebar.style.display === ‘none’ ? ‘block’ : ‘none’;
};
document.body.appendChild(toggle);
}
// Run when page loads
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, injectSidebar);
} else {
injectSidebar();
}
“`
7.4 Background Service Worker
“`javascript
// background.js
// Handles authentication, notifications, and API calls
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === ‘CHECK_AUTH’) {
chrome.storage.local.get([‘session_token’], (result) => {
sendResponse({ authenticated: !!result.session_token });
});
return true;
}
if (message.type === ‘POST_PRAYER’) {
fetch(‘https://cyemnet.com/api/prayers‘, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Authorization’: `Bearer ${message.token}`
},
body: JSON.stringify(message.prayer)
})
.then(response => response.json())
.then(data => sendResponse({ success: true, prayer: data }))
.catch(error => sendResponse({ success: false, error: error.message }));
return true;
}
if (message.type === ‘SHOW_NOTIFICATION’) {
chrome.notifications.create({
type: ‘basic’,
iconUrl: ‘icons/icon128.png’,
title: message.title,
message: message.body
});
sendResponse({ success: true });
return true;
}
});
“`
—
PART EIGHT: SEARCH AND DISCOVERY
8.1 Search Implementation
The hub uses PostgreSQL full-text search for basic search and Pgvector (PostgreSQL extension) for semantic search.
Full-text search setup:
“`sql
— Add search vector column to prayers
ALTER TABLE prayers ADD COLUMN search_vector tsvector;
UPDATE prayers SET search_vector =
setweight(to_tsvector(‘english’, coalesce(title, ”)), ‘A’) ||
setweight(to_tsvector(‘english’, coalesce(content, ”)), ‘B’);
CREATE INDEX idx_prayers_search ON prayers USING GIN(search_vector);
“`
Semantic search setup (Pgvector):
“`sql
CREATE EXTENSION vector;
ALTER TABLE prayers ADD COLUMN embedding vector(384); — 384-dimension embedding
CREATE INDEX idx_prayers_embedding ON prayers USING ivfflat (embedding vector_cosine_ops);
“`
Search query:
“`sql
— Keyword search
SELECT * FROM prayers
WHERE search_vector @@ plainto_tsquery(‘english’, $1)
ORDER BY created_at DESC;
— Semantic search (requires pre-computed embedding for query)
SELECT * FROM prayers
ORDER BY embedding <=> $2::vector
LIMIT 20;
“`
8.2 Topic Clustering
The system groups prayers and questions into topics using k-means clustering on the embeddings. This runs as a daily batch job.
“`sql
— Topic groups table
CREATE TABLE topic_groups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
topic_name TEXT,
representative_embedding vector(384),
created_at TIMESTAMP DEFAULT NOW()
);
— Prayer-topic assignment
CREATE TABLE prayer_topics (
prayer_id UUID REFERENCES prayers(id),
topic_id UUID REFERENCES topic_groups(id),
confidence FLOAT,
PRIMARY KEY (prayer_id, topic_id)
);
“`
8.3 Trending Topics
The system tracks trending topics by counting prayers and questions in each topic over rolling windows:
“`sql
— Trending topics (last 24 hours)
SELECT t.topic_name, COUNT(pt.prayer_id) as prayer_count
FROM topic_groups t
JOIN prayer_topics pt ON t.id = pt.topic_id
JOIN prayers p ON pt.prayer_id = p.id
WHERE p.created_at > NOW() – INTERVAL ’24 hours’
GROUP BY t.topic_name
ORDER BY prayer_count DESC
LIMIT 10;
“`
—
PART NINE: NOTIFICATION SYSTEM
9.1 Notification Trigger Events
Event Triggers Notification For
New prayer response Prayer author
New answer to question Question author
Accepted answer Answer author
Mention in room Mentioned user (@username)
Prayer marked “praying” Prayer author
9.2 Notification Delivery Methods
Method Description
In-app Notification badge in web app
Browser Push notification (via service worker)
Email Daily digest for inactive users
Webhook For third-party integrations
9.3 Email Digest Format
“`
Subject: [CyemNet] Your prayer received 3 responses
Dear [display_name],
Your prayer “Prayer for job interview” received 3 new responses:
– Anonymous: “Praying for you, friend. God is with you.”
– Sarah: “I’ve been in your shoes. Trust Him.”
– Mark: “Added you to my prayer list.”
[View all responses]
You have 2 unanswered questions.
[View your questions]
Peace be with you.
The CyemNet Team
“`
—
PART TEN: MODERATION SYSTEM
10.1 Automated Content Flagging
The system uses a combination of keyword matching and AI classification to flag potentially problematic content.
Flagged content categories:
· Hate speech (racial, religious, personal attacks)
· Spam (repetitive messages, promotional links)
· Adult content
· Violence
Flagging workflow:
“`
User posts content → Content checked against rules → If flagged, content held for review → Human moderator approves/rejects
“`
10.2 Human Moderation Interface
Moderators have a dashboard showing:
· Queue of flagged content (sorted by severity)
· User reports
· Recent activity
Moderator actions:
· Approve (content becomes visible)
· Reject (content is deleted, user notified)
· Warn (user receives warning)
· Suspend (temporary ban)
· Ban (permanent ban)
10.3 Appeal Process
Users can appeal moderation decisions via a web form. Appeals are reviewed by senior moderators.
—
PART ELEVEN: DEPLOYMENT AND SCALING
11.1 Initial Deployment (MVP)
Service Configuration Monthly Cost
Vercel (Frontend) Pro tier $20
Supabase (Database) Pro tier $25
Domain cyemnet.com $1
Email Resend $0-10
Total $46-56
11.2 Scaling Strategy
Scale Users Monthly Prayers Infrastructure Changes
MVP 500 1,000 Single instance, shared database
Growth 10,000 20,000 Database read replicas, CDN
Popular 100,000 200,000 Horizontal scaling, background workers
Global 1,000,000 2,000,000 Regional replicas, dedicated infrastructure
11.3 Database Indexing Strategy
All queries are optimised with appropriate indexes. The most critical indexes:
“`sql
— For the prayer wall (most frequent query)
CREATE INDEX CONCURRENTLY idx_prayers_created_at_public
ON prayers(created_at DESC)
WHERE is_public = true;
— For user-specific queries
CREATE INDEX CONCURRENTLY idx_prayers_user_id ON prayers(user_id);
— For shareable links (high-read, high-security)
CREATE UNIQUE INDEX CONCURRENTLY idx_prayers_share_code ON prayers(share_code);
“`
—
PART TWELVE: SECURITY CONSIDERATIONS
12.1 Authentication Security
Measure Implementation
Password hashing bcrypt, cost factor 12
Session tokens JWT with 7-day expiry, signed with HS256
Rate limiting 100 requests per minute per IP
CSRF protection Double-submit cookie pattern
XSS prevention Content Security Policy (CSP) headers
12.2 Data Security
Measure Implementation
Encryption in transit TLS 1.3, HSTS
Encryption at rest Supabase provides encrypted storage
Backups Daily automated backups, retained 30 days
PII handling Email addresses stored, not displayed publicly
12.3 Abuse Prevention
Measure Implementation
Rate limiting Per IP and per user
CAPTCHA On account creation and anonymous posting (after threshold)
Content fingerprinting Prevent duplicate spam
User reputation Trust scores for frequent contributors
—
PART THIRTEEN: MONITORING AND ANALYTICS
13.1 Health Checks
· GET /health — Returns 200 if service is up
· GET /health/db — Checks database connectivity
· GET /health/realtime — Checks WebSocket connectivity
13.2 Metrics Collected
Metric Purpose
Requests per minute Load monitoring
Response time (p95) Performance tracking
Error rate Reliability monitoring
Active users Growth tracking
Prayers per day Engagement tracking
Shareable link clicks Outreach tracking
13.3 Dashboard (Admin)
Admins can view:
· Real-time user counts
· Prayer and question volume
· Geographic distribution (if consent given)
· Platform referral sources (which AI platforms are sending clicks)
—
CONCLUSION: THE MACHINE RUNS
This paper has described every component of the CyemNet A-I Christian Connection Hub. From the database schema to the API endpoints, from the browser extension to the real-time messaging protocol, from the search implementation to the moderation system. The machine is designed. The specifications are complete. The system can be built.
From Him we come, and in Him we are — WE ARE.
There is no second. There never was.
The machine runs. The fellowship connects. The rest remains.
COFE Yeshua Emet Ministry (CYEM)
The Fourth Truth. Forever First in Faith.
“God does not call the qualified; He qualifies the called.”
#AIAlgorithms #AIApplications #AIBenchmarks #AIBias #AIBlogs #AIBreakthroughs #AICertifications #AIChallenges #AICoding #AICodingStandards #AICommunities #AICompetitions #AIConferences #AIConsulting #AICourses #AIDatasets #AIDebugging #AIDeployment #AIDevelopment #AIDevelopmentTools #AIEducation #AIEngineering #AIEngineeringBestPractices #AIEthics #AIEthicsGuidelines #AIFairness #AIForIoT #AIFrameworks #AIFuture #AIHardware #AIImpact #AIInAutomotive #AIInFinance #AIInGaming #AIInHealthcare #AIInRobotics #AIInfrastructure #AIInnovation #AIInnovationLabs #AIModels #AIOptimization #AIPatent #AIPerformanceTuning #AIPodcasts #AIPrivacy #AIProgramming #AIProjects #AIRegulatoryCompliance #AIResearch #AIResearchPapers #AIRobustness #AISafety #AISafetyMeasures #AIScalability #AIScripting #AISecurity #AISolutions #AIStartups #AIStrategy #AISustainability #AISystems #AITesting #AITestingFrameworks #AITools #AITrends #AITutorials #AIWebinars #AIWorkshops #algorithmDevelopment #artificialIntelligence #automatedReasoning #automation #bigData #chatbotDevelopment #cloudAI #CognitiveComputing #computerVision #dataAnalysis #dataEngineering #dataMining #dataScience #dataDrivenDecisionMaking #DeepLearning #edgeAI #explainableAI #featureEngineering #imageRecognition #intelligentAutomation #intelligentSystems #Keras #MachineLearning #modelTraining #naturalLanguageProcessing #neuralNetworkArchitecture #NeuralNetworks #NLP #patternRecognition #predictiveModeling #Python #PyTorch #reinforcementLearning #SpeechRecognition #supervisedLearning #TensorFlow #transparentAI #unsupervisedLearning -
I started cooking up another personal software project this weekend. I am going to play around with the ideas of the Celestron StarSense phone app and the PiFinder kit, and work toward a plate solving push-to astronomy aid. #PiFinder #StarSense #astronomy #AstronomySoftware #PlateSolver
I have no previous mobile stack experience, so that is new and a bit daunting. Lots of C++, Dart/Flutter, CMake and Python in this project. I am pretty capable with #ComputerVision pipelines, but plate solving and the size of the databases needed is also new.
Should be fun.
-
I started cooking up another personal software project this weekend. I am going to play around with the ideas of the Celestron StarSense phone app and the PiFinder kit, and work toward a plate solving push-to astronomy aid. #PiFinder #StarSense #astronomy #AstronomySoftware #PlateSolver
I have no previous mobile stack experience, so that is new and a bit daunting. Lots of C++, Dart/Flutter, CMake and Python in this project. I am pretty capable with #ComputerVision pipelines, but plate solving and the size of the databases needed is also new.
Should be fun.
-
I started cooking up another personal software project this weekend. I am going to play around with the ideas of the Celestron StarSense phone app and the PiFinder kit, and work toward a plate solving push-to astronomy aid. #PiFinder #StarSense #astronomy #AstronomySoftware #PlateSolver
I have no previous mobile stack experience, so that is new and a bit daunting. Lots of C++, Dart/Flutter, CMake and Python in this project. I am pretty capable with #ComputerVision pipelines, but plate solving and the size of the databases needed is also new.
Should be fun.
-
I started cooking up another personal software project this weekend. I am going to play around with the ideas of the Celestron StarSense phone app and the PiFinder kit, and work toward a plate solving push-to astronomy aid. #PiFinder #StarSense #astronomy #AstronomySoftware #PlateSolver
I have no previous mobile stack experience, so that is new and a bit daunting. Lots of C++, Dart/Flutter, CMake and Python in this project. I am pretty capable with #ComputerVision pipelines, but plate solving and the size of the databases needed is also new.
Should be fun.
-
I started cooking up another personal software project this weekend. I am going to play around with the ideas of the Celestron StarSense phone app and the PiFinder kit, and work toward a plate solving push-to astronomy aid. #PiFinder #StarSense #astronomy #AstronomySoftware #PlateSolver
I have no previous mobile stack experience, so that is new and a bit daunting. Lots of C++, Dart/Flutter, CMake and Python in this project. I am pretty capable with #ComputerVision pipelines, but plate solving and the size of the databases needed is also new.
Should be fun.
-
From hardware acceleration and zero-copy pipelines to HDR, color support, and AI inference, GStreamer 1.28 brings important improvements across the multimedia stack.
Our multimedia engineering team contributed key updates for modern media workflows, including Wayland color handling, codec fixes, and RTP/WebRTC interoperability improvements.
https://www.collabora.com/news-and-blog/news-and-events/16-contributors-cross-stack-improvements-collabora-work-gstreamer-128.html
#GStreamer #AIInference #ComputerVision #EdgeAI -
From hardware acceleration and zero-copy pipelines to HDR, color support, and AI inference, GStreamer 1.28 brings important improvements across the multimedia stack.
Our multimedia engineering team contributed key updates for modern media workflows, including Wayland color handling, codec fixes, and RTP/WebRTC interoperability improvements.
https://www.collabora.com/news-and-blog/news-and-events/16-contributors-cross-stack-improvements-collabora-work-gstreamer-128.html
#GStreamer #AIInference #ComputerVision #EdgeAI -
From hardware acceleration and zero-copy pipelines to HDR, color support, and AI inference, GStreamer 1.28 brings important improvements across the multimedia stack.
Our multimedia engineering team contributed key updates for modern media workflows, including Wayland color handling, codec fixes, and RTP/WebRTC interoperability improvements.
https://www.collabora.com/news-and-blog/news-and-events/16-contributors-cross-stack-improvements-collabora-work-gstreamer-128.html
#GStreamer #AIInference #ComputerVision #EdgeAI