Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/lighthouse.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ jobs:
- name: Validate SEO metadata and canonical URLs
run: python3 scripts/seo-audit.py

- name: Test cron parsing and schedule evaluation
run: node --test scripts/crontab.test.cjs

- name: Validate HTML
uses: Cyb3r-Jak3/html5validator-action@v7.2.0
with:
Expand All @@ -48,6 +51,7 @@ jobs:
kubernetes-rbac-explorer/index.html
visual-subnet-calculator/index.html
yaml-formatter/index.html
crontab/index.html
terraform-modules/index.html
fail: true
jobSummary: true
Expand All @@ -72,4 +76,5 @@ jobs:
http://127.0.0.1:8080/kubernetes-rbac-explorer/
http://127.0.0.1:8080/visual-subnet-calculator/
http://127.0.0.1:8080/yaml-formatter/
http://127.0.0.1:8080/crontab/
http://127.0.0.1:8080/terraform-modules/
40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,45 @@ operations, sensitive cluster access, RBAC administration, aggregated
ClusterRoles, and incomplete policy exports. Consecutive sample selections do
not repeat the same scenario.

## Cron Schedule Builder

Open `/crontab/` to build and explain cron expressions, preview
upcoming times in an IANA time zone alongside UTC, and export scheduler configuration.
Linux cron, Kubernetes CronJob, GitHub Actions, and AWS EventBridge Scheduler
have separate validation rules and configuration exports. Presets and field
shortcuts help build expressions without memorizing syntax.
The time-zone field accepts manual IANA names and provides a searchable dropdown
with mouse, touch, and keyboard selection.
Choose 1, 2, 5, 10, 25, or 50 upcoming runs; share links retain the selected count.

The builder supports lists, ranges, steps, named months and weekdays, common
Linux/Kubernetes macros, Kubernetes question-mark wildcards, and AWS year,
last-day, nearest-weekday, last-weekday, and nth-weekday fields. It handles
missing and repeated local times, including half-hour clock changes, according
to the documented preview policy for each platform. GitHub's undocumented
fall-back behavior is explicitly modeled as the first occurrence. Actual
execution remains the scheduler's responsibility.

The preview searches eight calendar years after a user-selected UTC instant.
Rare or impossible schedules report partial or empty results separately from
syntax errors. Configuration, CSV downloads, and share links are generated in
the browser. Sharing encodes settings in the URL fragment; there is no backend.
Quartz, seconds fields, rate expressions, and `@reboot` are not supported.

The dependency-free engine is in `crontab/cron.js`; DOM interaction
and exports are in `app.js`, with page markup and responsive styles alongside them.
Run the calendar and timezone regression tests with Node.js 22 or later:

```sh
node --test scripts/crontab.test.cjs
```

The page includes static instructions, crontab examples, a syntax reference,
visible breadcrumbs, and connected page/application/author/image structured data.
`python3 scripts/seo-audit.py` verifies these SEO relationships and related-tool
links. Follow the crontab checks in [`SEARCH_CONSOLE.md`](./SEARCH_CONSOLE.md)
after deployment to inspect indexing and measure actual search performance.

## Terraform Modules

Open `/terraform-modules/` to explore public AWS Terraform modules
Expand Down Expand Up @@ -187,6 +226,7 @@ python3 -m http.server 8080
- `http://localhost:8080/kubernetes-rbac-explorer/`
- `http://localhost:8080/visual-subnet-calculator/`
- `http://localhost:8080/yaml-formatter/`
- `http://localhost:8080/crontab/`
- `http://localhost:8080/terraform-modules/`

## Quality and search checks
Expand Down
53 changes: 49 additions & 4 deletions SEARCH_CONSOLE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ directives, matching Open Graph and structured-data URLs, and an entry in
`sitemap.xml`. `robots.txt` advertises that sitemap. The duplicate
`/json-formatter/` alias points directly to `/yaml-formatter/` through an instant
meta refresh and a canonical link; it is excluded from the sitemap and navigation.
The cron tool is published only at `/crontab/`, with the same canonical URL in
its page metadata, structured data, navigation, and sitemap.

