Full-stack engineer · AI tooling, bot platforms, and AI-integrated web apps (backend + frontend)
Source code for these projects is private. Architecture diagrams are hosted here in my profile repo so visitors can explore the design without repo access.
| Project | Lang | Description | Architecture |
|---|---|---|---|
| neyobytes-whatsapp-agent | JS |
WhatsApp Bot SaaS platform for creating AI-powered WhatsApp bots — business inquiries, customer support, and automated workflows. Multi-tenant, multi-LLM provider routing, Stripe billing. | 📐 Diagrams · DeepWiki |
| neyobytes-jemput | TS |
Digital wedding invitation platform for the Malaysian market. Couples create beautiful, themed digital invitations. 🌐 Live | 📐 Diagrams · DeepWiki |
| neyobytes-auto-invoice | TS |
AI-assisted Malaysian e-Invoice workflow for SMEs — scan invoices, review official MyInvois fields and code tables, record purchases, and prepare compliant UBL submissions. | TOP SECRET :) |
| Project | Lang | Description | Architecture |
|---|---|---|---|
| pi-fabric-role-router | TS |
Community Pi extension adding centralized role-based model, thinking, and tool routing to Pi Fabric, with roles.run() and roles.spawn() dispatch. |
README |
| pi-pool-router | TS |
In-process extension for pi/omp that pools multiple LLM backends behind a single provider — cache-affinity consistent hashing, failover, health checks, and latency-aware routing. | 📐 Diagrams · DeepWiki |
| discord-rhythm-bot | TS |
Discord audio bot streaming from YouTube & Soundcloud via play-dl. MongoDB-backed user/guild history with priority playlist queue. ⭐ 1 | 📐 Diagrams · DeepWiki |
| pi-xiaomi-mimo-provider | TS |
Pi plugin integrating Xiaomi MiMo models as a provider for the pi coding agent. | 📐 Diagrams · DeepWiki |
| pi-advisor | TS |
Pi extension that attaches a second model as an advisor — it peer-reviews every turn of the main agent, explores the workspace with a read-only toolset, and injects <advisory> notes (nit / concern / blocker). Ports the advisor logic from can1357/oh-my-pi to stock pi. |
📐 Diagrams · DeepWiki |
| omp-vision-handoff | TS |
omp-compatible fork of pi-vision-handoff — gives text-only models vision by proxying image input through a vision-capable model. Fixed omp runtime API mismatches (getApiKeyAndHeaders → getApiKey, broken /compat import). |
INSTALL.md |
| BlackForest-BSC20 | Solidity |
BSC-20 token contract for BlackForest on the Binance Smart Chain. | 📐 Diagrams · DeepWiki |
| YearnDeployerAlerterBot | Java |
Monitors Yearn deployer activity on Etherscan and auto-posts alerts to Twitter. ⭐ 2 | 📐 Diagrams · DeepWiki |
| PR | Project | Description |
|---|---|---|
| #2440 | cobra | Add a way to render Example as a text/template executed against the command, so placeholders like |
| #2441 | cobra | Add OnInitializeE which registers func() error functions run after all OnInitialize functions during preRun. |
| #2442 | cobra | Add a timeValue pflag.Value implementation that parses/formats a time.Time using a reference layout, plus |
| #2443 | cobra | Add a "wrap" template helper for custom usage/help templates: {{wrap .Long 80}} word wraps the given string |
| #2444 | cobra | Add a SuggestFunc field and SetSuggestFunc helper. |
| #2445 | cobra | Add a Command.FlagUsagesTrimRequired(fs) method that returns pflag's FlagUsages output for fs but with the |
| #4253 | date-fns | Add a style option to formatDistanceStrict: long (default, unchanged) uses the locale words; narrow renders |
| #4254 | date-fns | Add a new function formatDurationCustom(duration, labels, options?) that renders a Duration using a custom |
| #4255 | date-fns | Add two functions: addDurations(duration1, duration2) sums two Duration objects component wise (each unit |
| #4256 | date-fns | Add normalizeDuration(duration) that carries overflow units upward within their natural ranges: seconds to |
| #4257 | date-fns | Add formatDatetimeLocal(date, options?) that formats a date as YYYY MM DDTHH:mm by default, with optional { |
| #1551 | valibot | Add a uuidVersion(version, message?) action that takes a version (1 8) and validates the string is a UUID |
| #1552 | valibot | Add a urlRelative(message?) action that accepts relative URLs (URL references without a scheme) by |
| #1553 | valibot | Add an int32(message?) action that validates a number is within [ 2147483648, 2147483647] (the OpenAPI |
| #1554 | valibot | Add an isoDuration(message?) action that validates a string is an ISO 8601 / RFC 3339 duration |
| #1555 | valibot | Add a cidr(message?) action that validates both IPv4 CIDR (192.168.1.0/24) and IPv6 CIDR |
| #1556 | valibot | Add an rfc3339Time(message?) action that validates HH:MM:SS with optional fractional seconds (.\d+) |
| #1557 | valibot | Add a base64Url(message?) action that validates the base64url alphabet with optional padding (both padded |
| #1558 | valibot | valibot has toLowerCase/toUpperCase but no actions for the common case conversions (camelCase, snake_case, |
| #1906 | es-toolkit | Add unFlattenObject(object, {delimiter='.'}) that unflattens a single level object with delimiter separated |
| #1907 | es-toolkit | Add four composable helpers: exponentialBackoff({baseDelay, maxDelay, multiplier}) returns a delay function |
| #1908 | es-toolkit | Add dedent(str) that strips a leading newline + trailing whitespace only line, computes the minimum common |
| #1909 | es-toolkit | Add capitalCase(str) that capitalises the first letter of each word and lower cases the rest, joining words |
| #1910 | es-toolkit | Add memoizePromise(fn, options) that caches the in flight Promise (so concurrent calls with the same |
| #1911 | es-toolkit | Add cartesianProductGenerator(...arrs), a generator that yields each tuple lazily in the same lexicographic |
| #1912 | es-toolkit | Add call(fn) which invokes fn and returns its result (a named IIFE replacement), and callAsync(fn) which |
| #1913 | es-toolkit | Add normalize(value, min, max) returning (value min) / (max min). |
| #1914 | es-toolkit | Add throttleAsync(func, {signal}) that only allows a new invocation when the previous one has completed. |
| #1915 | es-toolkit | Add flowAsync(...funcs): the async counterpart of flow: that awaits each step's result before passing it to |
| #4258 | date-fns | Add nthDayOfMonth(date, dayOfWeek, n) returning the Date of the nth occurrence of dayOfWeek (0=Sunday |
| #4259 | date-fns | Add formatDurationClock(duration, {format, delimiter}) that renders a Duration as a colon separated, zero |
| #4260 | date-fns | Add convertMomentFormat(momentFormat) that converts a moment.js format string to the equivalent date fns |
| #2446 | cobra | Add a DeprecationMessage func(cmd *Command) string field: when set, it is called and its return value |
| #2447 | cobra | Add RemoveGroup(ids...) that removes the groups with matching IDs from the command, mirroring |
| #490 | radash | Add pickBy(obj, predicate) that returns a copy of obj containing only entries whose value passes the |
| #491 | radash | Add pipe(value, ...fns) that passes value through the functions left to right immediately and returns the |
| #492 | radash | Add mapify(array, getKey, getValue?) that builds a Map (supporting any key type, preserving insertion |
| #493 | radash | Add round(value, precision=0) mirroring lodash's round: rounds value to precision decimal places. |
| #494 | radash | Add listToTree(items, {idKey='id', parentKey='parent', childrenKey='children'}) that returns the root nodes |
| #495 | radash | Add cloneDeep(obj) that recursively clones nested objects, arrays, Dates, RegExps, Maps and Sets so the |
| #496 | radash | Add shakeDeep(obj, filter=x => x===undefined) that recursively removes unwanted values from an object and |
| #497 | radash | Add collect(array, fn): a map+filter combo that maps array through fn and keeps only results that are not |
| #498 | radash | Add an onRetry?: (info: { count; error }) => void option that is invoked on each failed attempt (with the 1 |
| #362 | ufo | Add withPathParameters(input, params, options?) that substitutes placeholders matched by |
| #363 | ufo | Add withoutQuery(input) that removes the ?... query section, preserving the rest of the URL including any |
| #199 | ohash | Add sha256(data): the SHA 256 hex digest (node:crypto createHash, lowercase hex), the hex variant of the |
| #186 | defu | Add an allowNullish option to createDefu: createDefu(merger?, { allowNullish: true }) produces a defu |
| #176 | destr | Add a strictBigInt option to Options: when true, a bare integer string beyond Number.MAX_SAFE_INTEGER (e.g. |
| #260 | citty | Add a `validator?: (value, arg) => boolean |
| #261 | citty | Add a "number" ArgType: citty parses the value with Number(), throws a CLIError (EARG) when it is NaN, and |
| #252 | pathe | Add safeName(name): strips illegal characters (< >: " / \ |
| #177 | destr | Add a reviver?: (key, value) => any option modeled on JSON.parse's reviver, applied bottom up to the |
| #187 | defu | Add a warnDuplicates option to createDefu: when true, defu logs a console.warn for each base property |
| #188 | defu | defu merges string keyed properties but silently ignores Symbol keys (Object.keys omits them), so symbol |
| #262 | citty | Add a "multiPositional" ArgType that collects all remaining positional arguments into a string[]. |
| #1916 | es-toolkit | Add deepFreeze(obj) that recursively Object.freezes every nested object/array so no property (including |
| #1917 | es-toolkit | Add chain(...iterables): a lazy generator that yields every element of every iterable, in order, without an |
| #1918 | es-toolkit | Add firstValue(iterable) that pulls a single value via the iterator protocol |
| #1919 | es-toolkit | Add hashObject(value) that returns a deterministic 8 char hex hash of a stable serialization: object keys |
| #4261 | date-fns | Add addDuration(durationA, durationB) and subDuration(durationA, durationB) that, per unit |
| #4262 | date-fns | Add compareDurationsAsc(left, right) returning 1/0/1 (shorter/equal/longer) and compareDurationsDesc(left, |
| #1920 | es-toolkit | Add debounceAsync(func, debounceMs, { signal? |
| #4263 | date-fns | Add parseISODuration(duration): parses P3Y6M4DT12H30M5S into { years:3, months:6, days:4, hours:12, |
| #4264 | date-fns | Add getAge(dateOfBirth, { today }): built on intervalToDuration: returning { years, months, days }, the |
| #4265 | date-fns | Add isBusinessDay(date, { holidays?: Date[], weekStartsOn? |
| #4266 | date-fns | Add isISOMatch(value, { representation? |
| #4267 | date-fns | Add scaleDuration(duration, multiplier): multiplies every present unit of the duration by the multiplier, |
| #1921 | es-toolkit | Add coalesce(key, fn): if a call with key is already in flight, return its promise; otherwise run fn() |
| #2448 | cobra | Add a package level var EnableFlagSorting = true (mirroring EnableCommandSorting). |
| #3959 | faker | Add an optional exclude option (enumValue(enumObject, { exclude: [...] })): values in exclude are not |
| #3960 | faker | Add a `casing?: 'lower' |
| #3961 | faker | Add an optional { depth, root } to directoryPath: when depth is omitted, behavior is unchanged (a |
| #3962 | faker | Add an optional { excludeEmoji?: boolean } to person.bio: when true, the generated bio is stripped of |
| #3963 | faker | Allow the value of each entry to be a () => T function; when the entry is selected, the function is |
| #2449 | cobra | Add GenMarkdownTreeCustomE(cmd, dir, filePrepender, linkHandler, cmdHandler): identical to |
| #3964 | faker | Add an optional { useAbbreviated?: boolean } to location.street: when true, common USPS style street |
| #3965 | faker | Add an optional `{ weighting?: 'female' |
| #3966 | faker | Add an optional { sexType?: SexType }: when omitted, behavior is unchanged (uniform arrayElement). |
| #1922 | es-toolkit | Add isTreeData(value, { childrenKey? |
| #1923 | es-toolkit | Add an optional { map?: boolean } (default false, unchanged behavior): when true, flattenObject returns a |
| #1924 | es-toolkit | Add groupByMap, keyByMap, countByMap: Map returning variants whose keys can be of any type (including |
| #1925 | es-toolkit | Add medianBigint(nums: bigint[]): bigint: the middle value for odd length arrays; for even length, the |
| #2450 | cobra | Add ReparseFlags(args): resets the command's local and persistent flags to their default values (each |
| #2451 | cobra | Add ResetInitializers() (package level): clears the registered initializers (initializers = nil). |
| #2452 | cobra | Add a PostParseFlagsE func(cmd, args) error field on Command, invoked in execute() right after |
| #2453 | cobra | cobra's HelpFunc returns an inline closure (the default help renderer); the default is not separately |
| #3967 | faker | Add an optional { allowOnlyExamples?: boolean }: when true, returns .example.<com |
| #2454 | cobra | Add SetArgErrorFunc(f func(*Command, error) error) + ArgErrorFunc() (with parent inheritance + a default |
| #5029 | react-native-paper | Add Autocomplete text input with filtered dropdown, custom filter predicate, empty state, disabled state, and public type exports |
| #5030 | react-native-paper | Add Material 3 NavigationRail with controlled active destination, indicator pill, label visibility modes, alignment, and header slot |
| #5031 | react-native-paper | Extend Tooltip with a rich mode: optional heading, multi line supporting text, two action buttons, and persistent dismiss behaviour |
| #5032 | react-native-paper | Add static determinate circular progress indicator with configurable size, stroke, colors, and accessibility value |
| #5033 | react-native-paper | Add Material 3 slider with clamped bounds, step snapping, accessibility value, disabled dimming, and theme colors |
| #5034 | react-native-paper | Add Material 3 Tabs with primary and secondary variants, active indicator, badges, disabled tabs, and scrollable layout |
| #5035 | react-native-paper | Add Material 3 calendar date picker with month navigation, full six week grid, min and max disabling, and accessibility labels |
| #5036 | react-native-paper | Add Material 3 time picker with hour and minute steppers, AM/PM toggle for 12 hour mode, wrap around, and optional minute step |
| #4252 | date-fns | Add a style option to formatDuration with long, narrow, and short unit label styles plus a per unit formatter map, keeping default output unchanged |
| #1166 | codex-lb | Add GPT-5.6 Responses Lite support — preserve additional_tools input items + reconstruct the x-openai-internal-codex-responses-lite header when forwarding |
| #4 | pi-makora-provider | Fix: strip tool_calls from assistant messages for GLM models to prevent ZAI/vLLM 400 crash |
| #57 | rn-qr-generator | Barcode scanner enhancement via retry with inset and zoom |
| #1599 | react-native-share | Add base64 image support under linkMetadata for iOS custom sharing icon |
| #113 | octofriend | Add @ file autocomplete suggestions |
| #7 | streamvault | Make Comet streams work in StreamVault — pad base64 config encoding + parse Comet's real metadata fields (filename, videoSize, bingeGroup) instead of Torrentio's shape |



