diff --git a/hubzilla/addon/cry01/cry01.php b/hubzilla/addon/cry01/cry01.php
new file mode 100644
index 0000000..019f5b6
--- /dev/null
+++ b/hubzilla/addon/cry01/cry01.php
@@ -0,0 +1,224 @@
+
+
+ HOA_MEMBER standing required to register a signal for ' . $name . '.
+ The signal board is readable by verified participants only.
+ To participate, you must complete the SASE process.
+ Visit
+ directory.diagnostics.kane-il.us
+ to begin.
+
+
+ ';
+}
+
+// ---------------------------------------------------------------------------
+// CONTENT ROUTER
+// ---------------------------------------------------------------------------
+
+function cry01_content() {
+ if (function_exists('head_add_css')) {
+ head_add_css('/addon/cry01/view/css/cry01.css');
+ }
+ if (function_exists('head_add_js')) {
+ head_add_js('/addon/cry01/view/js/cry01.js');
+ }
+
+ $association_slug = argv(1) ?? '';
+ $sub_route = strtolower(argv(2) ?? '');
+
+ if (!$association_slug) {
+ return cry01_render_index();
+ }
+
+ $raw = @file_get_contents('addon/vs01/config.json');
+ if ($raw === false) return cry01_render_error('Configuration unavailable. Contact the operator.');
+ $cfg = json_decode($raw, true);
+ if (!isset($cfg['associations'][$association_slug])) {
+ return cry01_render_not_found();
+ }
+
+ $access = cry01_access_state($association_slug);
+
+ switch ($sub_route) {
+ case 'signal':
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ if ($access === 'public') return cry01_access_wall($association_slug);
+ if (!cry01_verify_csrf()) {
+ return cry01_render_error('Invalid form token. Please reload and try again.');
+ }
+ return cry01_handle_signal_post($association_slug, $access);
+ }
+ if ($access === 'public') return cry01_access_wall($association_slug);
+ return cry01_render_signal_form($association_slug, $access);
+
+ case 'g1':
+ if ($access !== 'operator') return cry01_access_wall($association_slug);
+ return cry01_render_g1_candidates($association_slug);
+
+ case 'manage':
+ if ($access !== 'operator') return cry01_access_wall($association_slug);
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ return cry01_handle_manage_post($association_slug);
+ }
+ return cry01_render_manage($association_slug);
+
+ default:
+ return cry01_render_landing($association_slug, $access);
+ }
+}
+
+// ---------------------------------------------------------------------------
+// RENDER — INDEX
+// ---------------------------------------------------------------------------
+
+function cry01_render_index() {
+ // Lists all registered associations with links to their value layer pages.
+ $raw = @file_get_contents('addon/vs01/config.json');
+ $cfg = $raw ? json_decode($raw, true) : [];
+ $list = $cfg['associations'] ?? [];
+
+ if (empty($list)) {
+ return '