For developers.
Working with a
codebot.
Speed up your development workflow with fully customisable code for both server-side and client-side.
Choose a codebot.
C#Bot
C#Bot is a full-stack bot that writes C# code, paired with a React clientside.
SpringBot
SpringBot is a full-stack bot that writes Java code, paired with an Angular clientside.
C#Bot
C#Bot is a full-stack bot that writes C# code, paired with a React clientside.
SpringBot
SpringBot is a full-stack bot that writes Java code, paired with an Angular clientside.
Meet the bots
Show the codebot what to code.
Entity diagram.
Interface builder.
Security.
Model your database
architecture.
0:19
Check out the tools in more detail.
Layout your front-end
with pages and tiles.
0:19
Check out the tools in more detail.
Define your end user's
permissions.
0:19
Check out the tools in more detail.
The codebots write human readable code to your Git.
C# - Server
React - Client
Spring - Server
Angular - Client
///
/// Get the FishEntity for the given id
///
/// The id of the FishEntity to be fetched
/// A cancellation token
/// The FishEntity object with the given id
// % protected region % [Override get attributes here] off begin
[HttpGet]
[Route("{id}")]
[Authorize]
// % protected region % [Override get attributes here] end
public async Task Get(Guid id, CancellationToken cancellation)
{
// % protected region % [Override Get by id here] off begin
var result = _crudService.GetById(id);
return await result
.Select(model => new FishEntityDto(model))
.AsNoTracking()
.FirstOrDefaultAsync(cancellation);
// % protected region % [Override Get by id here] end
}
@observer
export default class LoginPage extends React.Component<RouteComponentProps> {
@observable
private loginState: ILoginState = defaultLoginState;
...
public render() {
let contents = null;
if (store.loggedIn) {
return <Redirect to="/" />;
}
contents = (
<div className="body-content">
<form className="login" onSubmit={this.onLoginClicked}>
<h2>Login</h2>
<TextField
id="login_username"
className="login-username"
model={this.loginState}
modelProperty="username"
label="Email Address"
inputProps={{ autoComplete: 'username', type: "email" }}
isRequired={true}
errors={this.loginState.errors['username']} />
<Password
id="login_password"
className="login-password"
model={this.loginState}
modelProperty="password"
label="Password"
inputProps={{ autoComplete: "current-password" }}
isRequired={true}
errors={this.loginState.errors['password']} />
<ButtonGroup alignment={Alignment.HORIZONTAL} className="login-buttons">
<Button type='submit' className="login-submit" display={Display.Solid} sizes={Sizes.Medium} buttonProps={{ id: "login_submit" }}>Login</Button>
<Button className="start-register" display={Display.Solid} colors={Colors.Secondary} sizes={Sizes.Medium} buttonProps={{ id: "login_register" }} onClick={this.onStartRegisterClicked}>Register</Button>
</ButtonGroup>
<p>
<a className='link-forgotten-password link-rm-txt-dec' onClick={this.onForgottenPasswordClick}>Forgot your password? </a>
</p>
</form>
</div>
);
return contents;
}
@action
private onLoginClicked = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
...
};
...
@action
private onStartRegisterClicked = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
const { redirect } = queryString.parse(this.props.location.search.substring(1));
store.routerHistory.push(`/register?${!!redirect ? `redirect=${redirect}` : ''}`);
};
@action
private onLoginSuccess = (userResult: IUserResult) => {
store.setLoggedInUser(userResult);
...
};
@action
private onForgottenPasswordClick = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
store.routerHistory.push(`/reset-password-request`);
};
...
}
/**
* Return the Fish that has the same id as the given id.
*
* @param id The id of the FishEntity to be returned
* @param expands The expand string to be used when expanding
* @return the Fish that has the same id as the given id
*/
// % protected region % [Customise the security configuration here for the getWithId endpoint] off begin
// % protected region % [Customise the security configuration here for the getWithId endpoint] end
@ApiOperation(
value = "Return a single Fish as defined by the id provided.",
authorizations = {@Authorization(value = "bearerToken")}
)
@ApiResponses(value = {
@ApiResponse(code = 404, message = "Fish entity not found"),
})
@PreAuthorize("hasPermission('FishEntity', 'read')")
@GetMapping(value = "/{id}", produces = "application/json")
public ResponseEntity getById(
@ApiParam("The UUID of the Fish to return.")
@PathVariable("id") UUID id
) {
Optional fishEntity = fishService.findById(id);
// % protected region % [Add any final logic before returning the entity here] off begin
// % protected region % [Add any final logic before returning the entity here] end
if (fishEntity.isPresent()) {
return new ResponseEntity<>(fishEntity.get(), HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@Component({
selector: 'cb-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss']
})
export class LoginComponent {
readonly buttonAccentColour = ButtonAccentColour;
ButtonStyle = ButtonStyle;
...
constructor(
private authenticationService: AuthenticationService,
private routerStore: Store
) {
this.routerStore.select(getRouterState).subscribe(
routerState => this.routerState = routerState
);
}
/**
* Triggered when the user clicks the `Login` button.
*/
onSubmit(): void {
// % protected region % [Override the default login behaviour here] off begin
const obs = this.authenticationService.login(this.loginForm.get('email').value, this.loginForm.get('password').value);
...
}
...
Take a deep dive into the source code
What you get out of the box.
At the core of Codebots is the ability to model and prototype CRUD applications.

Check out an example
A system for admin users to configure their application.

Our bots have been engineered with
OWASP security in mind.

Security information
Choose from REST API and GraphQL to
integrate with your data.


There's CRUD and then there's Codebots CRUD.
At the core of Codebots is the ability to model and prototype CRUD applications.
Check out an example
Content management system.
A system for admin users to configure their application.

Someone say APIs?
Choose from REST API and GraphQL to integrate with your data.
Check our Swagger docsOver to you.
You can customise the source code with protected regions. Code in these snippets will not be overwritten when you update your app on Codebots.