Ownership verification must be completed by a Google account with access to
Search Console. The verification value is account-issued and must not be
Expand Down Expand Up @@ -35,8 +37,9 @@ invented or replaced with a placeholder.
- `https://native-cube.com/kubernetes-rbac-explorer/`
- `https://native-cube.com/visual-subnet-calculator/`
- `https://native-cube.com/yaml-formatter/`
- `https://native-cube.com/crontab/`
- `https://native-cube.com/terraform-modules/`
4. Do not submit `/json-formatter/`; it is a permanent redirect alias.
4. Do not submit `/json-formatter/`; it is a redirect alias.

## Confirm Google's selected canonical

Expand Down Expand Up @@ -76,8 +79,8 @@ python3 scripts/check-redirects.py
```

It checks every sitemap page across HTTP/HTTPS, apex/`www`, and the old GitHub
Pages hostname, plus slashless paths, `index.html` duplicates, and formatter
aliases. It follows HTTP and instant meta-refresh redirects explicitly, rejects
Pages hostname, plus slashless paths, `index.html` duplicates, and the formatter
alias. It follows HTTP and instant meta-refresh redirects explicitly, rejects
loops and temporary or insecure redirects, and checks that each final page is
HTTP 200 with the expected canonical and no indexing restrictions. The separate
**Live redirect checks** workflow runs weekly and can be started manually in
Expand All @@ -98,7 +101,7 @@ permanently to the apex HTTPS URLs. The formatter alias still served the old
`noindex` directive before this change was deployed. This is a consolidation
signal issue; it does not prove the cause of an account's **Redirect error**.

## Hosting settings and the formatter alias
## Hosting settings and redirect aliases

Keep **Settings → Pages → Custom domain** set to `native-cube.com` and
**Enforce HTTPS** enabled. The repository's `CNAME` file does not by itself
Expand Down Expand Up @@ -128,6 +131,48 @@ After publishing, rerun the live audit, resubmit the canonical sitemap, and use
pages and validate actual **Redirect error** fixes. Historical exclusions remain
until Google recrawls them, and intentional redirects remain excluded.

## Check and measure the crontab page

After publishing changes to `/crontab/`:

1. Inspect `https://native-cube.com/crontab/` with **Test live URL**. Confirm HTTP
200, an indexable response, and the exact same user-declared canonical. The
slashless URL, `/index.html` variant, query strings, and share fragments must
not become separate sitemap entries.
2. Review the rendered HTML and screenshot. The crontab heading, quick-start
instructions, syntax guide, examples, scheduler notes, FAQ, and ordinary
navigation links are in the original HTML. Only interactive calculations
require JavaScript. Keep the tool's default preview at two runs.
3. Validate the JSON-LD with the
[Schema Markup Validator](https://validator.schema.org/) and Google's
[Rich Results Test](https://search.google.com/test/rich-results). `WebPage`,
`WebApplication`, `BreadcrumbList`, `Person`, and `ImageObject` describe the
actual content and free access. Google's
[software app rich-result requirements](https://developers.google.com/search/docs/appearance/structured-data/software-app)
include a genuine rating or review; the tool does not currently publish
either. Do not invent one to remove an eligibility warning. The visible FAQ
does not imply eligibility for FAQ rich results, which Google
[limits to qualifying government and health sites](https://developers.google.com/search/blog/2023/08/howto-faq-changes).
4. Request indexing for the canonical URL after the live checks pass, and
confirm that Google's selected canonical eventually matches it. Account
ownership and URL inspection are performed in Search Console; a passing
local audit cannot establish that a page is indexed.
5. In **Performance → Search results**, filter **Page** to the exact canonical
URL. Compare impressions, clicks, CTR, and average position over comparable
date ranges, then segment by device, country, and query. Initial query groups
to inspect include crontab generators, cron expression testers, common
schedules, and time-zone questions. These are hypotheses, not measured
keyword volumes or ranking predictions.
6. Check the **Core Web Vitals** report when field data is available. Local
Lighthouse scores measure a lab run, not real-user performance or ranking.

The SEO audit verifies the crontab schema relationships, matching page and social
titles, static examples, incoming links from related tools, and agreement between
`dateModified` and sitemap `lastmod`. It runs in the existing Lighthouse and SEO
workflow. Shared schedules remain URL fragments and retain the same clean
canonical, following Google's
[canonicalization guidance](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls).

## Keep sitemap dates accurate

Update a page's `lastmod` when its public content or metadata changes. The
Expand Down
Binary file added assets/social/crontab.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 47 additions & 0 deletions assets/social/crontab.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading