[{"kind":"page","href":"/blog/enterprise-ai-deployment","title":"Enterprise AI Deployment","description":"How are Organizations deploying AI in their workspace","section":"Blog","tags":["ai","artificial-intelligence","enterprise"],"text":" How Organizations Are Giving Employees AI: Efficiently and Safely 2025–2026 TL;DR - The winning pattern is \"buy, don't build, and channel everyone through a sanctioned front door.\" Most enterprises now provide AI through per-seat enterprise SaaS Microsoft 365 Copilot, ChatGPT Enterprise/Business, Claude, bundled Gemini for breadth, plus governed cloud-API access Azure OpenAI, AWS Bedrock, Google Vertex behind an internal gateway for custom apps. A sanctioned tool with contractual no-training/zero-retention terms is itself the primary security control against rampant \"shadow AI.\" - Cost efficiency comes from tiering and consumption discipline, not from picking one vendor. Put power users on premium seats, everyone else on cheaper pooled/consumption access; right-size models route cheap queries to small models ; and use prompt caching Anthropic bills cache reads at ~10% of the standard input rate, i.e. 90% off , batch APIs ~50% off and model routing 40–70% savings . Self-hosting open-weight models rarely \"pencils out\" below very high, sustained token volumes. - Data protection is mostly contractual + configuration, not model choice. All major commercial tiers already contractually promise no-training-on-your-data; the real work is buying the right tier ZDR/BAA where needed , fixing permission \"oversharing\" before switching on enterprise search, and layering DLP/CASB and AI-specific governance Purview, Netskope, Zscaler, Prompt Security/Witness AI plus policy, so the biggest risk unsanctioned use shrinks. Key Findings 1. Shadow AI is the dominant risk and the core reason to provide a sanctioned tool. Surveys consistently find the large majority of employees already use AI at work, much of it unsanctioned: an IBM-sponsored study found 80% of US office workers use AI but only 22% rely solely on employer tools; WalkMe found 78% use unapproved AI; UpGuard found 81% of employees and 88% of security leaders use unapproved AI tools. Verizon's 2026 Data Breach Investigations Report states that \"Shadow AI is now the third most common non-malicious insider action detected in our data loss prevention DLP dataset in 2025, a fourfold increase in percentage from the previous year,\" with regular AI use on corporate devices jumping from 15% to 45%, 67% of that use going through non-corporate accounts, and source code the most common data type uploaded across 858,440 DLP events analyzed . Providing an approved tool with monitoring is the single most effective control. 2. Enterprise spend is exploding but ROI measurement lags. Menlo Ventures' 2025 State of Generative AI in the Enterprise Dec 9, 2025, survey of ~500 US decision-makers found \"enterprise AI investment tripled in a single year, from \\$11.5 billion to \\$37 billion,\" a 3.2x increase up from just \\$1.7B in 2023. Coding/developer tools accounted for \\$7.3B of that and general-purpose copilots for \\$8.4B. The Federal Reserve Bank of Atlanta's May 2026 Policy Hub reports firms \"spent \\$1,358 per employee in 2025 and are anticipated to increase spending this year to \\$2,068 per employee\"; cross-industry benchmarks put financial services near \\$3,200/employee. Yet 86% of enterprises plan to increase AI budgets while only 45% can quantify their AI ROI, and MIT NANDA's \"GenAI Divide\" report found 95% of enterprise GenAI pilots delivered no measurable P&L impact. 3. Deployment models are complementary, not either/or. Big enterprises JPMorgan, TELUS build an internal gateway/portal that fronts multiple providers; regulated firms Moody's, Novo Nordisk, Mayo Clinic run custom apps on hyperscaler APIs inside their own tenancy; nearly everyone also buys SaaS seats for general productivity. 4. The permission/\"oversharing\" problem is the sleeper governance issue. Copilot-style enterprise search respects existing permissions but surfaces content users technically could access but never should, making latent permission sprawl suddenly exploitable. Decryption Digest https://www.decryptiondigest.com/blog/microsoft-365-copilot-security-oversharing Fixing permissions and sensitivity labels before rollout is essential. 5. Agents/MCP introduce a new risk class. Prompt injection, tool poisoning, and non-human identity sprawl are now real, documented enterprise incidents, Checkmarx https://checkmarx.com/learn/mcp-security-risks-real-world-incidents-and-security-controls/ requiring agent-specific governance least privilege, tool allowlists, human-in-the-loop . Details 1. Deployment models and tradeoffs A Enterprise SaaS seats fastest, lowest effort, breadth . - Microsoft 365 Copilot : historically \\$30/user/month annual as an add-on to M365. In 2026 Microsoft restructured: a \"Microsoft 365 Copilot for Business\" tier listed at a promotional \\$18/user/month standard \\$21 . Data protection is Copilot's strong suit for Microsoft shops: it honors existing M365 permissions and Purview sensitivity labels, keeps data in the tenant/compliance boundary, does not train foundation models on tenant data, and provides audit logs. Adoption has been mixed: one analysis reported Copilot's US paid-subscriber share fell from 18.8% July 2025 to 11.5% Jan 2026 , Tech Insider https://tech-insider.org/microsoft-ai-spending-azure-copilot-2026/ and Microsoft added consumption-based \"Copilot Chat\" in Jan 2025 to address resistance to the flat \\$30 seat. Samexpert https://samexpert.com/microsoft-365-copilot-roi/ - ChatGPT Enterprise : quote-only; 2026 procurement reports converge on ~\\$45–75/seat/month ~\\$60 typical , a ~150-seat minimum, annual prepay, implying a ~\\$108,000/year floor; large 5,000+ seat deals fall toward ~\\$40. ChatGPT Business is \\$20/user/month annual cut \\$5 on April 2, 2026 , 2-seat minimum, but no HIPAA BAA Enterprise required . Enterprise adds SSO/SCIM, EKM bring-your-own-keys , data residency across ~10 regions, a Compliance API, SOC 2 Type 2, ISO 27001, and no-training-by-default. ZDR available via API. - Claude Anthropic : Team ~\\$25/seat/month annual, 20-seat floor for the sales-assisted enterprise path ; Enterprise is quote-based reference deals ~\\$30–35/seat at 500+ seats . IntuitionLabs https://intuitionlabs.ai/articles/chatgpt-vs-claude-enterprise-comparison Anthropic holds SOC 2 Type I/II, ISO 27001:2022, and was among the first to earn ISO/IEC 42001:2023 Jan 2025 . No training on commercial data by default; API data auto-deleted within 30 days; Layer3Labs https://www.layer3labs.io/guides/internal-vs-external-ai-models-confidential-data ZDR available via a security addendum and for Claude Code on Enterprise via separate enablement . HIPAA BAA available. - Google Gemini for Workspace : Google discontinued standalone Gemini add-ons \\$20/\\$30 in March 2025 and bundled Gemini into Workspace plans ~\\$7 Starter, ~\\$14 Standard, ~\\$22 Plus per user/month, annual ; the catch is you pay for everyone on the plan with no per-user cost toggle. No training on Workspace data; data stays in the customer boundary; retention configurable 90/540/1,080 days or indefinite ; Enterprise Plus adds DLP over Gemini output. A separate \"Gemini Enterprise\" agent platform launched Oct 2025 starts ~\\$21/seat. GoSearch https://www.gosearch.ai/faqs/gemini-enterprise-pricing/ B Cloud API via hyperscalers control + residency, more effort . Azure OpenAI in Azure AI Foundry , AWS Bedrock, and Google Vertex AI all contractually commit that prompts/responses do not train foundation models, Technologymatch https://technologymatch.com/blog/aws-bedrock-vs-azure-openai-vs-google-vertex-ai-enterprise-ai-comparison and support private networking VNet/PrivateLink/VPC endpoints , customer-managed keys CMEK/BYOK , and regional residency. FedRAMP High is the deciding filter for US government: Bedrock and Azure qualify; Vertex generally does not yet. All three support HIPAA with private endpoints clinical pipelines often route Claude through Bedrock's VPC endpoint so PHI never traverses the public internet . Choice usually follows existing cloud footprint; model-quality gaps between platforms are small 5–15% , so compliance, residency, pricing, and integration drive the decision. C Internal gateway / LLM proxy central control at scale . Companies front multiple providers with a gateway: LiteLLM open-source, MIT; enterprise tier ~\\$250/mo to ~\\$30k/yr adds SSO/RBAC/audit and PII masking via Presidio , Portkey managed; semantic caching cited at 30–50% savings; Atlan https://atlan.com/know/litellm-vs-portkey-vs-bedrock-gateway/ Palo Alto Networks acquired it May 2026 into Prisma AIRS , Kong AI Gateway, Cloudflare AI Gateway, plus OpenWebUI/LibreChat chat UIs. Gateways deliver virtual keys, per-team budgets/hard caps, spend attribution/chargeback, request logging, LiteLLM https://www.litellm.ai/ PII redaction, and guardrails jailbreak/prompt-injection filters, secret-hiding . Caveat: a March 2026 LiteLLM supply-chain incident malicious PyPI package v1.82.7–1.82.8, removed within ~40 minutes is a reminder to pin versions and use air-gapped/pinned installs. D Self-hosted / open-weight Llama, Mistral, Qwen, DeepSeek, gpt-oss . Economics rarely favor self-hosting except at very high sustained volume or where data rules forbid external processing. Break-even estimates vary widely by comparison point: roughly 5–10M tokens/month vs premium frontier APIs, Aipricingmaster https://www.aipricingmaster.com/blog/self-hosting-ai-models-cost-vs-api but against budget open-weight APIs e.g., ~\\$0.14–0.50/M tokens the crossover runs into billions of tokens/month. Utilization is the killer variable: at ~10% GPU utilization, real cost/token can run ~10x the headline rate, and hidden ops/DevOps costs add a 3–5x multiplier, plus re-quantization/testing/redeploy cycles ~3–4 weeks, ~\\$12k engineering time every model update. Hugging Face moved Text Generation Inference to maintenance mode Dec 2025; vLLM/SGLang are the 2026 serving stack. A useful formula: break-even tokens ≈ GPU monthly cost ÷ blended API price/token. E Hybrid / model routing. Route by difficulty: cheap/small models for classification/summarization/routing, frontier models for hard reasoning. Cited savings 40–70% from routing alone; Morph https://www.morphllm.com/llm-cost-optimization combined with caching/batching/output control, teams report 60–85% total reductions e.g., RouteLLM showed ~85% cost reduction at ~95% quality . F Coding assistants. GitHub Copilot Enterprise \\$39/user/month moved to token-metered \"AI Credits\" billing June 1, 2026; code completions stay unlimited , with IP indemnification, SOC 2 Type II, content exclusion, and enterprise zero-retention. Cursor ~\\$40/user/month Standard with Privacy Mode/ZDR and SOC 2 Type II. Claude Code is HIPAA-ready with ZDR on Enterprise separate enablement . Tabnine uniquely offers self-hosted/air-gapped ZDR \\$39/user/month, enterprise-only . Coding is the breakout enterprise use case: Menlo put coding/dev tools at \\$7.3B of 2025 spend, and GitHub Copilot reached ~26M users by October 2025. 2. Cost management in practice - Right-size seats and tier the rollout. Seat sprawl and low utilization are the top waste sources; put power users on premium seats and everyone else on cheaper pooled/consumption access. Bundled models Gemini in Workspace mean you pay for idle users, which is a reason to scrutinize SKU mix. Note the duplication problem: ~34% of shadow-AI spend duplicates tools the company already pays for. - Seat vs consumption. Seat pricing is predictable and simple; consumption token pricing is cheaper for spiky/low-frequency users and lets you meter. Microsoft's Copilot Chat consumption and Anthropic's Enterprise shift toward a base seat plus usage-based token billing reflect this. - Concrete cost levers. Prompt caching Anthropic cuts cached reads by ~90%, e.g. Claude Sonnet input dropping from \\$3.00/M to \\$0.30/M; OpenAI's automatic caching 50–80% off prompts of 1,024+ tokens , Batch API ~50% off , model routing, output-length control max tokens; output tokens cost 4–6x input , context compaction. Stacking these commonly yields 60–85% reductions e.g., a documented \\$15,000/mo bill cut ~76% without changing models . - Watch runaway consumption. One report cited Uber's 6,500 engineers exhausting the 2026 AI budget in four months at \\$500–\\$2,000/engineer/month, which argues for hard per-team budget caps at the gateway. 3. Data protection and governance - Contractual controls: no-training clauses default on all commercial tiers , Layer3Labs https://www.layer3labs.io/guides/internal-vs-external-ai-models-confidential-data zero-data-retention addenda, DPAs/SCCs, sub-processor terms, regional/EU residency, HIPAA BAAs. Buy the right tier: free/consumer tiers are where training happens. - Technical controls: private networking, CMEK/BYOK, PII/secret redaction at the gateway, and DLP/CASB coverage of AI apps. Vendors include Microsoft Purview, Netskope One DLP with 3,000+ classifiers + AI Guardrails, and a Cloud Confidence Index risk-rating 1,800+ GenAI apps , Zscaler, Nightfall, Prompt Security, and Witness AI redaction + audit trails, including MCP/tool-call coverage . - The oversharing problem. Microsoft and Gartner frame this as AI making latent permission errors \"visible and actionable at scale\"; Gartner projects that by 2027, 60% of businesses will fail to realize anticipated AI value due to incohesive data frameworks. Documented incidents include \"EchoLeak\" CVE-2025-32711, a zero-click Copilot exfiltration chain and a Copilot bug CW1226324 that summarized labeled-confidential emails, bypassing DLP for a window. Remediation before rollout: SharePoint Advanced Management oversharing assessment, remove broad \"Everyone-except-external-users\" grants, apply sensitivity labels Highly Confidential labels can block Copilot summarization , and start with least-privilege pilots on low-risk sites. - Agent/MCP risks. Prompt injection, tool poisoning, confused-deputy failures, and non-human identity sprawl. A 2026 disclosure reportedly exposed up to 200,000 vulnerable MCP instances; CVEs hit Cursor CVE-2026-22708 , core MCP infra CVE-2025-6514, CVSS 9.6 , and Anthropic's own Git MCP server. Endor Labs found 82% of 2,614 MCP implementations use file operations prone to path traversal. One survey found 88% of organizations reported confirmed/suspected AI-agent incidents while 82% of executives believed existing policies protected them. Controls: agent inventory, tool allowlists, scoped/incremental consent, mandatory auth for remote MCP servers, network segmentation, tamper-resistant logging, and human-in-the-loop for consequential actions. - Regulatory frame. EU AI Act: GPAI-model obligations live since Aug 2, 2025 technical documentation, copyright policy, training-data summary ; high-risk-system obligations and all financial penalties from Aug 2, 2026; full application AI embedded in regulated products Aug 2, 2027. Penalties up to €35M or 7% of global turnover for prohibited practices, €15M/3% for high-risk non-compliance. The Act has extraterritorial reach like GDPR . Add GDPR, sector rules HIPAA, FINRA/SEC , and voluntary frameworks ISO 42001 and NIST AI RMF with NIST's AI Agent Standards Initiative launched Feb 2026 , backed by internal AI acceptable-use policies. 4. Practical rollout patterns - Staged rollout: pilot cohort → measure → expand. MIT found large enterprises take ~9 months to scale vs ~90 days for mid-market; the successful 5% scope tightly, target high-value workflows, and partner externally. Per MIT NANDA's The GenAI Divide: State of AI in Business 2025 52 executive interviews, 153 leader surveys, 300 public deployments , external partnerships reached deployment ~67% of the time vs ~33% for internal builds roughly 2x , and generic tools hit 83% adoption for trivial tasks but stall where workflows need context/memory. - Center of Excellence + AI champions , approved-tool catalogs with allow/deny lists, and training + acceptable-use policy as combined cost/risk levers. Caveat: some research finds training alone can breed overconfidence, so pair it with technical controls. - Measurement: adoption rate, hours saved, task throughput, and workflow-specific KPIs. Forrester estimated 116% three-year ROI / ~\\$19.7M NPV / ~9 hours saved per user per month for a 25,000-employee Copilot deployment vendor-commissioned; treat with caution . IDC/Microsoft cite ~\\$3.70 returned per \\$1 spent on average; Accenture reports \\$4.60 for mature programs vs \\$1.20 for pilot-phase. 5. Named case studies especially regulated industries - Morgan Stanley wealth management : Built private RAG apps \"AI @ Morgan Stanley Assistant\"/\"Debrief\" on OpenAI GPT-4 for ~16,000 advisors over a knowledge base of 100,000+ documents. Per OpenAI's case study, \"over 98% of advisor teams actively use AI @ Morgan Stanley Assistant\" and \"Access to documents has jumped from 20% to 80%.\" CTO Jeff McMillan's framing: \"an ecosystem that's private to Morgan Stanley that's controlled by Morgan Stanley.\" First OpenAI wealth-management strategic partner, March 2023. - JPMorgan Chase \"LLM Suite\": In-house, model-agnostic secure portal fronting OpenAI and Anthropic models refreshed ~every 8 weeks ; 200,000+ employees onboarded within ~8 months half using it several times a day . Built to give \"secure access to third-party AI capabilities while protecting client data and internal systems\"; won American Banker's 2025 Innovation of the Year. - Moody's CoPilot: Built on Azure OpenAI Service plus Fabric and Teams ; deployed to all 14,000 global employees in a \"secure digital sandbox environment protected from public AI tools.\" - TELUS \"Fuel iX\": Proprietary model-neutral platform ~40 LLMs across Vertex/others plus Claude used by 57,000+ employees; 13,000+ custom AI solutions; 47 large-scale GenAI solutions drove \\$90M+ in benefits and 500,000+ hours saved; engineers ship code 30% faster; first ISO 31700-1 \"Privacy by Design\" certification for a GenAI chatbot. Now commercialized. - Novo Nordisk pharma : Scaled Microsoft Copilot from a few hundred users Jan 2024 to 20,000 Feb 2025 , per MIT Sloan; also runs an Amazon Bedrock platform 25,000+ employees, 2,500+ use cases explicitly scoped to nonregulated processes; reported regulatory-document automation costing \"less than the salary of one medical writer\" secondary source, treat as directional . - US federal government GSA OneGov : ChatGPT Enterprise at \\$1/agency for a year Aug 6, 2025 ; Claude for Enterprise + Government at \\$1 across all three branches Aug 12, 2025 ; Gemini for Government at \\$0.47/agency. Claude for Government is FedRAMP High; Lawrence Livermore National Laboratory reports 10,000 scientists using Claude daily. By mid-2026, ~3.4 million federal employees were covered ~120+ agency orders, ~\\$1.6B claimed savings ; the cornerstone \\$1 deals expire Sept 30, 2026 a live lock-in/renewal risk, and they excluded API access . - Commonwealth Bank of Australia: ChatGPT Enterprise rolling out progressively to its 52,000 workforce under a multi-year OpenAI partnership; \\$90M three-year workforce program with 30,000+ employees already trained. Note: also drew press for AI-related call-centre job cuts. - Mayo Clinic healthcare : Early adopter of HIPAA-compliant Enterprise Search in Google Vertex AI for clinicians/researchers, with the customer retaining data control. Comparison of deployment models | Deployment model | Relative cost | Control / customization | Data protection ceiling | Effort to stand up | Best fit | |---|---|---|---|---|---| | Enterprise SaaS seats Copilot, ChatGPT Ent, Claude, Gemini | Predictable per-seat ~\\$18–75/user/mo ; can overpay on idle seats | Low–medium admin controls, connectors | High if right tier bought no-training default, ZDR/BAA add-ons, residency | Lowest days–weeks | Broad workforce productivity; fastest path to kill shadow AI | | Cloud API in own tenancy Azure OpenAI, Bedrock, Vertex | Consumption; efficient at scale with levers | High private networking, CMEK, model choice | Very high VPC endpoints, BYOK, FedRAMP/HIPAA | Medium weeks–months, needs eng | Custom apps, RAG, regulated data staying in-tenant | | Internal gateway / proxy LiteLLM, Portkey, Kong | Consumption + ops; enables chargeback & caps | High central budgets, redaction, logging, routing | High PII redaction, audit, self-host option | Medium–high platform team | Large orgs unifying many providers/teams and cost governance | | Self-hosted open-weight Llama, Mistral, Qwen, gpt-oss | Fixed GPU + ops; only cheap at very high utilization | Highest full data/model control, air-gap | Highest data never leaves | Highest GPU ops, DevOps 3–5x cost multiplier | Extreme data-sovereignty needs or huge sustained volume | | Hybrid / model routing | Lowest effective 40–85% savings | Medium–high policy per query | Inherits underlying providers' | Medium routing logic + evals | Cost optimization layered on any of the above | Recommendations Stage 1: Stop the bleeding weeks 1–4 . Assume shadow AI is pervasive Verizon's DBIR: 45% of workers now regular AI users on corporate devices, 67% via non-corporate accounts . Stand up at least one sanctioned tool immediately, defaulting to whichever ecosystem you already own M365 Copilot for Microsoft shops, bundled Gemini for Google Workspace shops, or ChatGPT Business/Team for a fast start . Publish a one-page acceptable-use policy and an approved-tool catalog. Turn on DLP/CASB visibility for AI apps Netskope/Zscaler/Purview . Benchmark to advance: 50% of target users active on the sanctioned tool within 60 days. Stage 2: Govern the data foundation months 1–3, in parallel . Before enabling enterprise search/Copilot broadly, run an oversharing assessment, remediate broad permissions, and apply sensitivity labels. Sign the right contractual tier: no-training is table stakes; add ZDR and a HIPAA BAA where regulated data is involved; specify EU/regional residency if needed. Threshold: do not expand Copilot/enterprise-search access to a business unit until its permission remediation is complete. Stage 3: Build the gateway and tier costs months 2–6 . For custom apps and developer access, route everything through an internal LLM gateway LiteLLM/Portkey/Kong inside your cloud tenancy with per-team budgets, hard caps, spend attribution, PII redaction, and logging. Tier seats: power users on premium, everyone else on pooled/consumption. Turn on prompt caching, batching, model routing, and output caps. Threshold to route more to premium seats: a cohort must show measurable workflow ROI hours saved or throughput before upgrading. Stage 4: Scale what works, measure honestly months 4–12 . Establish a Center of Excellence and AI champions; expand only workflow-integrated use cases with measurable P&L or productivity impact avoiding the MIT 95%-failure trap; partnerships deploy ~2x as often as internal builds . Reconsider self-hosting only if a specific workload sustains very high token volume roughly tens of millions of tokens/day against frontier APIs at high GPU utilization, or data rules forbid external processing. Cross-cutting for agents: treat agents as privileged non-human identities. Inventory them, scope tool permissions allowlists , require auth for remote MCP servers, keep humans in the loop for consequential actions, and log to tamper-resistant storage. Caveats - Pricing changes fast and much is quote-only. ChatGPT Enterprise, Claude Enterprise, and Copilot enterprise deals are negotiated; ranges here are drawn from 2026 procurement reports, not rate cards, so verify with vendors before budgeting. - Vendor/analyst source bias. ROI figures e.g., Forrester's 116% Copilot ROI; IDC/Microsoft's \\$3.70-per-\\$1 are often vendor-commissioned; the MIT 95%-failure and Menlo/Gartner/Fed-Atlanta figures come from surveys with methodology limits. Some case-study numbers JPMorgan ROI, Novo Nordisk cost claims, NNGPT user counts come from secondary outlets, so treat dollar/ROI specifics as directional. Seat counts also shift with phased rollouts TELUS 35k→57k→70k; JPMorgan 200k→250k . - Break-even math for self-hosting is highly sensitive to model, GPU utilization, and whether you compare against frontier or budget APIs. Cited crossovers range from ~5M to billions of tokens/month. - Fast-moving facts: the GSA \\$1 government deals expire Sept 30, 2026 with no publicly named successor plan; model lineups and retention terms e.g., specific Claude models under GitHub Copilot, which briefly retain prompts for safety classification shift frequently."},{"kind":"page","href":"/blog/building-a-connected-engineering-blog","title":"Building a Connected Engineering Blog with Next.js","description":"A current end-to-end tour of this site's Markdown publishing pipeline, connected notes, reading tools, PageRank graph, responsive discovery, subscriptions, SEO, and AI-readable outputs.","section":"Blog","tags":["Next.js","software engineering","engineering notes","technical writing"],"text":"An engineering blog becomes more useful when an article is not an isolated page. It should remain readable as ordinary prose, connect to the work around it, expose enough structure for search engines and machine readers, and require almost no publishing maintenance. This article documents the current system and deliberately exercises its major features. The boundary is intentionally simple: Markdown owns the writing, Next.js owns the presentation, Git owns the history, and Vercel owns deployment. A small compiler connects those responsibilities without introducing a CMS or a second website stack. The publishing architecture A note begins as local Markdown. Frontmatter supplies its stable title, summary, dates, aliases, publication status, and tags. The build validates that contract, resolves internal references, calculates indexes, and emits static or server-rendered HTML alongside machine-readable representations. mermaid flowchart LR A Obsidian or local Markdown -- B Public content boundary B -- C Validation and link compiler C -- D Next.js pages C -- E Search and graph indexes C -- F Feeds, sitemap, and LLM text D -- G Git history E -- G F -- G G -- H Vercel deployment Publication is explicit. A file must be inside a public collection and declare publish: true ; private vault material is never copied into the site. The repository also includes a publishing command that validates notes before they cross that boundary. Frontmatter is a contract yaml title: \"Building a Connected Engineering Blog with Next.js\" description: \"How the connected publishing system works.\" publish: true status: reference created: \"2026-07-17\" updated: \"2026-07-17\" tags: - Next.js - software engineering aliases: - Connected Engineering Notes The three statuses describe editorial state without relying on a gardening metaphor: | Status | Meaning | Expected use | | ---------- | -------------------------------------------- | ------------------------ | | Brief | A concise observation or working idea | Quick technical findings | | Developing | A note that is still being expanded | Active investigations | | Reference | A complete article intended for repeated use | Durable explanations | The quality gate rejects missing titles, malformed dates, unsafe or duplicate routes, unresolved public wikilinks, missing images, invalid frontmatter, and secret-like values. TypeScript, ESLint, and the production build run before a change is published. The publishing command is the boundary The private writing vault and website repository remain separate. The repository's publishing command reads only the selected public folder and only files with publish: true : bash npm run publish:notes -- \\ --source=/absolute/path/to/Vault/Public \\ --attachments=/absolute/path/to/Vault/Attachments \\ --build \\ --push It validates titles, aliases, paths, and wikilinks; converts Obsidian image embeds; copies referenced attachments into hashed public asset names; removes files from the previous publishing manifest; validates the resulting public corpus; optionally runs the production build; and commits and pushes only the generated notes, assets, and publishing manifest. Replacing --build --push with --check performs a non-mutating eligibility check. That's the documented path, but it isn't the only one in active use. Obsidian R2 Workflow /blog/obsidian-r2-workflow describes how a growing share of notes, including this one, are written and edited directly in this repository instead of round-tripping through the vault, while still passing through the same validation and build gate before they go live. Connections are part of the content model Markdown links and Obsidian-style wikilinks are resolved during compilation. For example, Ship of Theseus /wiki/ship-of-theseus resolves through its title or alias to a normal, accessible HTML link. The target then receives a backlink automatically. For every note $v$, the compiler records outgoing edges. Reversing them produces backlinks: $$ B v = \\{u \\in V \\mid u, v \\in E\\} $$ That shared index powers: - connected notes at the end of an article; - backlinks from notes that cite the current page; - related entries inferred from tags and graph proximity; - navigable internal-link previews; - the compact and full notes graphs. PageRank identifies influential notes The notes index provides Top , Name , and Latest sorting. Top is not a manual editorial order: it follows PageRank over explicit internal links. For node $v$, the iterative score is: $$ PR v = \\frac{1-d}{|V|} + d \\sum {u \\in B v } \\frac{PR u }{L u } $$ where $d = 0.85$ and $L u $ is the number of outgoing links from $u$. Dangling rank is redistributed across the graph, and iteration stops after convergence. The highest-ranked note begins at the center of the visualization; subsequent notes settle in progressively wider reference rings. Girvan–Newman reveals link communities PageRank answers which notes are influential, while Girvan–Newman answers which notes form communities. The build calculates edge betweenness with Brandes' algorithm, removes the most central bridge, recomputes betweenness, and repeats until a useful number of connected components appears. Community membership controls node color. The <a href=\"/notes/graph\" full notes graph</a combines those results with a physical simulation: - PageRank controls centrality and initial order; - Girvan–Newman communities control color; - circle area represents article word count; - explicit links behave like springs; - repulsion and collision keep nodes legible; - panning, zooming, dragging, and hover inspection remain interactive. A compact framed graph is also embedded directly in /notes . Its initial render fits every node inside the frame and expands outward from the center. The accessible list beneath the canvas preserves every graph destination for keyboard users and non-visual readers. Finding and browsing published work Discovery is deliberately available without making the graph the only way to navigate. Search, sorting, and responsive pagination The Notes page searches titles, summaries, folders, and tags. All Posts searches both modern notes and legacy essays. The global <kbd Cmd</kbd /<kbd Ctrl</kbd + <kbd K</kbd palette searches notes, essays, tags, and photos from one compact generated index; pressing <kbd /</kbd while not typing opens the same search. Photo results retain their thumbnails rather than being reduced to generic text rows. Pagination follows viewport capacity: | Collection | Mobile | Tablet | Desktop | | ---------- | -----: | -----: | ------: | | Notes | 4 | 6 | 8 | | All Posts | 6 | 10 | 14 | Filtering resets pagination to the first valid page, while URLs retain a shareable page number. List and grid orientation Every primary content collection has an accessible List/Grid switch: - the Notes index; - individual folders and topic pages; - All Posts; - latest writing on the landing page; - Photos; - the folder browser itself. List mode favors scanning metadata in sequence. Grid mode gives each result a self-contained card, similar to a compact research-note catalogue. The orientation buttons expose aria-pressed state and work without hiding content from assistive technology. Each page remembers its own choice, so changing Notes does not alter Photos, All Posts, the landing page, or a specific folder or tag page. Card grids use one column on mobile, two on medium screens, and three equal columns on wide screens while remaining inside the same site body width. Folder browsing now belongs inside Notes instead of the landing dashboard. This keeps the home page focused on recent writing while /notes owns search, folders, topics, publication status, and graph exploration. Photos participate in discovery Photos are first-class search documents rather than a disconnected gallery. Global search results include thumbnails and navigate directly to photo pages. The Photos page has its own search and List/Grid control: grid mode provides a visual gallery and dialog, while list mode includes the thumbnail, description, location, engagement counts, and a permanent detail link. Photo dialogs and detail pages expose views, one-time likes, private feedback, and native sharing with clipboard fallback. On touch devices, a deliberate press-and-hold gesture can share directly from the grid without first opening the dialog. The first above-the-fold image loads eagerly for good Largest Contentful Paint; the remaining images remain lazy. The photo search/view toolbar takes over the top edge only after the normal site header has scrolled away. Technical prose renders like technical prose The renderer supports GitHub-flavoured Markdown, mathematical notation, language-aware code, diagrams, tables, task lists, quotations, and deep heading structure. The output is semantic HTML rather than a client-only editor. Mathematics with LaTeX Inline expressions such as $O n \\log n $ stay within the sentence. Display expressions use KaTeX: $$ H X = -\\sum {x \\in \\mathcal{X}} p x \\log 2 p x $$ Code with theme-aware highlighting Fenced code retains its language and exposes a copy control: ts type PublicationStatus = \"brief\" | \"developing\" | \"reference\"; function canPublish input: { publish: boolean; status: PublicationStatus } { return input.publish && input.status !== \"brief\"; } Light mode uses a paper-like surface and dark syntax. Dark mode uses an ambient surface with light, language-aware tokens. Both keep the code distinct without turning it into an unrelated black rectangle. Tables, tasks, and quotations Tables use a complete cell grid at every viewport size, with overflow available when technical content is wider than the reading column. - x validate public metadata; - x resolve wikilinks and backlinks; - x calculate PageRank and communities; - x generate search, feeds, sitemap, and machine-readable text; - x render diagrams, mathematics, and highlighted code; - x provide list and grid discovery modes; - keep improving the writing itself. The publishing system should disappear during writing and become strict only at the boundary where private thought turns into public information. Reading without interface noise Every published note omits the global site header, regardless of its collection, so the page begins with the article itself. Collection indexes, graphs, photos, and supporting pages retain the normal navigation. A fixed top-right reading percentage, extracted table of contents that highlights the nearest section, and active-heading state provide orientation without crowding the reading column or placing a bar over the text. When the contents list is longer than its frame, it scrolls itself to keep the current section in view on desktop and whenever the mobile panel opens. A fixed close control returns directly to the complete Notes index from every collection. On mobile, the table of contents collapses into a small fixed icon beside the configurator and reading percentage; selecting a section navigates to it and dismisses the section menu. After a contents jump, the close control temporarily becomes a back arrow labelled with the previous section; returning there restores the usual close action. A neighboring reading control stays collapsed until requested. It offers the site's default typeface plus five self-hosted reading fonts—Inter, Atkinson Hyperlegible, Source Serif 4, Lora, and Merriweather—text sizing from 90% to 120%, left, center, right, or justified alignment, narrow or wide reading widths, and bright or dark page tones. Choosing Site default removes the article-level font override; the other choices persist across articles while leaving code in its monospace typeface and keeping the document structure unchanged for browser reader modes. Wide reading mode uses the broader article column while retaining the desktop On this page sidebar by default. A reader can collapse that sidebar into a compact dialog button and pin it back onto the page from inside the dialog; the preference persists across articles. Selecting a word or phrase in an article reveals a small Look up action. The definition panel resolves site-specific terms, WordNet entries, computer-science terms, and engineering idioms from local dictionaries, then presents every matching source together. The selected text stays on the server that already serves the site; lookup does not send reading activity to an external dictionary service. Breadcrumbs remain available across notes, folders, topics, graphs, photos, and archive pages. On articles they describe Home → Notes → Folder → Article in both visible navigation and BreadcrumbList structured data. Each note footer includes an email-feedback action addressed to the site owner. The generated message subject is Feedback: <note title , and its body includes the canonical note URL so feedback retains its context outside the browser. The semantic main , article , headline, author, dates, headings, and articleBody markers give browser reader modes a clean extraction target. The same article also has a direct raw Markdown representation, so immersive readers and machines do not need to reverse-engineer the interactive layout. Navigable previews Internal references open a preview containing the target title, summary, folder, and publication status. The entire preview is navigable, not just its small title. Supported external references—such as Wikipedia's overview of hypertext https://en.wikipedia.org/wiki/Hypertext — load a title, extract, description, and image, and likewise remain clickable. Visual system and accessibility The default appearance for a new visitor is dark, with 1f1e1d as the main canvas. Supporting cards, popovers, borders, and muted text use a warm neutral palette rather than blue-grey black. Explicit Light, Dark, and System choices remain available and are respected on subsequent visits. List and grid cards use the same restrained corner radius as the primary landing page buttons, keeping repeated content surfaces precise without making every panel feel like a floating container. The typography is self-hosted, including the five optional reading fonts, and adds no external font request: - Inter for interface and default reading text; - Roboto Mono for dates, labels, metadata, and code-adjacent details; - KaTeX's mathematical fonts for formulas. The layout uses visible focus states, semantic landmarks, skip navigation, accessible graph destinations, labelled control groups, reduced-motion rules, and responsive content widths. Interactive flourishes never replace the normal link or text representation. The global header, page body, and footer share one content container and the same responsive gutters, keeping their left and right edges aligned across notes, indexes, graphs, photos, and supporting pages. On pages that retain the global header, it stays in normal document flow and scrolls away instead of occupying the viewport throughout the visit. SEO and machine readability Good discovery begins with complete HTML. Each article receives a unique title and description, canonical URL, publication and modification dates, Open Graph and Twitter metadata, large image previews, and TechArticle structured data. The sitemap and Atom feed enumerate public content, while stable headings and internal links make the documents understandable without running the graph or search interfaces. The Atom feed is advertised in page metadata for automatic discovery. A human-readable /subscribe page provides one-click Feedly and Inoreader links, the raw feed, a copyable feed URL, and setup instructions for any other reader. Machine readers receive multiple coordinated entry points: - robots.txt explicitly permits major search and user-fetch agents; - llms.txt describes the author and canonical collections; - llms-full.txt provides the full public corpus with metadata and URLs; - /raw/ folder / slug provides per-article Markdown; - every article advertises its Markdown alternate; - the footer exposes the AI index and subscription guide as normal links. The crawler policy covers current agents from OpenAI, Anthropic, Perplexity, Google, Microsoft, Meta, and Apple, with a permissive fallback for other readers. This cannot force a model to browse or cite the site, but it removes avoidable technical barriers. Design references and implementation choices Two independent sites helped clarify the product direction. Bibek Panthi's connected notes https://bpanthi977.com/braindump/index.html demonstrate the value of backlinks, a physical link graph, lightweight static pages, and a clear feed-subscription path. Hugo Cisneros's Notes https://hugocisneros.com/notes/ show how a searchable notes index can remain calm, compact, and useful without becoming a dashboard. This implementation borrows those interaction principles rather than either site's stack or visual identity. It keeps the existing Next.js application, uses the site's own content compiler and design tokens, treats the output as a professional engineering archive, and avoids metaphorical publication labels. One source, several representations | Consumer | Representation | | ------------- | ----------------------------------------------------------- | | Reader | Semantic HTML, reading controls, TOC, lookup, and feedback | | Search engine | Canonicals, JSON-LD, sitemap, metadata, and internal links | | Feed reader | Atom entries and a human-readable subscription guide | | Site search | Generated notes, essays, tags, and photo documents | | Notes graph | PageRank, communities, word counts, and explicit edges | | AI crawler | HTML, per-article Markdown, llms.txt , and llms-full.txt | Correcting a title or adding a link updates the page, breadcrumb, search result, graph label, backlink index, feed metadata, sitemap, and machine-readable corpus from the same source. Current public routes | Route | Purpose | | ---------------------- | -------------------------------------------- | | /notes | Search, folders, topics, statuses, and graph | | /notes/graph | Full interactive notes graph | | /all-posts | Unified modern and legacy archive | | /photos | Searchable list/grid photo collection | | /photos/ id | Canonical photo detail and engagement page | | /tags/ tag | Topic-specific note results | | /raw/ folder / slug | Plain Markdown representation | | /search-index.json | Generated global-search document index | | /robots.txt | Search and AI crawler policy | | /sitemap.xml | Search discovery index | | /atom | Feed-reader representation | | /subscribe | Human-readable feed subscription guide | | /llms.txt | Machine-oriented site guide | | /llms-full.txt | Full machine-readable public corpus | Legacy /knowledge URLs permanently redirect to /notes , preserving old links without keeping outdated public terminology. What the reader should notice The system is broad, but the article remains the main object. Search is quick, the table of contents is quiet, previews appear only when requested, the graph starts fitted to its frame, and each interactive view has a normal link-based equivalent. This page demonstrates the system in one ordinary Markdown file: validated metadata, aliases, publication status, headings and table of contents, LaTeX, Mermaid, highlighted code, tables, tasks, tags, a wikilink, backlinks, related notes, reading progress, mobile and desktop orientation, text lookup, adjustable reading presentation, close navigation, note-specific email feedback, internal and Wikipedia previews, structured data, responsive discovery, feed subscription, sitemap inclusion, reader-mode semantics, and machine-readable full text. That portability is the most important feature: the writing remains useful even outside the site that presents it."},{"kind":"page","href":"/blog/obsidian-r2-workflow","title":"Obsidian R2 Workflow","description":"How I synchronize Obsidian across devices using Cloudflare R2.","section":"Blog","tags":["blog","obsidian","publishing"],"text":"I keep my Obsidian vault backed by a Cloudflare R2 bucket so the same notes and attachments show up whether I'm writing on my laptop or picking a thought back up on my phone. That vault is where most articles start: a rough note in an inbox folder, a few edits over a couple of days, then a move into one of the public folders once it's ready to be read by someone other than me. How publishing actually works right now The site has a proper pipeline for turning vault notes into published pages. Building a Connected Engineering Blog with Next.js /blog/building-a-connected-engineering-blog describes it in full: a publish: true note in a public vault folder, a sync script that copies it into this repository, converts image embeds, and resolves wikilinks, and a build that validates everything before it ships. In practice, a good chunk of what actually goes out the door skips that script entirely. I just edit the Markdown directly in this repository instead of round-tripping through the vault. That's especially true for reference pieces, quick fixes, and this article. I commit under my own name and personal email rather than whatever git identity happens to be configured on the machine, then push straight to main . Vercel picks up the push automatically and rebuilds the site. There's no separate deploy step and no staging environment; main is live. That shortcut doesn't skip the parts that actually matter. Whether a note arrives through the vault sync script or through a direct edit in this repo, it still has to pass the same frontmatter validation, the same TypeScript and ESLint checks, and the same production build before it's live. The vault pipeline exists for notes that genuinely start their life in Obsidian and need attachments carried over; direct edits are for everything else, which lately has been most of it. Why both paths stay open The vault sync keeps my writing portable and backed up regardless of which device I'm on, and it's still the right path for longer notes with images that began as real Obsidian drafts. The direct-edit path is faster when the idea and the finished article happen close together, or when I'm fixing something small enough that pulling out the vault would be more overhead than the fix itself. I don't think one will fully replace the other. I just wanted this note to say honestly which one I'm actually using, instead of only describing the tidier version of the process."},{"kind":"page","href":"/notes/agentic-coding","title":"Agentic Coding","description":"Me experiencing agentic coding","section":"Notes","tags":["ai","artificial-intelligence"],"text":"Using LLM for coding is undeniably useful say for as little as looking up documentation that otherwise took exploring innumerable sites to as much as implementing edge case modules. Lately, I have found it to be super helpful to explore repo and do security audits and find bugs that were missed in tests. I'd say Chat GPT Codex has been super fun pair programmer on some of the projects I am building. Its definitely autistic savant given that it always 'knows' but never does something on its own 'willingly'. There's always need of a initiator who makes it do stuff or prompt it in a certain way. That makes intent a human issue. AI does something human intent to and opposite doesn't seem to be true as of yet. The discussion about AI replacing Human or Job-appoclaypse are really above my field of concerns. Why'd any one not dig with bulldozer and use spoons. If something is there that has vast knowledge base, vast understandings of environments, its proper that a human mind should be dreamer of ideas and not memorize all stuffs on the internet. As @karpathy predicted in 2017, it became obvious that he was right. <Tweet id=\"893576281375219712\" / Its brutally true that job was never to write code, as Sam Lambert @samlambert is saying: <Tweet id=\"2089915981053497408\" / "},{"kind":"page","href":"/wiki/ship-of-theseus","title":"Ship of Theseus","description":"A brief description of Ship of Theseus Thought Experiment","section":"Wiki","tags":["shipoftheseus","thoughtexperiment"],"text":" The Ship of Theseus Overview The Ship of Theseus is a classic thought experiment about identity and change over time. It asks: if every part of an object is gradually replaced, is it still fundamentally the same object? The Original Thought Experiment The paradox comes from Plutarch's account of the ship sailed by the mythical hero Theseus, which the Athenians preserved for centuries as a monument. As planks rotted, they were replaced one by one with new wood — until eventually every original plank was gone. The core question: Is the fully-repaired ship still the same ship Theseus sailed, or is it a different ship entirely? The Twist A common addition sharpens the puzzle further: suppose someone collected all the original discarded planks and reassembled them into a second ship. - Ship A: the continuously repaired ship, now made entirely of new parts - Ship B: reassembled from 100% of the original materials, but never sailed as a continuous object Which one is the \"real\" Ship of Theseus? Or are both? Or neither? Why It Matters This isn't just an idle riddle — it's a lens for thinking about identity in general: | Domain | Application | |---|---| | Personal identity | Nearly all your body's cells are replaced over ~7-10 years — are you the \"same\" person? | | Organizations | A company with entirely new staff, leadership, and even name changes over decades | | Software | Codebases where every original line has been rewritten | | Restoration/preservation | Historic buildings or artifacts extensively repaired or rebuilt | Major Philosophical Responses 1. Mereological essentialism — an object's identity depends on its exact parts; change any part, it's technically a new object. 2. Form over matter Aristotelian view — identity comes from structure, function, and continuity of form, not the specific matter — so the repaired ship stays \"the same.\" 3. Four-dimensionalism — objects are best understood as space-time \"worms\"; identity is about a continuous causal history, not a snapshot of matter. 4. Identity as a social/linguistic convention — \"sameness\" isn't an objective fact at all, but a label we assign based on convenience and context. Key Takeaway The Ship of Theseus reveals that identity is not simply about material composition — it may depend on continuity, function, causal history, or how we choose to define \"sameness.\" There's no universally agreed-upon answer, which is precisely what makes it a useful tool for probing deeper questions about persistence, change, and what makes something \"itself.\""},{"kind":"photo","href":"/photos/1787118254043-07d20bae-scaled-1000068502","title":"Gaggle","description":"Group of goose swimming","section":"Photos","tags":["Kamalpokhari, Bode, Bhaktapur","2026-08-15"],"text":"Gaggle Group of goose swimming Kamalpokhari, Bode, Bhaktapur 2026-08-15","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/1787118254043-07d20bae-scaled_1000068502.jpg"},{"kind":"photo","href":"/photos/1787118001119-be89e497-scaled-1000068503","title":"Lotus flower","description":"Lotus flower at Kamalpokhari pond, at Kumari Temple, Bode, Bhaktapur","section":"Photos","tags":["बोडे भक्तपुर","2026-08-15"],"text":"Lotus flower Lotus flower at Kamalpokhari pond, at Kumari Temple, Bode, Bhaktapur बोडे भक्तपुर 2026-08-15","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/1787118001119-be89e497-scaled_1000068503.jpg"},{"kind":"photo","href":"/photos/1786691901540-9533f0b3-scaled-1000068328","title":"Patan Durbar Square","description":"Patan Durbar Square by road side.","section":"Photos","tags":["Patan, Lalitpur"],"text":"Patan Durbar Square Patan Durbar Square by road side. Patan, Lalitpur","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/1786691901540-9533f0b3-scaled_1000068328.jpg"},{"kind":"photo","href":"/photos/1786684401313-fa0c0885-scaled-1000068290","title":"Elephant Marble","description":"Elephants carved out of marble at Patan Durbar Square","section":"Photos","tags":["Patan Durbar Square","2026-08-13"],"text":"Elephant Marble Elephants carved out of marble at Patan Durbar Square Patan Durbar Square 2026-08-13","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/1786684401313-fa0c0885-scaled_1000068290.jpg?v=1787331150386"},{"kind":"photo","href":"/photos/hanumandhoka","title":"Kaal Bhairav","description":"A photo of Kaal Bhairav at Basantapur Durbar Square.","section":"Photos","tags":["Basantapur Durbar Square, Kathmandu, Nepal"],"text":"Kaal Bhairav A photo of Kaal Bhairav at Basantapur Durbar Square. Basantapur Durbar Square, Kathmandu, Nepal","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/hanumandhoka.webp"},{"kind":"photo","href":"/photos/prithivi-statue","title":"Prithivi Narayan Shah Statue","description":"A photo of the Prithivi Narayan Shah Statue, Anantalingeshwor Bhaktapur.","section":"Photos","tags":["Anantalingeshwor, Bhaktapur, Nepal"],"text":"Prithivi Narayan Shah Statue A photo of the Prithivi Narayan Shah Statue, Anantalingeshwor Bhaktapur. Anantalingeshwor, Bhaktapur, Nepal","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/prithivi_statue.webp"},{"kind":"photo","href":"/photos/himalayan-sheep-dog","title":"Himalayan Sheep Dog","description":"A photo of a Bhote kurur (dog) in the hills of Udayapur.","section":"Photos","tags":["Udayapur, Nepal"],"text":"Himalayan Sheep Dog A photo of a Bhote kurur (dog) in the hills of Udayapur. Udayapur, Nepal","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/himalayan_sheep_dog.webp"},{"kind":"photo","href":"/photos/boudha-stupa","title":"Boudha Stupa","description":"A view of the Boudha Stupa in Kathmandu.","section":"Photos","tags":["Boudhanath, Kathmandu, Nepal"],"text":"Boudha Stupa A view of the Boudha Stupa in Kathmandu. Boudhanath, Kathmandu, Nepal","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/boudha_stupa.webp"},{"kind":"photo","href":"/photos/bhakti-mandir","title":"Bhakti Mandir","description":"A view of the Bhakti Mandir Shyama Shayam Dham in Bhaktapur.","section":"Photos","tags":["Bhaktapur, Nepal"],"text":"Bhakti Mandir(Shyama Shayam Dham) A view of the Bhakti Mandir Shyama Shayam Dham in Bhaktapur. Bhaktapur, Nepal","image":"https://pub-e9d5c1a4906340b69fcbd0aef18c06a9.r2.dev/photos/bhakti_mandir.webp"}]