Single source of project knowledge for MyOMR.in — tech stack, folder structure, bootstrap pattern, canonical URLs, 404 handling, security, hosting, and file conventions. Use when working on MyOMR.in, adding new pages or modules, or needing project context.
Project skill for MyOMR.in: local community platform for Old Mahabalipuram Road (OMR), Chennai. News, events, jobs, hostels, rent-lease, buy/sell, directories.
.cpanel.yml; deploy path public_html.core/include-path.php — load first.omr_nav, omr_footer).$omr_css_homepage, $page_nav, $page_analytics.includes/bootstrap.php loads root bootstrap + module helpers.$root = $_SERVER['DOCUMENT_ROOT'] ?? __DIR__;
require_once $root . '/core/include-path.php';
require_once ROOT_PATH . '/components/page-bootstrap.php';
// Then: head-includes, omr_nav(), content, omr_footer()
| Folder | Purpose |
|---|---|
/admin/ | Admin CRUD; protect with _bootstrap.php + requireAdmin() from core/admin-auth.php |
/assets/css/ | Custom styles (main.css, footer.css, homepage-myomr.css) |
/components/ | Nav, footer, news bulletin, jobs banner, meta, analytics |
/core/ | DB (omr-connect.php), path (include-path.php), serve-404, url-helpers, admin-auth |
/omr-local-job-listings/ | Job portal |
/omr-hostels-pgs/ | Hostels & PGs |
/omr-rent-lease/ | Rent & lease |
/omr-buy-sell/ | Buy & sell (used goods) |
/omr-classified-ads/ | OMR Classified Ads (services, wanted, notices) |
/omr-local-events/ | Events |
/local-news/ | Articles (article.php) |
/omr-listings/ | Directories (schools, banks, etc.) |
/docs/ | Documentation (ARCHITECTURE, workflows, analytics) |
job-detail-omr.php, add-property-omr.php.post-job-omr.php, listing-detail-omr.php).$canonical_url; include analytics in head; load footer.css.$canonical_url (or $article_url for articles).https://myomr.in (no www).<?php echo htmlspecialchars($canonical_url, ENT_QUOTES, 'UTF-8'); ?>./{module}/{entity}/{id}/{slug} — use skill slug-urls-detail-pages.Home -> /Jobs -> /omr-local-job-listings/Events -> /omr-local-events/Explore Places -> /omr-listings/index.phpBuy & Sell -> /omr-buy-sell/News Highlights -> /local-news/news-highlights-from-omr-road.phpContact -> /contact-my-omr-team.phpcore/site-navigation.php as single source for these hub links./path), not context-derived base URLs.SiteNavigationElement schema from the same nav source used by UI.omr road, omr), add shared hub cross-links using components/omr-topic-hubs.php.require_once ROOT_PATH . '/core/serve-404.php'; exit; when entity not found.<h1>404</h1>.components/analytics.php in <head>.htmlspecialchars()./admin/ via admin/_bootstrap.php (calls requireAdmin() from core/admin-auth.php).generate_csrf_token() and verify_csrf_token() from core/security-helpers.php on state-changing forms.components/modal-cta.php (included via footer) require Bootstrap 5 CSS and JS so .modal, .modal-dialog, and bootstrap.Modal work. Load Bootstrap 5 in the footer before modal-cta.php if the head does not already load it.#omrCtaPostJob, #omrCtaEmployerPack, #omrCtaSubscribe { display: none !important; }); show only when Bootstrap adds .show. Prevents modals appearing as raw blocks when Bootstrap is missing or before JS runs..cpanel.yml drives copy; repository outside public_html.omr-buy-sell and elections-2026 are in the deploy list.includes/error-reporting.php), ensure it is committed and that the deploy process copies that path (the parent folder must be in .cpanel.yml so the full tree is deployed).define('SITEMAP_REQUEST', true);) and suppress display of errors: e.g. if (defined('SITEMAP_REQUEST')) { ini_set('display_errors', '0'); }.<urlset>) instead of error output so the response is always valid XML.client_email as Full user in Search Console property.sc-domain:myomr.in.google-api-python-clientgoogle-authgoogle-auth-httplib2https://myomr.in/sitemap.xmlgenerate-sitemap-index.phpisPending, errors, warnings, lastSubmitted) over ad-hoc HTTP checks when environment/network middleware returns non-representative responses.dev-tools/mcp/search_console_mcp.pypythonE:/OneDrive/_myomr/_Root/dev-tools/mcp/search_console_mcp.pyGSC_CREDENTIALS_PATH = absolute path to service-account JSONGSC_SITE_URL = sc-domain:myomr.inGSC_CHILD_SITEMAPS = comma-separated sitemap URLscan't open file .../search_console_mcp.py, create/check this file path first.omr-hostels-pgs/README.md, omr-buy-sell/README.md$recent_jobs, $recent_events; include components that expect them in scope.<?php if (!empty($recent_jobs)): ?> for data-dependent sections.$omr_css_homepage = true before head-includes for homepage styles.assets/css/homepage-myomr.css (or a stylesheet included when $omr_css_homepage is true) so the section is not unstyled.admin/_bootstrap.php then requireAdmin() from core/admin-auth.php; redirect to /admin/login.php.$canonical_url; output with htmlspecialchars($canonical_url, ENT_QUOTES, 'UTF-8').require_once ROOT_PATH . '/core/serve-404.php'; exit;ROOT_PATH for all root-level includes (components, core).omr_nav(), omr_footer(), and head-includes.php.MYOMR_WHATSAPP_GROUP_URL in core/include-path.php — single source for the group invite link.<?php echo htmlspecialchars(defined('MYOMR_WHATSAPP_GROUP_URL') ? MYOMR_WHATSAPP_GROUP_URL : 'https://chat.whatsapp.com/Eixz1mmURuFLvnNZzCfGDi'); ?>footer-social__link--wa in assets/css/footer.css (green #25d366).MYOMR_FACEBOOK_GROUP_URL in core/include-path.php — single source for Facebook community group links.<?php echo htmlspecialchars(defined('MYOMR_FACEBOOK_GROUP_URL') ? MYOMR_FACEBOOK_GROUP_URL : 'https://www.facebook.com/groups/416854920508620'); ?>footer-social__link--fb-group in assets/css/footer.css (Facebook blue #1877f2).core/ad-registry.php defines slot IDs and optional creative config.components/ad-banner-slot.php; loaded via omr_ad_slot() from component-includes.php. Use omr_ad_slot($slot_id, $size) e.g. omr_ad_slot('article-top', '728x90') or omr_ad_slot('homepage-top', '336x280').article-top, article-mid), homepage (e.g. in 65/35 row with Buy & Sell), job listing/detail, events; add new slot IDs in the registry when adding new placements.assets/css/ad-banners.css; ensure it is loaded on pages that show ad slots.omr_nav() / omr_footer() when editing.info/sitemap.xml may exist in repo/history; canonical sitemap entry point is /sitemap.xml (index). Maintain redirects and avoid dual sitemap sources.work_segment classification:
officemanpowerhybridjob_postings.work_segment with backfill + default + index.jobPostingsHasColumn()inferJobSegmentFromData()function_exists() guarded fallback definitions as needed.omr-local-job-listings/assets/job-portal-2026.css.index.php, mirror structure in:
omr-local-job-listings/api/jobs.phpomr-local-job-listings/assets/job-ajax-search.jsjob_apply_cta_clickjob_whatsapp_click<body>:
data-job-iddata-job-titledata-company-name