Moth+Flame VR
Marketing website for a VR training and assessment platform. I worked on the site and its SEO, giving the company a sharper corporate presence.
I’m Neil, a freelance Framer developer. I build marketing sites, templates and interactive pieces that load fast, hold up at every screen size and stay easy for your team to edit. I also write smart contracts in Solidity.
Booking projects from November 2026
Recent client work: Moth+Flame VR, One PR
Six projects, all live
Marketing website for a VR training and assessment platform. I worked on the site and its SEO, giving the company a sharper corporate presence.
Client site
Marketing site for a digital PR agency, built in Framer. A long home page that carries results, case studies, a blog and a strategy-call path.
one.as
Framer template, interactive
A portfolio that behaves like an old desktop computer. Visitors drag windows around, use a working taskbar, browse projects from the CMS and play four retro games.
portfolioboss.framer.website
Framer template
A wedding invitation site with the couple’s story, an hour-by-hour schedule, venues with directions and a guest FAQ.
wedin.framer.website
Framer template
A restaurant site with a browsable menu book, reservations and event booking, built around big food photography and loud type.
whimsys.framer.website
Framer template
A local-services site for plumbers: services, reviews, service areas and an FAQ, with a call or booking prompt at every step.
geniusplumbing.framer.websiteMost projects start with a finished design and end with a site the team can run themselves. I handle everything in between.
Tools I work inFramer, Figma, HTML, CSS, JavaScript, Solidity, Hardhat, Viem, Ethers.js
I care about the details people notice, and the technical details they don’t.
I’m Sajjadul Kibria Neil. Most people just call me Neil. I studied Economics, started out in web design and development, and ended up specializing in Framer.
Curiosity about what happens underneath the interface pulled me into JavaScript and then Solidity. Today most of my work is Framer sites for clients and templates of my own, alongside a steady practice of writing and deploying smart contracts.
I’m learning blockchain development by building: small, practical Solidity contracts, tested with Hardhat and deployed to the Sepolia test network. No audits and no mainnet protocols yet. Just working code and a clear direction.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract TipJar is Ownable {
mapping(address => uint256) public balances;
bool public paused;
event Deposited(address indexed from, uint256 amount);
event Withdrawn(address indexed to, uint256 amount);
constructor() Ownable(msg.sender) {}
function deposit() external payable {
require(!paused, "Deposits are paused");
balances[msg.sender] += msg.value;
emit Deposited(msg.sender, msg.value);
}
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount; // state changes first
(bool ok, ) = msg.sender.call{value: amount}(""); // then the call
require(ok, "Transfer failed");
emit Withdrawn(msg.sender, amount);
}
function setPaused(bool value) external onlyOwner {
paused = value;
}
}
The balance is reduced before ETH leaves the contract. If the recipient calls back into withdraw(), the balance check fails.
Each deposit and withdrawal emits an event, so a front end can follow the contract without reading its storage.
deposit() is marked payable, which lets it receive ETH. The amount arrives as msg.value.
Only the owner can pause deposits. The onlyOwner modifier comes from the inherited contract.
TipJar inherits from OpenZeppelin’s Ownable and passes the deployer to its constructor.