Runlevel Tools
Your project hub for planning, code, issues, builds, and help.
Runlevel Tools gives your project one place to plan work, share code, submit issues, track progress, and request help from Runlevel Systems.
-
Kanban Planning
-
Issue Requests
-
Code Access
-
Repository Integration
-
Build Tracking
-
Testing Notes
-
Deployment Tracking
-
Documentation
-
Team Collaboration
-
Progress Visibility
+
Kanban Planning
Organize work, priorities, and next steps in one shared place.
+
Issue Requests
Submit fixes, questions, screenshots, and support needs as they happen.
+
Code Access
Share repositories, branches, and technical context when code review is needed.
+
Repository Integration
Connect source control to the project workflow for better visibility.
+
Build Tracking
See build status, troubleshooting notes, and release progress.
+
Testing Notes
Track validation details, regressions, and review checkpoints.
+
Deployment Tracking
Follow rollout steps, launch tasks, and environment updates.
+
Documentation
Keep project instructions, decisions, and technical notes together.
+
Team Collaboration
Coordinate updates between your team and Runlevel Systems.
+
Progress Visibility
Review milestones, work status, and next actions without guessing.
Customers can submit requests, share details, attach screenshots, track progress, and review milestones.
Runlevel Systems can review code, fix problems, build features, validate builds, assist deployments, and document work.
@@ -113,11 +101,12 @@
-
Ready To Move Your Project Forward?
-
Bring your blocked project, launch plan, or feature backlog and we will help you ship.
+
Need One More Capable Team On The Project?
+
Bring the backlog, blocked feature, messy build, website update, mobile issue, or deployment problem. Runlevel Systems can step in with Dev+1 support.
DESIGN • DEBUG • DEPLOY
diff --git a/estimate.php b/estimate.php
index 41c6236..75e08fd 100644
--- a/estimate.php
+++ b/estimate.php
@@ -1,393 +1,4 @@
(string)($fullUser['display_name'] ?? ''),
- 'email' => (string)($fullUser['email'] ?? ''),
- 'phone' => (string)($fullUser['phone'] ?? ''),
- 'discord_username' => (string)($fullUser['discord_username'] ?? ''),
- 'contact_method' => 'Email',
- 'project_type' => '',
- 'project_stage' => '',
- 'project_size' => '',
- 'timeline' => '',
- 'budget_comfort' => '',
- 'repo_link' => '',
- 'description' => '',
- 'desired_username' => '',
-];
-
-$form = $defaults;
-if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- foreach ($form as $key => $value) {
- $form[$key] = trim((string)($_POST[$key] ?? ''));
- }
-}
-
-if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit_request'])) {
- $name = $form['name'];
- $email = $form['email'];
- $phone = $form['phone'];
- $discordUsername = $form['discord_username'];
- $contactMethod = $form['contact_method'];
- $projectType = $form['project_type'];
- $projectStage = $form['project_stage'];
- $projectSize = $form['project_size'];
- $timeline = $form['timeline'];
- $budgetComfort = $form['budget_comfort'];
- $repoLink = $form['repo_link'];
- $description = $form['description'];
- $desiredUsername = strtolower($form['desired_username']);
-
- if ($name === '') {
- $error = 'Please enter your name.';
- } elseif ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
- $error = 'Please enter a valid email address.';
- } elseif (!in_array($projectType, $projectTypes, true)) {
- $error = 'Please select a project type.';
- } elseif (!in_array($projectStage, $projectStages, true)) {
- $error = 'Please select a project stage.';
- } elseif (!in_array($projectSize, $projectSizes, true)) {
- $error = 'Please select a project size.';
- } elseif (!in_array($timeline, $timelineOptions, true)) {
- $error = 'Please select a timeline.';
- } elseif (!in_array($budgetComfort, $budgetComfortOptions, true)) {
- $error = 'Please select your budget comfort.';
- } elseif (!in_array($contactMethod, $contactOptions, true)) {
- $error = 'Please select a preferred contact method.';
- } elseif ($description === '') {
- $error = 'Please describe your request.';
- } elseif ($repoLink !== '' && !filter_var($repoLink, FILTER_VALIDATE_URL)) {
- $error = 'The repository or project link does not appear to be a valid URL.';
- } elseif (!$isLoggedIn && $desiredUsername === '') {
- $error = 'Please enter a desired username.';
- } elseif (!$isLoggedIn && !portalIsValidEstimateUsername($desiredUsername)) {
- $error = 'Username must be at least 3 characters and use only letters, numbers, dash, or underscore.';
- }
-
- $createdAccount = null;
- $clientUsername = '';
- if ($error === '') {
- if ($isLoggedIn && !empty($sessionUser['username'])) {
- $clientUsername = (string)$sessionUser['username'];
- } else {
- $createError = '';
- $createdAccount = portalCreateClientUserFromEstimate(
- $desiredUsername,
- $name,
- $email,
- $phone,
- $discordUsername,
- $createError
- );
- if ($createdAccount === false) {
- $error = $createError !== '' ? $createError : 'Unable to create your client account right now.';
- } else {
- $clientUsername = (string)$createdAccount['username'];
- }
- }
- }
-
- if ($error === '') {
- $requestId = portalGenerateUniqueRequestId();
- $request = [
- 'id' => bin2hex(random_bytes(8)),
- 'request_id' => $requestId,
- 'estimate_id' => $requestId,
- 'client_username' => $clientUsername,
- 'name' => $name,
- 'email' => $email,
- 'phone' => $phone,
- 'discord_username' => $discordUsername,
- 'contact_method' => $contactMethod,
- 'project_type' => $projectType,
- 'project_stage' => $projectStage,
- 'project_size' => $projectSize,
- 'timeline' => $timeline,
- 'budget_comfort' => $budgetComfort,
- 'repo_link' => $repoLink,
- 'description' => $description,
- 'status' => 'new',
- 'estimated_cost_range' => '',
- 'estimated_time_range' => '',
- 'staff_summary' => '',
- 'recommended_next_step' => '',
- 'internal_notes' => '',
- 'proposal_ids' => [],
- 'agreement_ids' => [],
- 'created_at' => date('c'),
- ];
-
- if (!portalAppendProjectRequest($request)) {
- $error = 'There was an error saving your request. Please try again or contact us directly.';
- } else {
- $success = true;
- $submitted = [
- 'request' => $request,
- 'created_account' => $createdAccount,
- ];
-
- $ackSubject = 'Project Request Received - ' . $requestId;
- $ackBody = "Hello {$name},\n\n"
- . "Project Request Received\n\n"
- . "Request ID:\n{$requestId}\n\n"
- . "Please save this ID. You can reference it if you contact us by email, phone, Google Meet, or Discord.\n\n"
- . "Runlevel Systems\n"
- . "DESIGN • DEBUG • DEPLOY\n";
- send_email($email, $ackSubject, $ackBody);
-
- if ($createdAccount !== null) {
- $verifyLink = 'https://' . ($_SERVER['HTTP_HOST'] ?? 'runlevel.systems')
- . '/verify-email.php?token=' . urlencode((string)$createdAccount['verification_token']);
- $subject = 'Verify your Runlevel Systems account - ' . $requestId;
- $body = "Hello {$name},\n\n"
- . "We received your project request.\n\n"
- . "Request ID:\n{$requestId}\n\n"
- . "A client dashboard account was created for you:\n\n"
- . "Username:\n{$clientUsername}\n\n"
- . "Temporary password:\n{$createdAccount['temporary_password']}\n\n"
- . "Please verify your email before logging in:\n\n"
- . "{$verifyLink}\n\n"
- . "Runlevel Systems\n"
- . "DESIGN • DEBUG • DEPLOY\n";
- send_email($email, $subject, $body);
- }
- }
- }
-}
-?>
-
-
-
-
-
-
-
-
Project Request | Runlevel Systems
-
-
-
-
-
-
-
-
-
-
Project Request
-
Tell us what you need. We will review it and respond with the next step.
-
-
-
-
-
-
-
-
-
Project Request Received
-
Your Request ID:
-
-
Please save this ID. You can reference it if you contact us by email, phone, Google Meet, or Discord.
-
-
-
Your client account:
-
-
-
-
Please check your email to verify your account before logging in.
-
Temporary password:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+http_response_code(301);
+header('Location: /start-project.php');
+exit;
diff --git a/game-server-panel.php b/game-server-panel.php
index 01c96b9..944454d 100644
--- a/game-server-panel.php
+++ b/game-server-panel.php
@@ -31,23 +31,25 @@