Changes in version 0.3.0 (2026-07-21) - New TGA module: - read_tga_txt(): defensive plain-text reader for raw TGA exports (temperature, time, weight columns), following the same readLines()/strsplit() approach as read_ftir_txt()/read_xrd_txt(). - tga_normalize(): rescale a raw mass column (e.g. mg) to percent of initial mass. - tga_dtg(): smoothed derivative thermogravimetric (DTG) curve via stats::smooth.spline(), rather than a raw finite difference of noisy instrument data. - find_dtg_peaks(): automatic local-maxima peak picking on a DTG curve with a prominence filter, mirroring find_ftir_peaks(). - tga_decomposition_reference() / assign_dtg_peaks(): reference table of typical lignocellulosic decomposition temperature ranges (moisture, hemicellulose, cellulose, lignin) and a matcher for observed DTG peaks, mirroring ftir_band_reference() / assign_ftir_peaks(). - tga_stages(): reads moisture/volatile-matter/ash percentages directly off a TGA curve at three temperature breakpoints and hands them to the existing proximate_analysis() for fixed-carbon-by- difference, so a TGA-derived proximate analysis gets the same 100%-sum check as a gravimetric one. - tga_stages_batch(): tga_stages() applied per sample ID across a long-format multi-sample data frame, mirroring fit_isotherm_batch() / fit_kinetics_batch(). - tga_kinetics_kissinger(): non-isothermal single-step kinetics (activation energy and pre-exponential factor) from DTG peak temperatures at several heating rates, following Kissinger (1957) doi:10.1021/ac60131a045. Returns a plain lm-backed fit object, so fit_confint() works on it directly like any other fit in this package. - plot_tga(): base-graphics dual-axis TG/DTG plot, usable with the existing save_tiff() for 600 dpi export. Changes in version 0.2.0 (2026-07-21) - New isotherm models: fit_temkin(), fit_dr() (Dubinin-Radushkevich, with mean free energy E), fit_sips(). - New kinetics models: fit_elovich(), fit_intraparticle() (Weber-Morris). - Thermodynamics: fit_vant_hoff() computes deltaH, deltaS, and deltaG from equilibrium distribution coefficients across temperatures. - fit_confint(): confidence intervals for any isotherm/kinetics/van't Hoff fit from this package, with an automatic fallback to a Wald interval if profiling fails. - Batch fitting: fit_isotherm_batch() and fit_kinetics_batch() fit a model separately per group (e.g. per sample ID), skipping groups that fail to converge with a warning instead of aborting the whole batch. - FTIR: baseline_correct() (linear or rolling-minimum baseline) and find_ftir_peaks() (automatic local-maxima peak picking with a prominence filter). - XRD: xrd_deconvolve(), a simplified simultaneous multi-Gaussian peak fit that also returns a crystallinity index. - bet_surface_area(): multi-point BET surface area from gas adsorption data. - Proximate/ultimate analysis: pct_mass_change(), proximate_analysis() (fixed carbon by difference), ultimate_ratios() (H/C, O/C, N/C atomic ratios for Van Krevelen analysis). - New vignette, vignette("biocharkit-intro"), walking through a full synthetic-data analysis using every function in the package. - Bugfix: find_ftir_peaks() incorrectly rejected a local maximum that fell exactly between two grid points (a common case when a peak center doesn't align with the sampling interval), due to requiring a strictly unique maximum within the search window. Tied/plateau maxima are now correctly collapsed to a single peak at their midpoint. Changes in version 0.1.0 - Initial release. - Sample ID parsing: parse_sbc_id(). - Data import: read_ftir_txt(), read_xrd_txt(). - Adsorption: qe_batch(), removal_efficiency(). - Isotherms: fit_langmuir(), fit_freundlich() (nonlinear with linearised fallback). - Kinetics: fit_pfo(), fit_pso(). - FTIR: ftir_band_reference(), assign_ftir_peaks(), functional_group_density(). - XRD: xrd_crystallinity_index(). - Statistics: correlation_matrix(). - Plotting: plot_isotherm(), plot_kinetics(), plot_ftir_spectrum(), save_tiff(). - Synthetic example dataset sbc_example for demonstration and testing.