Monday, October 12, 2026

Introducing Personal AI Harness

A self-hosted personal agent platform with pluggable LLMs, real tools, Docker sandboxes, a secrets vault, reusable Skills and scheduled Agents. It all runs on your own machine.


 

Most AI chat apps stop at conversation. You ask, the model answers, and you go and do the work. I wanted something that could do the work: search the web, read and edit files, call APIs, check my email, run code, and keep doing that on a schedule while I'm away. I also wanted it to run on my hardware, with my choice of model, and without my API keys ending up in a prompt.

That project is PersonalAI. This post covers what it does and how it's built.

Friday, September 25, 2026

Analyzing Frontier Model Progress with My Favourite Game: Prince of Persia (Apple II, 1989) by Jordan Mechner

I first played Prince of Persia in 1995 on an IBM PC XT. I still go back to it from time to time: the rotoscoped animation, the way the prince hangs from a ledge, the clank of a gate slamming shut. Thirty years later it still feels like nothing else.

In 2012 Jordan Mechner published the original Apple II 6502 assembly source, recovered from 3.5" floppy disks that had sat in a box for over 20 years (the restoration itself is quite a story): github.com/jmechner/Prince-of-Persia-Apple-II

C# is my favourite language, so I set myself an experiment. I would hand that source to an AI model and ask it to port the game to C#. I wouldn't read the code or edit it myself. My only job was to play the result and say what was wrong. Every new frontier model that came out got the same project, with nothing but prompts.

Source is in https://github.com/priyanr/PrinceOfPersia_C-Sharp_Port_By_AI

 Here's how it went.

Monday, March 24, 2014

Reading L3G4200D Gyro sensor via I2C using Stellaris launchPad – PART 1

I got a stellaris LM4F120 launchPad hanging around for sometime. I haven’t done much with that other than trying FreeRTOS on it. Recently I got a cheap L3G4200D from ebay. I read the raw values(XYZ axis angular rate) from it via I2C using the stellaris.

I haven’t yet figured out how to convert it to real angles. In second part I will create a 3D WPF app to display a 3D axis view.

Sensor module i got from ebay have L3G4200D,ADXL345,HMC5883L,BMP085 sensors and its cheap.


Sensor modules I2C SCL & SDA pins are connected to  GPIO pins 6 & 7 ie, PA6 (I2C1SCL), PA7(I2C1SDA) of stellaris 
Value is send to the PC using UART0 which is  connected to the stellaris virtual port which will appear on PC.

Checkout the code in github

Here is the screenshot of raw values received in PC



Links

User manual

Stellaris LM4F120 LaunchPad Evaluation Board Software

Getting Started with the Stellaris EK-LM4F120XL LaunchPad Workshop (Videos & Articles)

Creating a new project 

Blinking LED

Some other tutorials 

Stellaris Launchpad for Beginners http://codeforfree.weebly.com/stellaris.html


Some code I referred



Online Stores to purchase Texas Instruments products

https://estore.ti.com/

http://in.element14.com/texas-instruments

Tuesday, October 9, 2012

AmazonGlacierGUI - A GUI Client for Amazon Glacier


I have created a tool for Amazon glacier ,
checkout

http://amazonglaciergui.codeplex.com/

Its a WPF MVVM application in C#

Amazon glacier pricing information is confusing , a pricing calacultor is available at
https://github.com/brandt/amazon-glacier-calc


Tuesday, November 22, 2011

Google reader notes JSON To Delicious Export Tool

I was heavily using google reader notes for the past 2-3 years , as they stopped note in reader service I moved to delicious, I am happy with it, but i have tons of bookmark in google reader notes, I want them exported to delicious, luckily google reader settings page has an option to export notes to JSON format,

I created a tool to export this JSON to delicious.


Goto http://grnotestodelicious.codeplex.com/ for the tool & source code

Tuesday, May 4, 2010

A generic excel file Importer / Reader - Converting Excel rows into Strongly typed entity

Its my blog post after a long time ,
Its simply a class it can be used to map Excel columns to an entity fields by adding an attribute to the property

Eg: An excel file with two columns Name and Phone Number
Our Entity is

public class ExcelItem
{
[ExcelColumnIndex(Index=0)]
public string Name {get;set;}
[ExcelColumnIndex(Index=1)]
public string Phone {get;set;}
}
To get List <ExcelItem> containg the excel rows, simply
Importer<ExcelItem> _Importer = new Importer<ExcelItem>();
List<ExcelItem> data=_Importer.ParseExcel("FILE PATH", "sheet1");


ExcelImporter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.OleDb;
namespace ExcelImporter
{
//3-may-2010 Priyan R
public class Importer where T : new()
{
public List ParseExcel(string filePath,string sheetName)
{
string tempFile, connectionString, query;
OleDbConnection con = null;
OleDbDataReader reader = null;
OleDbCommand command = null;
//
connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
filePath + @";Extended Properties=""Excel 8.0;HDR=YES;""";
query = "SELECT * FROM [" + sheetName + "$]";
//
var ret = new List();
try
{
con = new OleDbConnection(connectionString);
con.Open();
command = new OleDbCommand(query, con);
reader = command.ExecuteReader();
while (reader.Read())
{
var entry = new T();
foreach (var property in entry.GetType().GetProperties())
{
var attributes = property.GetCustomAttributes(false);
var attribute = property.GetCustomAttributes(false)
.Where(p => p.GetType() == typeof(ExcelColumnIndex)).FirstOrDefault(); ;
if (attribute != null)
{
property.SetValue(entry, reader[((ExcelColumnIndex)attribute).Index].ToString(), null);
}
}
ret.Add(entry);
}


}
catch
{
throw;
}
finally
{
if (con != null && con.State == System.Data.ConnectionState.Open)
{
con.Close();
}
}
return ret;
}
}
public class ExcelColumnIndex : Attribute
{
public int Index { get; set; }
}
}



Download sample application


Friday, November 27, 2009

ASP.NET Validation Controls - Conditionally validating

Using the server side Page.Validate() and Client Side Page_ClientValidate() , we can validate a group of controls conditionally. For eg. i just need to validate some fields only when a checkbox is checked. Both Page.Validate() and Page_ClientValidate() allows to pass a validation group , So we group a set of controls with a validation group and calls this validation functions in both client & server side only on the required validation condition

Server Side



protected void btnSubmit_Click(object sender, EventArgs e)
{
if(cbValidate.Checked)
{
//validate
Validate("vgSubmit");
}
if (!IsValid) return;
lblMsg.Text = "Passed validation";
}



ClientSide


function CheckValidation() {
var cbValidate = document.getElementById('<%=cbValidate.ClientID %>');
var flag = true;
if (cbValidate.checked) {
if (!Page_ClientValidate("vgSubmit"))
flag = false;
}
else {
Page_ClientValidate("vgDummy")
}
return flag;

}



Download Code