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
16 changes: 14 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<h1 align="center">
<div>
<a href="https://maxun-website.vercel.app/">
<img src="/public/img/maxunlogo.png" width="50" />
<img src="/src/assets/maxunlogo.png" width="50" />
<br>
Maxun
</a>
Expand All @@ -18,7 +18,8 @@ Maxun lets you train a robot in 2 minutes and scrape the web on auto-pilot. Web
<a href="https://maxun-website.vercel.app/"><b>Website</b></a> |
<a href="https://discord.com/invite/NFhWDCdb"><b>Discord</b></a> |
<a href="https://x.com/maxun_io"><b>Twitter</b></a> |
<a href="https://docs.google.com/forms/d/e/1FAIpQLSdbD2uhqC4sbg4eLZ9qrFbyrfkXZ2XsI6dQ0USRCQNZNn5pzg/viewform"><b>Join Maxun Cloud</b></a>
<a href="https://docs.google.com/forms/d/e/1FAIpQLSdbD2uhqC4sbg4eLZ9qrFbyrfkXZ2XsI6dQ0USRCQNZNn5pzg/viewform"><b>Join Maxun Cloud</b></a> |
<a href="https://www.youtube.com/@MaxunOSS"><b>Watch Tutorials</b></a>
</p>

![maxun_demo](https://github.com/user-attachments/assets/a61ba670-e56a-4ae1-9681-0b4bd6ba9cdc)
Expand Down Expand Up @@ -109,6 +110,17 @@ BYOP (Bring Your Own Proxy) lets you connect external proxies to bypass anti-bot
# Cloud
We offer a managed cloud version to run Maxun without having to manage the infrastructure and extract data at scale. Maxun cloud also deals with anti-bot detection, huge proxy network with automatic proxy rotation, and CAPTCHA solving. If this interests you, [join the cloud waitlist](https://docs.google.com/forms/d/e/1FAIpQLSdbD2uhqC4sbg4eLZ9qrFbyrfkXZ2XsI6dQ0USRCQNZNn5pzg/viewform) as we launch soon.

# Screenshots
![Maxun PH Launch (1)-1-1](https://github.com/user-attachments/assets/d7c75fa2-2bbc-47bb-a5f6-0ee6c162f391)
![Maxun PH Launch (1)-2-1](https://github.com/user-attachments/assets/d85a3ec7-8ce8-4daa-89aa-52d9617e227a)
![Maxun PH Launch (1)-3-1](https://github.com/user-attachments/assets/4bd5a0b4-485d-44f4-a487-edd9afc18b11)
![Maxun PH Launch (1)-4-1](https://github.com/user-attachments/assets/78140675-a6b6-49b2-981f-6a3d9a32b0b9)
![Maxun PH Launch (1)-5-1](https://github.com/user-attachments/assets/d9fe8519-c81c-4e45-92f2-b2939bf24192)
![Maxun PH Launch (1)-6-1](https://github.com/user-attachments/assets/c26e9ae3-c3da-4280-826a-c7cdf913fb93)
![Maxun PH Launch (1)-7-1](https://github.com/user-attachments/assets/fd7196f4-a6dc-4c4c-9c76-fdd93fac8247)
![Maxun PH Launch (1)-8-1](https://github.com/user-attachments/assets/16ee4a71-772a-49ae-a0e5-cb0529519bda)
![Maxun PH Launch (1)-9-1](https://github.com/user-attachments/assets/160f46fa-0357-4c1b-ba50-b4fe64453bb7)

# Note
This project is in early stages of development. Your feedback is very important for us - we're actively working to improve the product. <a href="https://forms.gle/E8vRMVB7bUbsSktPA">Drop anonymous feedback here.</a>

Expand Down
10 changes: 7 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,6 @@ services:
# DEBUG: pw:api
# PWDEBUG: 1 # Enables debugging
CHROMIUM_FLAGS: '--disable-gpu --no-sandbox --headless=new'
volumes:
# - /tmp/.X11-unix:/tmp/.X11-unix
- /var/run/dbus:/var/run/dbus # Add this for D-Bus support
security_opt:
- seccomp=unconfined # This might help with browser sandbox issues
# Increase shared memory size for Chromium
Expand All @@ -63,6 +60,10 @@ services:
- postgres
- redis
- minio
volumes:
- ./server:/app/server # Mount server source code for hot reloading
- ./maxun-core:/app/maxun-core # Mount maxun-core for any shared code updates
- /var/run/dbus:/var/run/dbus

frontend:
build:
Expand All @@ -71,6 +72,9 @@ services:
ports:
- "5173:5173"
env_file: .env
volumes:
- ./:/app # Mount entire frontend app directory for hot reloading
- /app/node_modules # Anonymous volume to prevent overwriting node_modules
depends_on:
- backend

Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
name="description"
content="Web site created using Vite"
/>
<link rel="icon" type="image/png" href="img/maxunlogo.png">
<link rel="icon" type="image/png" href="src/assets/maxunlogo.png">
<title>Maxun | Open Source No Code Web Data Extraction Platform</title>
</head>
<body>
Expand Down
2 changes: 1 addition & 1 deletion server/src/api/record.ts
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ export async function handleRunRecording(id: string, userId: string) {
throw new Error('browserId or runId or userId is undefined');
}

const socket = io(`${process.env.BACKEND_URL}/${browserId}`, {
const socket = io(`${process.env.BACKEND_URL ? process.env.BACKEND_URL : 'http://localhost:8080'}/${browserId}`, {
transports: ['websocket'],
rejectUnauthorized: false
});
Expand Down
5 changes: 3 additions & 2 deletions server/src/storage/mino.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Client } from 'minio';
import Run from '../models/Run';

const minioClient = new Client({
endPoint: process.env.MINIO_ENDPOINT || 'localhost',
endPoint: process.env.MINIO_ENDPOINT ? process.env.MINIO_ENDPOINT : 'localhost',
port: parseInt(process.env.MINIO_PORT || '9000'),
useSSL: false,
accessKey: process.env.MINIO_ACCESS_KEY || 'minio-access-key',
Expand Down Expand Up @@ -108,7 +108,8 @@ class BinaryOutputService {
await this.uploadBinaryOutputToMinioBucket(run, minioKey, binaryData);

// Construct the public URL for the uploaded object
const publicUrl = `http://${process.env.MINIO_ENDPOINT}:${process.env.MINIO_PORT}/${this.bucketName}/${minioKey}`;
// todo: use minio endpoint
const publicUrl = `http://localhost:${process.env.MINIO_PORT}/${this.bucketName}/${minioKey}`;

// Save the public URL in the result object
uploadedBinaryOutput[key] = publicUrl;
Expand Down
2 changes: 1 addition & 1 deletion server/src/workflow-management/scheduler/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ export async function handleRunRecording(id: string, userId: string) {
throw new Error('browserId or runId or userId is undefined');
}

const socket = io(`${process.env.BACKEND_URL}/${browserId}`, {
const socket = io(`${process.env.BACKEND_URL ? process.env.BACKEND_URL : 'http://localhost:8080'}/${browserId}`, {
transports: ['websocket'],
rejectUnauthorized: false
});
Expand Down
2 changes: 1 addition & 1 deletion src/apiConfig.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes
3 changes: 2 additions & 1 deletion src/components/molecules/ActionDescriptionBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react';
import styled from 'styled-components';
import { Typography, FormControlLabel, Checkbox, Box } from '@mui/material';
import { useActionContext } from '../../context/browserActions';
import MaxunLogo from "../../assets/maxunlogo.png";

const CustomBoxContainer = styled.div`
position: relative;
Expand Down Expand Up @@ -110,7 +111,7 @@ const ActionDescriptionBox = () => {

return (
<CustomBoxContainer>
<Logo src="/img/maxunlogo.png" alt="Maxun Logo" />
<Logo src={MaxunLogo} alt="Maxun Logo" />
<Triangle />
<Content>
{renderActionDescription()}
Expand Down
3 changes: 2 additions & 1 deletion src/components/molecules/NavBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { AuthContext } from '../../context/auth';
import { SaveRecording } from '../molecules/SaveRecording';
import DiscordIcon from '../atoms/DiscordIcon';
import { apiUrl } from '../../apiConfig';
import MaxunLogo from "../../assets/maxunlogo.png";

interface NavBarProps {
recordingName: string;
Expand Down Expand Up @@ -55,7 +56,7 @@ export const NavBar: React.FC<NavBarProps> = ({ recordingName, isRecording }) =>
display: 'flex',
justifyContent: 'flex-start',
}}>
<img src="img/maxunlogo.png" width={45} height={40} style={{ borderRadius: '5px', margin: '5px 0px 5px 15px' }} />
<img src={MaxunLogo} width={45} height={40} style={{ borderRadius: '5px', margin: '5px 0px 5px 15px' }} />
<div style={{ padding: '11px' }}><ProjectName>Maxun</ProjectName></div>
</div>
{
Expand Down
18 changes: 16 additions & 2 deletions src/components/organisms/RightSidePanel.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState, useCallback, useEffect } from 'react';
import React, { useState, useCallback, useEffect, useMemo } from 'react';
import { Button, Paper, Box, TextField, IconButton } from "@mui/material";
import EditIcon from '@mui/icons-material/Edit';
import TextFieldsIcon from '@mui/icons-material/TextFields';
Expand Down Expand Up @@ -373,6 +373,20 @@ export const RightSidePanel: React.FC<RightSidePanelProps> = ({ onFinishCapture
stopGetScreenshot();
};

const isConfirmCaptureDisabled = useMemo(() => {
// Check if we are in the initial stage and if there are no browser steps or no valid list selectors with fields
if (captureStage !== 'initial') return false;

const hasValidListSelector = browserSteps.some(step =>
step.type === 'list' &&
step.listSelector &&
Object.keys(step.fields).length > 0
);

// Disable the button if there are no valid list selectors or if there are unconfirmed list text fields
return !hasValidListSelector || hasUnconfirmedListTextFields;
}, [captureStage, browserSteps, hasUnconfirmedListTextFields]);

return (
<Paper sx={{ height: '520px', width: 'auto', alignItems: "center", background: 'inherit' }} id="browser-actions" elevation={0}>
{/* <SimpleBox height={60} width='100%' background='lightGray' radius='0%'>
Expand All @@ -387,7 +401,7 @@ export const RightSidePanel: React.FC<RightSidePanelProps> = ({ onFinishCapture
<Button
variant="outlined"
onClick={handleConfirmListCapture}
disabled={hasUnconfirmedListTextFields}
disabled={captureStage === 'initial' ? isConfirmCaptureDisabled : hasUnconfirmedListTextFields}
>
{captureStage === 'initial' ? 'Confirm Capture' :
captureStage === 'pagination' ? 'Confirm Pagination' :
Expand Down