Add optional onAppend callback