\ No newline at end of file
diff --git a/app/controllers/avo/preview_projects_controller.rb b/app/controllers/avo/preview_projects_controller.rb
new file mode 100644
index 00000000..49adc21d
--- /dev/null
+++ b/app/controllers/avo/preview_projects_controller.rb
@@ -0,0 +1,4 @@
+# This controller has been generated to enable Rails' resource routes.
+# More information on https://docs.avohq.io/3.0/controllers.html
+class Avo::PreviewProjectsController < Avo::ResourcesController
+end
diff --git a/app/controllers/projects/preview_projects_controller.rb b/app/controllers/projects/preview_projects_controller.rb
new file mode 100644
index 00000000..d6bae9de
--- /dev/null
+++ b/app/controllers/projects/preview_projects_controller.rb
@@ -0,0 +1,25 @@
+class Projects::PreviewProjectsController < Projects::BaseController
+ before_action :set_project
+
+ class MockPr < Struct.new(:title, :number, :username)
+ end
+
+ def index
+ @prs = [
+ MockPr.new(title: "Support for preview apps", number: "717", username: "czhu12"),
+ MockPr.new(title: "Add gitlab support for non authenticated users", number: "710", username: "czhu12"),
+ ]
+ @running_projects = [
+ PreviewProject.new(project:)
+ ]
+ end
+
+ def create
+ end
+
+ def edit
+ end
+
+ def update
+ end
+end
\ No newline at end of file
diff --git a/app/models/preview_project.rb b/app/models/preview_project.rb
new file mode 100644
index 00000000..e756f7e1
--- /dev/null
+++ b/app/models/preview_project.rb
@@ -0,0 +1,23 @@
+# == Schema Information
+#
+# Table name: preview_projects
+#
+# id :bigint not null, primary key
+# clean_up_command :text
+# created_at :datetime not null
+# updated_at :datetime not null
+# external_id :string
+# project_id :bigint not null
+#
+# Indexes
+#
+# index_preview_projects_on_project_id (project_id)
+#
+# Foreign Keys
+#
+# fk_rails_... (project_id => projects.id)
+#
+class PreviewProject < ApplicationRecord
+ belongs_to :project
+ #belongs_to :base_project
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index 09e8d6d7..ca950b1c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -40,6 +40,10 @@ class Project < ApplicationRecord
has_many :volumes, dependent: :destroy
has_one :project_credential_provider, dependent: :destroy
+
+ has_one :preview_project, dependent: :destroy
+ has_many :previews, class_name: "Project"
+
validates :name, presence: true,
format: { with: /\A[a-z0-9-]+\z/, message: "must be lowercase, numbers, and hyphens only" }
validates :repository_url, presence: true,
diff --git a/app/services/review_app/definition.rb b/app/services/review_app/definition.rb
new file mode 100644
index 00000000..9024431f
--- /dev/null
+++ b/app/services/review_app/definition.rb
@@ -0,0 +1,21 @@
+class ReviewApp::Definition
+ def initialize(yaml_path, context = {})
+ content = if yaml_path.end_with?('.erb')
+ require 'erb'
+ erb = ERB.new(File.read(yaml_path))
+ context_binding = binding
+ context.each { |key, value| context_binding.local_variable_set(key, value) }
+ erb.result(context_binding)
+ else
+ File.read(yaml_path)
+ end
+
+ @definition = YAML.load(content)
+ end
+
+ def to_yaml
+ {
+ name: @project.name,
+ }
+ end
+end
\ No newline at end of file
diff --git a/app/views/projects/_sidebar.html.erb b/app/views/projects/_sidebar.html.erb
index c9717dda..e8ded365 100644
--- a/app/views/projects/_sidebar.html.erb
+++ b/app/views/projects/_sidebar.html.erb
@@ -29,6 +29,12 @@
<% end %>
+ <%= link_to project_preview_projects_path(project), class: "tab hover:bg-base-content/15 #{'tab-active' if current_page?(project_preview_projects_path(project))}" do %>
+
+ Preview Apps
+
+
+ <% end %>
<%= link_to edit_project_path(project), class: "tab hover:bg-base-content/15 #{'tab-active' if current_page?(edit_project_path(project))}" do %>
+ Volumes are a way to persist data across container restarts. In general, you should use a database for this.
+ A volume will not work if you have more than one node in your cluster.
+
+ <%= render(FormFieldComponent.new(label: "Enable preview apps")) do %>
+ <%= form.check_box :preview_apps, class: "checkbox" %>
+ <% end %>
+
+ <%= render(FormFieldComponent.new(
+ label: "Cluster",
+ description: "The cluster to deploy the preview apps to."
+ )) do %>
+ <%= form.collection_select :cluster_id, current_account.clusters, :id, :name, { include_blank: "Select a cluster" }, { class: "select select-bordered w-full" } %>
+
+ <% end %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/projects/preview_projects/_show.html.erb b/app/views/projects/preview_projects/_show.html.erb
new file mode 100644
index 00000000..1668b211
--- /dev/null
+++ b/app/views/projects/preview_projects/_show.html.erb
@@ -0,0 +1,4 @@
+