{"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]} {"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]}
top of page
Construction Workers

Our Services

We Offer a Range of Services to Meet Your Needs

Home Improvements

AB Construction are here to help you with your dream home improvements.

If you’re in need of a new kitchen, a new bathroom, general building services or lost conversion, we are here and happy to help.

Our team will treat your property like it’s ours, treating it with the respect, care and attention it deserves.

Residential Buildings
Modern Kitchen

Kitchen Installation

We spend so much of our lives in our kitchens, whether we eat, talk, cook, or clean there. They're a key part of any home and that's why it is essential to know that professionals are fitting appliances and surfaces to the highest possible standards. We will install everything from kitchen cupboards to worktops and appliances, giving you the kitchen makeover you've been wanting!

Building Services

From plastering to office door installation, general building services will be able to handle any task.

Simply contact a professional today to advise you on the scope of the work you need completing. Their experience and know-how will ensure the job gets done in time and to your satisfaction.

Modern Design Bathroom

Bathroom Installation

If you've finally found your dream bathroom, you're going to need professionals to fit it for you.

They will take your design and ensure that all fixtures and fittings are installed perfectly, ensuring excellent workmanship.

Painting and Decorating

Fancy a fresh new lick of paint in your living room? Or perhaps wanting new decoration throughout your home?

​

Our painting and decorating professionals can take care of this. Just give them your specification and they do the rest while ensuring perfect, mess-free application and workmanship.

Choosing PVC Pipes

Burst Pipes Refurbishment

Burst pipes can be recipe for mould growth, wood rot and flooding.

​

Our qualified plumbers can be relied on to identify the place of the burst and advise on the best course to get it repaired quickly and safely.

Commercial Plumbers

From low water pressure to clogged drains to broken boilers, we cover it all.

​

Don't DIY if it's a serious issue, that's what we're here for!

​

Our team of reliable and experienced plumbers offer a wide range of services to suit all manner of domestic plumbing requirements.

​

We strive to be efficient in all our work and complete all jobs to the highest quality possible.

Plumbers
Window Insulation

Central Heating Installation

Central Heating is needed to regulate heat throughout your home, essential to keeping you warm when the weather gets colder.

We can install central heating into your home so that you can begin heating your home and preparing for the coming winter months.

Loft Conversion

If you're dreaming of turning your musty old loft space into a beautiful extra bedroom then you'll need someone to convert it for you.

​

AB Construction will listen to your ideas, advise you both on the feasibility and what will need to be considered as part of the work. Following this, we will organise the project to convert your loft into the extra living space you never knew you had!

Car inside a Garage

Garage Conversion

Need more space? A Garage Conversion could be perfect for you.

​

We carry out Garage Conversions in order to give you the extra room that you require at your property.

​

Our garage conversions are done by professionals who work efficiently and with care, and who will make sure you’re getting the conversion that you have dreamed of.

bottom of page